# HG changeset patch # User Calin Crisan ccrisan@gmail.com # Date 1185441184 -10800 # Node ID e17e009b3d9b13839fa044f7d12f8b44b56af42a # Parent 85ffec632924e93dae26d9e9623e50f7f07e272d Finally removed the old cdaudio plugin diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/Makefile --- a/src/cdaudio/Makefile Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -include ../../mk/rules.mk -include ../../mk/init.mk - -OBJECTIVE_LIBS = libcdaudio$(SHARED_SUFFIX) - -LIBADD = $(GTK_LIBS) $(GLIB_LIBS) $(PANGO_LIBS) -LIBDIR = $(plugindir)/$(INPUT_PLUGIN_DIR) - -SOURCES = cdaudio.c cddb.c cdinfo.c configure.c http.c - -OBJECTS = ${SOURCES:.c=.o} - -CFLAGS += $(PICFLAGS) $(GTK_CFLAGS) $(GLIB_CFLAGS) $(PANGO_CFLAGS) -I../../intl -I../.. -I../.. - -include ../../mk/objective.mk diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cdaudio.c --- a/src/cdaudio/cdaudio.c Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1342 +0,0 @@ -/* XMMS - Cross-platform multimedia player - * Copyright (C) 1998-2003 Peter Alm, Mikael Alm, Olle Hallnas, - * Thomas Nilsson and 4Front Technologies - * Copyright (C) 1999-2003 Haavard Kvaalen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "cdaudio.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include "audacious/output.h" - -#ifdef CDROMSTOP -# define XMMS_STOP CDROMSTOP -#elif defined CDIOCSTOP -# define XMMS_STOP CDIOCSTOP -#else -# error "No stop ioctl" -#endif - -#ifdef CDIOCPAUSE -# define XMMS_PAUSE CDIOCPAUSE -#elif defined CDROMPAUSE -# define XMMS_PAUSE CDROMPAUSE -#else -# error "No pause ioctl" -#endif - -#ifdef CDIOCRESUME -# define XMMS_RESUME CDIOCRESUME -#elif defined CDROMRESUME -# define XMMS_RESUME CDROMRESUME -#else -# error "No resume ioctl" -#endif - -/* - * Distributions should not patch this, but instead use the - * --with-cdda-device=path and --with-cdda-dir=path configure options. - */ - -#ifndef CDDA_DEVICE -# ifdef HAVE_SYS_CDIO_H -# if defined(__FreeBSD__) && !defined(CDIOCREADAUDIO) -# define CDDA_DEVICE "/dev/acd0c" -# elif defined __FreeBSD__ -# define CDDA_DEVICE "/dev/acd0" -# elif defined __OpenBSD__ || defined __NetBSD__ -# define CDDA_DEVICE "/dev/cd0c" -# else -# define CDDA_DEVICE "/vol/dev/aliases/cdrom0" -# endif -# else -# define CDDA_DEVICE "/dev/cdrom" -# endif -#endif - -#ifndef CDDA_DIRECTORY -# ifdef HAVE_SYS_CDIO_H -# ifdef __FreeBSD__ -# define CDDA_DIRECTORY "/cdrom" -# elif defined __OpenBSD__ || defined __NetBSD__ -# define CDDA_DIRECTORY "/cdrom" -# else -# define CDDA_DIRECTORY "/cdrom/cdrom0" -# endif -# else -# define CDDA_DIRECTORY "/mnt/cdrom" -# endif -#endif - - - - -static TitleInput *cdda_get_tuple(cdda_disc_toc_t * toc, int track); -static gchar *get_song_title(TitleInput *tuple); -static gboolean stop_timeout(gpointer data); - -static void cdda_init(void); -static int is_our_file(char *filename); -static GList *scan_dir(char *dir); -static void play_file(InputPlayback *playback); -static void stop(InputPlayback *playback); -static void cdda_pause(InputPlayback *playback, short p); -static void seek(InputPlayback *playback, int time); -static int get_time(InputPlayback *playback); -static void get_song_info(char *filename, char **title, int *length); -static TitleInput *get_song_tuple(char *filename); -static gint get_volume(int *l, int *r); -static gint set_volume(int l, int r); -static void cleanup(void); -void cdda_fileinfo(char *filename); - -InputPlugin cdda_ip = { - NULL, - NULL, - "CD Audio Plugin", /* Description */ - cdda_init, - NULL, /* about */ - cdda_configure, - is_our_file, - scan_dir, - play_file, - stop, - cdda_pause, - seek, - NULL, /* set_eq */ - get_time, - get_volume, - set_volume, - cleanup, - NULL, /* obsolete */ - NULL, /* add_vis_pcm */ - NULL, /* set_info, filled in by xmms */ - NULL, /* set_info_text, filled in by xmms */ - get_song_info, - NULL, /* cdda_fileinfo, *//* file_info_box */ - NULL, /* output plugin handle */ - get_song_tuple -}; - -InputPlugin *cdda_iplist[] = { &cdda_ip, NULL }; - -DECLARE_PLUGIN(cdda, NULL, NULL, cdda_iplist, NULL, NULL, NULL, NULL); - -CDDAConfig cdda_cfg; - -static struct { - struct driveinfo drive; - cdda_disc_toc_t cd_toc; - int track; - int fd; - gboolean playing; -} cdda_playing; - -static struct { - GThread *thread; - gboolean audio_error, eof; - int seek; - -} dae_data; - -static gboolean is_paused; -static int pause_time; - -struct timeout { - int id; - char *device; -}; - -static GList *timeout_list; - -/* Time to delay stop command in 1/10 second */ -#define STOP_DELAY 20 - -#ifdef BEEP_CDROM_SOLARIS -/* - * Lowlevel cdrom access, Solaris style (Solaris, Linux) - */ - -static void -play_ioctl(struct cdda_msf *start, struct cdda_msf *end) -{ - struct cdrom_msf msf; - - msf.cdmsf_min0 = start->minute; - msf.cdmsf_sec0 = start->second; - msf.cdmsf_frame0 = start->frame; - msf.cdmsf_min1 = end->minute; - msf.cdmsf_sec1 = end->second; - msf.cdmsf_frame1 = end->frame; - ioctl(cdda_playing.fd, CDROMPLAYMSF, &msf); -} - -static int -get_current_frame(void) -{ - struct cdrom_subchnl subchnl; - - subchnl.cdsc_format = CDROM_MSF; - if (ioctl(cdda_playing.fd, CDROMSUBCHNL, &subchnl) < 0) - return -1; - - switch (subchnl.cdsc_audiostatus) { - case CDROM_AUDIO_COMPLETED: - case CDROM_AUDIO_ERROR: - return -1; - } - - return (LBA(subchnl.cdsc_absaddr.msf)); -} - -#if !defined(CDROMVOLREAD) -static int volume_left = 100, volume_right = 100; -#endif - -static void -drive_get_volume(int *l, int *r) -{ -#if defined(CDROMVOLREAD) - struct cdrom_volctrl vol; - - if (cdda_playing.fd != -1 && !ioctl(cdda_playing.fd, CDROMVOLREAD, &vol)) { - *l = (100 * vol.channel0) / 255; - *r = (100 * vol.channel1) / 255; - } -#if 0 - else if (cdda_playing.fd != -1) - g_message("CDROMVOLREAD failed"); -#endif -#else - *l = volume_left; - *r = volume_right; -#endif -} - -static void -drive_set_volume(int l, int r) -{ - struct cdrom_volctrl vol; - - if (cdda_playing.fd != -1) { - vol.channel0 = vol.channel2 = (l * 255) / 100; - vol.channel1 = vol.channel3 = (r * 255) / 100; - ioctl(cdda_playing.fd, CDROMVOLCTRL, &vol); - } -#if !defined(CDROMVOLREAD) - volume_left = l; - volume_right = r; -#endif -} - -#ifdef CDROMREADAUDIO -int -read_audio_data(int fd, int pos, int num, void *buf) -{ - struct cdrom_read_audio cdra; - -#if 1 - cdra.addr.lba = pos - CDDA_MSF_OFFSET; - cdra.addr_format = CDROM_LBA; -#else - cdra.addr.msf.minute = pos / (60 * 75); - cdra.addr.msf.second = (pos / 75) % 60; - cdra.addr.msf.frame = pos % 75; - cdra.addr_format = CDROM_MSF; -#endif - - cdra.nframes = num; - cdra.buf = buf; - - if (ioctl(fd, CDROMREADAUDIO, &cdra) < 0) - return -errno; - - return cdra.nframes; -} -#endif /* CDROMREADAUDIO */ - -#if defined(CDROMCDDA) -int -read_audio_data(int fd, int pos, int num, void *buf) -{ - struct cdrom_cdda cdra; - - cdra.cdda_addr = pos - CDDA_MSF_OFFSET; - cdra.cdda_length = num; - cdra.cdda_data = buf; - cdra.cdda_subcode = CDROM_DA_NO_SUBCODE; - if (ioctl(fd, CDROMCDDA, &cdra) < 0) - return -errno; - - return cdra.cdda_length; -} -#endif - -static gboolean -cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info) -{ - struct cdrom_tochdr tochdr; - struct cdrom_tocentry tocentry; - int i; - - - - if (ioctl(fd, CDROMREADTOCHDR, &tochdr)) - return FALSE; - - for (i = tochdr.cdth_trk0; i <= tochdr.cdth_trk1; i++) { - tocentry.cdte_format = CDROM_MSF; - tocentry.cdte_track = i; - if (ioctl(fd, CDROMREADTOCENTRY, &tocentry)) - return FALSE; - info->track[i].minute = tocentry.cdte_addr.msf.minute; - info->track[i].second = tocentry.cdte_addr.msf.second; - info->track[i].frame = tocentry.cdte_addr.msf.frame; - info->track[i].flags.data_track = - tocentry.cdte_ctrl == CDROM_DATA_TRACK; - - } - - /* Get the leadout track */ - tocentry.cdte_track = CDROM_LEADOUT; - tocentry.cdte_format = CDROM_MSF; - - if (ioctl(fd, CDROMREADTOCENTRY, &tocentry)) - return FALSE; - info->leadout.minute = tocentry.cdte_addr.msf.minute; - info->leadout.second = tocentry.cdte_addr.msf.second; - info->leadout.frame = tocentry.cdte_addr.msf.frame; - - info->first_track = tochdr.cdth_trk0; - info->last_track = tochdr.cdth_trk1; - - return TRUE; -} - -#endif - -#ifdef BEEP_CDROM_BSD -/* - * Lowlevel cdrom access, BSD style (FreeBSD, OpenBSD, NetBSD, Darwin) - */ - -static void -play_ioctl(struct cdda_msf *start, struct cdda_msf *end) -{ - struct ioc_play_msf msf; - - msf.start_m = start->minute; - msf.start_s = start->second; - msf.start_f = start->frame; - msf.end_m = end->minute; - msf.end_s = end->second; - msf.end_f = end->frame; - ioctl(cdda_playing.fd, CDIOCPLAYMSF, &msf); -} - -static int -get_current_frame(void) -{ - struct ioc_read_subchannel subchnl; - struct cd_sub_channel_info subinfo; - subchnl.address_format = CD_MSF_FORMAT; - subchnl.data_format = CD_CURRENT_POSITION; - subchnl.track = 0; - subchnl.data_len = sizeof(subinfo); - subchnl.data = &subinfo; - if (ioctl(cdda_playing.fd, CDIOCREADSUBCHANNEL, &subchnl) < 0) - return -1; - -#ifdef BEEP_CDROM_BSD_DARWIN - return ((subchnl.data->what.position.absaddr[1] * 60 - subchnl.data->what.position.absaddr[2]) * 75 + - subchnl.data->what.position.absaddr[3]); -#else - return (LBA(subchnl.data->what.position.absaddr.msf)); -#endif -} - -static void -drive_get_volume(int *l, int *r) -{ - struct ioc_vol vol; - - if (cdda_playing.fd != -1) { - ioctl(cdda_playing.fd, CDIOCGETVOL, &vol); - *l = (100 * vol.vol[0]) / 255; - *r = (100 * vol.vol[1]) / 255; - } -} - -static void -drive_set_volume(int l, int r) -{ - struct ioc_vol vol; - - if (cdda_playing.fd != -1) { - vol.vol[0] = vol.vol[2] = (l * 255) / 100; - vol.vol[1] = vol.vol[3] = (r * 255) / 100; - ioctl(cdda_playing.fd, CDIOCSETVOL, &vol); - } -} - -#if defined(__FreeBSD__) && !defined(CDIOCREADAUDIO) -int -read_audio_data(int fd, int pos, int num, void *buf) -{ - int bs = CD_FRAMESIZE_RAW; - - if (ioctl(fd, CDRIOCSETBLOCKSIZE, &bs) == -1) - return -1; - if (pread(fd, buf, num * bs, (pos - 150) * bs) != num * bs) - return -1; - - return num; -} -#endif - -#if defined(CDIOCREADAUDIO) -int -read_audio_data(int fd, int pos, int num, void *buf) -{ - struct ioc_read_audio cdra; - - cdra.address.lba = pos - CDDA_MSF_OFFSET; - cdra.address_format = CD_LBA_FORMAT; - cdra.nframes = num; - cdra.buffer = buf; - - if (ioctl(fd, CDIOCREADAUDIO, &cdra) < 0) - return -errno; - - return cdra.nframes; -} -#endif /* CDIOCREADAUDIO */ - -#ifdef BEEP_CDROM_BSD_NETBSD /* NetBSD, OpenBSD */ - -static gboolean -cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info) -{ - struct ioc_toc_header tochdr; - struct ioc_read_toc_entry tocentry; - struct cd_toc_entry tocentrydata; - int i; - - if (ioctl(fd, CDIOREADTOCHEADER, &tochdr)) - return FALSE; - - for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.starting_track = i; - tocentry.data = &tocentrydata; - tocentry.data_len = sizeof(tocentrydata); - if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry)) - return FALSE; - info->track[i].minute = tocentry.data->addr.msf.minute; - info->track[i].second = tocentry.data->addr.msf.second; - info->track[i].frame = tocentry.data->addr.msf.frame; - info->track[i].flags.data_track = (tocentry.data->control & 4) == 4; - } - - /* Get the leadout track */ - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.starting_track = 0xAA; - tocentry.data = &tocentrydata; - tocentry.data_len = sizeof(tocentrydata); - if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry)) - return FALSE; - info->leadout.minute = tocentry.data->addr.msf.minute; - info->leadout.second = tocentry.data->addr.msf.second; - info->leadout.frame = tocentry.data->addr.msf.frame; - - info->first_track = tochdr.starting_track; - info->last_track = tochdr.ending_track; - - return TRUE; -} - -#elif defined(BEEP_CDROM_BSD_DARWIN) - -static gboolean -cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info) -{ - struct ioc_toc_header tochdr; - struct ioc_read_toc_entry tocentry; - int i; - - if (ioctl(fd, CDIOREADTOCHEADER, &tochdr)) - return FALSE; - - for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.starting_track = i; - if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry)) - return FALSE; - info->track[i].minute = tocentry.data->addr[1]; - info->track[i].second = tocentry.data->addr[2]; - info->track[i].frame = tocentry.data->addr[3]; - info->track[i].flags.data_track = (tocentry.data->control & 4) == 4; - } - - /* Get the leadout track */ - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.starting_track = 0xAA; - if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry)) - return FALSE; - info->leadout.minute = tocentry.data->addr[1]; - info->leadout.second = tocentry.data->addr[2]; - info->leadout.frame = tocentry.data->addr[3]; - - return TRUE; -} - -#else /* FreeBSD */ - -static gboolean -cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info) -{ - struct ioc_toc_header tochdr; - struct ioc_read_toc_single_entry tocentry; - int i; - - if (ioctl(fd, CDIOREADTOCHEADER, &tochdr)) - return FALSE; - - for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.track = i; - if (ioctl(fd, CDIOREADTOCENTRY, &tocentry)) - return FALSE; - info->track[i].minute = tocentry.entry.addr.msf.minute; - info->track[i].second = tocentry.entry.addr.msf.second; - info->track[i].frame = tocentry.entry.addr.msf.frame; - info->track[i].flags.data_track = (tocentry.entry.control & 4) == 4; - } - - /* Get the leadout track */ - tocentry.address_format = CD_MSF_FORMAT; - - tocentry.track = 0xAA; - if (ioctl(fd, CDIOREADTOCENTRY, &tocentry)) - return FALSE; - info->leadout.minute = tocentry.entry.addr.msf.minute; - info->leadout.second = tocentry.entry.addr.msf.second; - info->leadout.frame = tocentry.entry.addr.msf.frame; - - info->first_track = tochdr.starting_track; - info->last_track = tochdr.ending_track; - - return TRUE; -} -#endif - -#endif - - - - - - - - - - - -extern gboolean -is_mounted(const char *device_name) -{ -#if defined(HAVE_MNTENT_H) || defined(HAVE_GETMNTINFO) - char devname[256]; - struct stat st; -#if defined(HAVE_MNTENT_H) - FILE *mounts; - struct mntent *mnt; -#elif defined(HAVE_GETMNTINFO) -#if defined __NetBSD__ && HAVE_STATVFS - struct statvfs *fsp; -#else - struct statfs *fsp; -#endif - int entries; -#endif - - if (lstat(device_name, &st) < 0) - return -1; - - if (S_ISLNK(st.st_mode)) - readlink(device_name, devname, 256); - else - strncpy(devname, device_name, 256); - -#if defined(HAVE_MNTENT_H) - if ((mounts = setmntent(MOUNTED, "r")) == NULL) - return TRUE; - - while ((mnt = getmntent(mounts)) != NULL) { - if (strcmp(mnt->mnt_fsname, devname) == 0) { - endmntent(mounts); - return TRUE; - } - } - endmntent(mounts); -#elif defined(HAVE_GETMNTINFO) - entries = getmntinfo(&fsp, MNT_NOWAIT); - if (entries < 0) - return FALSE; - - while (entries-- > 0) { - if (!strcmp(fsp->f_mntfromname, devname)) - return TRUE; - fsp++; - } -#endif -#endif - return FALSE; -} - - -gboolean -cdda_get_toc(cdda_disc_toc_t * info, const char *device) -{ - gboolean retv = FALSE; - int fd; - - if (is_mounted(device)) - return FALSE; - - if ((fd = open(device, CDOPENFLAGS)) == -1) - return FALSE; - - memset(info, 0, sizeof(cdda_disc_toc_t)); - - retv = cdda_get_toc_lowlevel(fd, info); - close(fd); - - return retv; -} - -static void -cdda_init(void) -{ - ConfigDb *db; - struct driveinfo *drive = g_malloc0(sizeof(struct driveinfo)); - int ndrives = 1, i; - - cdda_playing.fd = -1; - memset(&cdda_cfg, 0, sizeof(CDDAConfig)); - -#ifdef HAVE_OSS - drive->mixer = CDDA_MIXER_OSS; - drive->oss_mixer = SOUND_MIXER_CD; -#endif - - db = bmp_cfg_db_open(); - - /* These names are used for backwards compatibility */ - bmp_cfg_db_get_string(db, "CDDA", "device", &drive->device); - bmp_cfg_db_get_string(db, "CDDA", "directory", &drive->directory); - bmp_cfg_db_get_int(db, "CDDA", "mixer", &drive->mixer); - if (bmp_cfg_db_get_int(db, "CDDA", "readmode", &drive->dae)==FALSE) - drive->dae = 1; /* default to digital */ - - if (!drive->device) - drive->device = g_strdup(CDDA_DEVICE); - if (!drive->directory) - drive->directory = g_strdup(CDDA_DIRECTORY); - - cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive); - - bmp_cfg_db_get_int(db, "CDDA", "num_drives", &ndrives); - for (i = 1; i < ndrives; i++) { - char label[20]; - drive = g_malloc0(sizeof(struct driveinfo)); - - sprintf(label, "device%d", i); - bmp_cfg_db_get_string(db, "CDDA", label, &drive->device); - - sprintf(label, "directory%d", i); - bmp_cfg_db_get_string(db, "CDDA", label, &drive->directory); - - sprintf(label, "mixer%d", i); - bmp_cfg_db_get_int(db, "CDDA", label, &drive->mixer); - - sprintf(label, "readmode%d", i); - bmp_cfg_db_get_int(db, "CDDA", label, &drive->dae); - - cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive); - } - bmp_cfg_db_get_bool(db, "CDDA", "title_override", - &cdda_cfg.title_override); - bmp_cfg_db_get_string(db, "CDDA", "name_format", &cdda_cfg.name_format); - bmp_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdda_cfg.use_cddb); - bmp_cfg_db_get_string(db, "CDDA", "cddb_server", &cdda_cfg.cddb_server); - bmp_cfg_db_close(db); - - if (!cdda_cfg.cddb_server) - cdda_cfg.cddb_server = g_strdup(CDDB_DEFAULT_SERVER); - if (!cdda_cfg.name_format) - cdda_cfg.name_format = g_strdup("%p - %t"); -} - -struct driveinfo * -cdda_find_drive(char *filename) -{ - GList *node; - - // FIXME: Will always return the first drive - - for (node = cdda_cfg.drives; node; node = node->next) { - struct driveinfo *d = node->data; - if (!strncmp(d->directory, filename, strlen(d->directory))) - return d; - } - - return NULL; - -} - -static void -timeout_destroy(struct timeout *entry) -{ - g_free(entry->device); - g_free(entry); - timeout_list = g_list_remove(timeout_list, entry); -} - -static void -timeout_remove_for_device(char *device) -{ - GList *node; - - for (node = timeout_list; node; node = node->next) { - struct timeout *t = node->data; - - if (!strcmp(t->device, device)) { - gtk_timeout_remove(t->id); - timeout_destroy(t); - return; - } - } - -} - -static void -cleanup(void) -{ - GList *node; - struct driveinfo *drive; - - if (cdda_cfg.drives) { - for (node = g_list_first(cdda_cfg.drives); node; node = node->next) { - drive = (struct driveinfo *)node->data; - if (!drive) - continue; - - if (drive->device) - free(drive->device); - - if (drive->directory) - free(drive->directory); - - free(drive); - } - - g_list_free(cdda_cfg.drives); - cdda_cfg.drives = NULL; - } - - if (cdda_cfg.name_format) { - free(cdda_cfg.name_format); - cdda_cfg.name_format = NULL; - } - - if (cdda_cfg.cddb_server) { - free(cdda_cfg.cddb_server); - cdda_cfg.cddb_server = NULL; - } - - while (timeout_list) { - struct timeout *t = timeout_list->data; - gtk_timeout_remove(t->id); - stop_timeout(t); - timeout_destroy(t); - } - cddb_quit(); -} - -static int -is_our_file(char *filename) -{ - char *ext = ".cda"; - - if (cdda_find_drive(filename) == NULL) { - return FALSE; - } - - if (g_str_has_suffix(filename, ext)) { - return TRUE; - } - return FALSE; -} - - -static GList * -scan_dir(char *dir) -{ - GList *list = NULL; - int i; - cdda_disc_toc_t toc; - struct driveinfo *drive; - - if ((drive = cdda_find_drive(dir)) == NULL) - return NULL; - - if (!cdda_get_toc(&toc, drive->device)) - return NULL; - - for (i = toc.last_track; i >= toc.first_track; i--) - if (!toc.track[i].flags.data_track) { - list = g_list_prepend(list, g_strdup_printf("Track %02d.cda", i)); - } - return list; -} - -guint -cdda_calculate_track_length(cdda_disc_toc_t * toc, int track) -{ - if (track == toc->last_track) - return (LBA(toc->leadout) - LBA(toc->track[track])); - else - return (LBA(toc->track[track + 1]) - LBA(toc->track[track])); -} - -static void * -dae_play_loop(void *data) -{ - InputPlayback *playback = data; - char *buffer = g_malloc(CD_FRAMESIZE_RAW * CDDA_DAE_FRAMES); - int pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]); - int end, frames; - - if (cdda_playing.track == cdda_playing.cd_toc.last_track) - end = LBA(cdda_playing.cd_toc.leadout); - else - end = LBA(cdda_playing.cd_toc.track[cdda_playing.track + 1]); - - while (cdda_playing.playing) { - int left; - char *data; - - if (dae_data.seek != -1) { - playback->output->flush(dae_data.seek * 1000); - pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]) - + dae_data.seek * 75; - dae_data.seek = -1; - dae_data.eof = FALSE; - } - frames = MIN(CDDA_DAE_FRAMES, end - pos); - if (frames == 0) - dae_data.eof = TRUE; - - if (dae_data.eof) { - xmms_usleep(30000); - continue; - } - - frames = read_audio_data(cdda_playing.fd, pos, frames, buffer); - if (frames <= 0) { - int err = -frames; - if (err == EOPNOTSUPP) - dae_data.eof = TRUE; - else { - /* - * If the read failed, skip ahead to - * avoid getting stuck on scratches - * and such. - */ - g_message("read_audio_data() failed: %s (%d)", - strerror(err), err); - pos += MIN(CDDA_DAE_FRAMES, end - pos); - } - continue; - } - left = frames * CD_FRAMESIZE_RAW; - data = buffer; - while (cdda_playing.playing && left > 0 && dae_data.seek == -1) { - int cur = MIN(512 * 2 * 2, left); - cdda_ip.add_vis_pcm(playback->output->written_time(), - FMT_S16_LE, 2, cur, data); - while (playback->output->buffer_free() < cur && - cdda_playing.playing && dae_data.seek == -1) - xmms_usleep(30000); - if (cdda_playing.playing && dae_data.seek == -1) - produce_audio(playback->output->written_time(), FMT_S16_LE, 2, cur, data, &cdda_playing.playing); - left -= cur; - data += cur; - } - pos += frames; - } - - playback->output->buffer_free(); - playback->output->buffer_free(); - g_free(buffer); - - g_thread_exit(NULL); - return NULL; -} - -static void -dae_play(InputPlayback *playback) -{ - if (playback->output->open_audio(FMT_S16_LE, 44100, 2) == 0) { - dae_data.audio_error = TRUE; - cdda_playing.playing = FALSE; - return; - } - dae_data.seek = -1; - dae_data.eof = FALSE; - dae_data.audio_error = FALSE; - dae_data.thread = g_thread_create(dae_play_loop, playback, TRUE, NULL); -} - -static void -play_file(InputPlayback *playback) -{ - char *filename = playback->filename; - char *tmp; - struct driveinfo *drive; - int track; - int track_len; - -// g_message(g_strdup_printf("** CD_AUDIO: trying to play file %s",filename)); - - if ((drive = cdda_find_drive(filename)) == NULL) { -// g_message("** CD_AUDIO: find drive check failed"); - return; - } - if (is_mounted(drive->device)) { -// g_message("** CD_AUDIO: drive is mounted"); - return; - } - tmp = strrchr(filename, '/'); - if (tmp) - tmp++; - else - tmp = filename; - - if (!sscanf(tmp, "Track %d.cda", &track)) { -// g_message("** CD_AUDIO: filename check failed"); - return; - } - - if (!cdda_get_toc(&cdda_playing.cd_toc, drive->device) || - cdda_playing.cd_toc.track[track].flags.data_track || - track < cdda_playing.cd_toc.first_track || - track > cdda_playing.cd_toc.last_track) { -// g_message("** CD_AUDIO: toc check failed"); - return; - } - - if ((cdda_playing.fd = open(drive->device, CDOPENFLAGS)) == -1) { -// g_message("** CD_AUDIO: device open failed"); - return; - } - track_len = cdda_calculate_track_length(&cdda_playing.cd_toc, track); - cdda_ip.set_info(get_song_title(cdda_get_tuple(&cdda_playing.cd_toc, track)), - (track_len * 1000) / 75, 44100 * 2 * 2 * 8, 44100, 2); - - memcpy(&cdda_playing.drive, drive, sizeof(struct driveinfo)); -#ifndef CDDA_HAS_READAUDIO - cdda_playing.drive.dae = FALSE; -#endif - - cdda_playing.track = track; - - is_paused = FALSE; - timeout_remove_for_device(drive->device); - - cdda_playing.playing = TRUE; - if (drive->dae) - dae_play(playback); - else - seek(playback, 0); - return; -} - -static TitleInput * -cdda_get_tuple(cdda_disc_toc_t * toc, int track) -{ - G_LOCK_DEFINE_STATIC(tuple); - - static guint32 cached_id; - static cdinfo_t cdinfo; - static gchar *performer, *album_name, *track_name; - TitleInput *tuple = NULL; - guint32 disc_id; - - disc_id = cdda_cddb_compute_discid(toc); - - /* - * We want to avoid looking up a album from two threads simultaneously. - * This can happen since we are called both from the main-thread and - * from the playlist-thread. - */ - - G_LOCK(tuple); - if (!(disc_id == cached_id && cdinfo.is_valid)) { - /* - * We try to look up the disc again if the info is not - * valid. The user might have configured a new server - * in the meantime. - */ - cdda_cdinfo_flush(&cdinfo); - cached_id = disc_id; - - if (!cdda_cdinfo_read_file(disc_id, &cdinfo)) { - if (cdda_cfg.use_cddb) - cdda_cddb_get_info(toc, &cdinfo); - if (cdinfo.is_valid) - cdda_cdinfo_write_file(disc_id, &cdinfo); - } - } - - tuple = bmp_title_input_new(); - cdda_cdinfo_get(&cdinfo, track, &performer, &album_name, &track_name); - G_UNLOCK(tuple); - - tuple->performer = g_strdup(performer); - tuple->album_name = g_strdup(album_name); - tuple->track_name = g_strdup(track_name); - tuple->track_number = (track); - tuple->file_name = g_strdup(tuple->file_path); - tuple->file_path = g_strdup_printf(_("CD Audio Track %02u"), track); - tuple->file_ext = "cda"; - tuple->length = ((cdda_calculate_track_length(toc, track) * 1000) / 75); - - if (!tuple->track_name) - tuple->track_name = g_strdup_printf(_("CD Audio Track %02u"), track); - - tuple->genre = g_strdup(cdinfo.genre); - tuple->year = cdinfo.year; - - return tuple; -} - -static gchar * -get_song_title(TitleInput *tuple) -{ - return xmms_get_titlestring(cdda_cfg.title_override ? - cdda_cfg.name_format : - xmms_get_gentitle_format(), tuple); -} - -static gboolean -stop_timeout(gpointer data) -{ - int fd; - struct timeout *to = data; - - fd = open(to->device, CDOPENFLAGS); - if (fd != -1) { - ioctl(fd, XMMS_STOP, 0); - close(fd); - } - timeout_destroy(to); - return FALSE; -} - -static void -stop(InputPlayback * playback) -{ - struct timeout *to_info; - if (cdda_playing.fd < 0) - return; - - cdda_playing.playing = FALSE; - - if (cdda_playing.drive.dae) { - g_thread_join(dae_data.thread); - playback->output->close_audio(); - } - else - ioctl(cdda_playing.fd, XMMS_PAUSE, 0); - - close(cdda_playing.fd); - cdda_playing.fd = -1; - - if (!cdda_playing.drive.dae) { - to_info = g_malloc(sizeof(*to_info)); - to_info->device = g_strdup(cdda_playing.drive.device); - to_info->id = gtk_timeout_add(STOP_DELAY * 100, stop_timeout, - to_info); - timeout_list = g_list_prepend(timeout_list, to_info); - } -} - -static void -cdda_pause(InputPlayback *playback, short p) -{ - if (cdda_playing.drive.dae) { - playback->output->pause(p); - return; - } - if (p) { - pause_time = get_time(playback); - ioctl(cdda_playing.fd, XMMS_PAUSE, 0); - } - else { - ioctl(cdda_playing.fd, XMMS_RESUME, 0); - pause_time = -1; - } - is_paused = p; -} - - - -static void -seek(InputPlayback *data, int time) -{ - struct cdda_msf *end, start; - int track = cdda_playing.track; - -// g_message("** CD_AUDIO: seeking..."); - if (cdda_playing.drive.dae) { - dae_data.seek = time; - while (dae_data.seek != -1) - xmms_usleep(20000); - return; - } - - start.minute = (cdda_playing.cd_toc.track[track].minute * 60 + - cdda_playing.cd_toc.track[track].second + time) / 60; - start.second = (cdda_playing.cd_toc.track[track].second + time) % 60; - start.frame = cdda_playing.cd_toc.track[track].frame; - if (track == cdda_playing.cd_toc.last_track) - end = &cdda_playing.cd_toc.leadout; - else - end = &cdda_playing.cd_toc.track[track + 1]; - - play_ioctl(&start, end); - - if (is_paused) { - cdda_pause(data, TRUE); - pause_time = time * 1000; - } -} - -static int -get_time_analog(void) -{ - int frame, start_frame, length; - int track = cdda_playing.track; - - if (is_paused && pause_time != -1) - return pause_time; - - frame = get_current_frame(); - - if (frame == -1) - return -1; - - start_frame = LBA(cdda_playing.cd_toc.track[track]); - length = cdda_calculate_track_length(&cdda_playing.cd_toc, track); - - if (frame - start_frame >= length - 20) /* 20 seems to work better */ - return -1; - - return ((frame - start_frame) * 1000) / 75; -} - -static int -get_time_dae(InputPlayback *playback) -{ - if (dae_data.audio_error) - return -2; - if (!cdda_playing.playing || - (dae_data.eof && !playback->output->buffer_playing())) - return -1; - return playback->output->output_time(); -} - -static int -get_time(InputPlayback *playback) -{ - if (cdda_playing.fd == -1) - return -1; - - if (cdda_playing.drive.dae) - return get_time_dae(playback); - else - return get_time_analog(); -} - -static void -get_song_info(char *filename, char **title, int *len) -{ - cdda_disc_toc_t toc; - int t; - char *tmp; - struct driveinfo *drive; - TitleInput *tuple; - - *title = NULL; - *len = -1; - -// g_message("** CD_AUDIO: getting song info"); - - if ((drive = cdda_find_drive(filename)) == NULL) - return; - - tmp = strrchr(filename, '/'); - if (tmp) - tmp++; - else - tmp = filename; - - if (!sscanf(tmp, "Track %d.cda", &t)) - return; - if (!cdda_get_toc(&toc, drive->device)) - return; - if (t < toc.first_track || t > toc.last_track - || toc.track[t].flags.data_track) - return; - - if ((tuple = cdda_get_tuple(&toc, t)) != NULL) { - *len = tuple->length; - *title = get_song_title(tuple); - } - bmp_title_input_free(tuple); -} - -static TitleInput * -get_song_tuple(char *filename) -{ - cdda_disc_toc_t toc; - int t; - char *tmp; - struct driveinfo *drive; - TitleInput *tuple = NULL; - -// g_message("** CD_AUDIO: getting song info"); - - if ((drive = cdda_find_drive(filename)) == NULL) - return tuple; - - tmp = strrchr(filename, '/'); - if (tmp) - tmp++; - else - tmp = filename; - - if (!sscanf(tmp, "Track %d.cda", &t)) - return tuple; - if (!cdda_get_toc(&toc, drive->device)) - return tuple; - if (t < toc.first_track || t > toc.last_track - || toc.track[t].flags.data_track) - return tuple; - - tuple = cdda_get_tuple(&toc, t); - return tuple; -} - -#ifdef HAVE_OSS -static void -oss_get_volume(int *l, int *r, int mixer_line) -{ - int fd, v; - - fd = open(DEV_MIXER, O_RDONLY); - if (fd != -1) { - ioctl(fd, MIXER_READ(mixer_line), &v); - *r = (v & 0xFF00) >> 8; - *l = (v & 0x00FF); - close(fd); - } -} - -static void -oss_set_volume(int l, int r, int mixer_line) -{ - int fd, v; - - fd = open(DEV_MIXER, O_RDONLY); - if (fd != -1) { - v = (r << 8) | l; - ioctl(fd, MIXER_WRITE(mixer_line), &v); - close(fd); - } -} -#else -static void -oss_get_volume(int *l, int *r, int mixer_line) -{ -} -static void -oss_set_volume(int l, int r, int mixer_line) -{ -} -#endif - - -static gint -get_volume(int *l, int *r) -{ - if (cdda_playing.drive.dae) - return 0; - else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS) - oss_get_volume(l, r, cdda_playing.drive.oss_mixer); - else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE) - drive_get_volume(l, r); - return 1; -} - -static gint -set_volume(int l, int r) -{ - if (cdda_playing.drive.dae) - return 0; - else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS) - oss_set_volume(l, r, cdda_playing.drive.oss_mixer); - else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE) - drive_set_volume(l, r); - return 1; -} diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cdaudio.h --- a/src/cdaudio/cdaudio.h Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/* XMMS - Cross-platform multimedia player - * Copyright (C) 1998-2002 Peter Alm, Mikael Alm, Olle Hallnas, - * Thomas Nilsson and 4Front Technologies - * Copyright (C) 1999-2002 Haavard Kvaalen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -#ifndef CDAUDIO_H -#define CDAUDIO_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include "audacious/plugin.h" - -#include "cdinfo.h" - -#ifdef HAVE_OSS -#ifdef HAVE_SYS_SOUNDCARD_H -#include -#else -#include -#endif -#endif - -#ifdef HAVE_MNTENT_H -#include -#endif - -#ifdef HAVE_GETMNTINFO -#include -#include -#include -#endif - -#ifndef CD_FRAMES -#define CD_FRAMES 75 -#endif - -#include - -#ifdef HAVE_LINUX_CDROM_H -#include -#elif defined HAVE_SYS_CDIO_H -#include -#ifdef HAVE_SYS_CDRIO_H -#include -#endif -#endif - -#if defined(CDROMREADAUDIO) || defined(CDIOCREADAUDIO) || defined(CDROMCDDA) || defined(CDRIOCSETBLOCKSIZE) -# define CDDA_HAS_READAUDIO -#endif - -#ifndef CD_FRAMESIZE_RAW -# define CD_FRAMESIZE_RAW 2352 -#endif - -/* Number of frames that are read at once in dae mode */ -#define CDDA_DAE_FRAMES 8 - -#ifndef CDDA_HAS_READAUDIO -#warning "Digital audio extraction has not been ported to this platform" -#define read_audio_data(fd, pos, num, buf) -1 -#else -int read_audio_data(int fd, int pos, int num, void *buf); -#endif - - -#ifdef __FreeBSD__ -/* - * FreeBSD won't be able to detect media changes if using O_NONBLOCK - */ -#define CDOPENFLAGS O_RDONLY -#else -#define CDOPENFLAGS (O_RDONLY | O_NONBLOCK) -#endif - - -#define CDDB_DEFAULT_SERVER "freedb.freedb.org" - -struct driveinfo { - gchar *device, *directory; - gint mixer, oss_mixer; - gboolean valid; - gint dae; -}; - -typedef struct { - GList *drives; - - gchar *cddb_server; - gint cddb_protocol_level; - gboolean use_cddb; - - gboolean title_override; - char *name_format; -} CDDAConfig; - -struct cdda_msf { - guint8 minute; - guint8 second; - guint8 frame; - struct { - guint data_track:1; - } flags; -}; - -/* - * Note: This macro will convert to a LBA representation of the MSF - * address, not to a true LBA address, as we don't subtract the offset - */ -#define LBA(msf) ((msf.minute * 60 + msf.second) * 75 + msf.frame) - -#define CDDA_MSF_OFFSET 150 - -typedef struct { - guint8 first_track, last_track; - struct cdda_msf leadout; - struct cdda_msf track[100]; -} cdda_disc_toc_t; - -extern CDDAConfig cdda_cfg; - -enum { - CDDA_MIXER_NONE, - CDDA_MIXER_DRIVE, - CDDA_MIXER_OSS, -}; - -enum { - CDDA_READ_ANALOG, - CDDA_READ_DAE, -}; - -void cdda_configure(void); -gboolean cdda_get_toc(cdda_disc_toc_t * info, const gchar *device); -guint32 cdda_cddb_compute_discid(cdda_disc_toc_t * info); -void cdda_cddb_get_info(cdda_disc_toc_t * toc, cdinfo_t * info); -struct driveinfo *cdda_find_drive(gchar *filename); - -void cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data); -void cdda_cddb_set_server(const gchar *new_server); -void cddb_quit(void); - -#endif diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cddb.c --- a/src/cdaudio/cddb.c Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,956 +0,0 @@ -/* - * cddb.c Copyright 1999-2001 Håvard Kvålen - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - -#include "cddb.h" - -#include -#include -#include -#include - -#include - -#include "http.h" -#include "cdaudio.h" -#include "cdinfo.h" - - -static guint32 cached_id = 0; -static GtkWidget *server_dialog, *server_clist; -static GtkWidget *debug_window, *debug_clist; -static GList *debug_messages = NULL; -static GList *temp_messages = NULL; -static guint cddb_timeout_id; - -G_LOCK_DEFINE_STATIC(list); - -void configure_set_cddb_server(gchar * server); - -static void -cddb_log(gchar * str, ...) -{ - static GList *end_ptr = NULL; - static gint message_num = 0; - va_list args; - gchar *text; - - va_start(args, str); - text = g_strdup_vprintf(str, args); - va_end(args); - - message_num++; - debug_messages = g_list_prepend(debug_messages, text); - if (!end_ptr) - end_ptr = debug_messages; - if (message_num > CDDB_LOG_MAX) { - GList *temp; - - temp = g_list_previous(end_ptr); - temp->next = NULL; - g_free(end_ptr->data); - g_list_free_1(end_ptr); - end_ptr = temp; - message_num--; - } - if (debug_window) { - G_LOCK(list); - temp_messages = g_list_append(temp_messages, g_strdup(text)); - G_UNLOCK(list); - } -} - -static gint -cddb_sum(gint in) -{ - gint retval = 0; - - while (in > 0) { - retval += in % 10; - in /= 10; - } - return retval; -} - -guint32 -cdda_cddb_compute_discid(cdda_disc_toc_t * info) -{ - gint i; - guint high = 0, low; - - for (i = info->first_track; i <= info->last_track; i++) - high += cddb_sum(info->track[i].minute * 60 + info->track[i].second); - - low = (info->leadout.minute * 60 + info->leadout.second) - - (info->track[info->first_track].minute * 60 + - info->track[info->first_track].second); - - return ((high % 0xff) << 24 | low << 8 | (info->last_track - - info->first_track + 1)); -} - -static gchar * -cddb_generate_offset_string(cdda_disc_toc_t * info) -{ - gchar *buffer; - gchar offset[8]; - int i; - - buffer = g_malloc(info->last_track * 7 + 1); - - sprintf(buffer, "%d", LBA(info->track[info->first_track])); - - for (i = info->first_track + 1; i <= info->last_track; i++) { - sprintf(offset, "+%d", LBA(info->track[i])); - strcat(buffer, offset); - } - - return buffer; -} - -static gchar * -cddb_generate_hello_string(void) -{ - static gchar *buffer; - - if (buffer == NULL) { - gchar *env, *client = NULL, *version = NULL, **strs = NULL; - - env = getenv("XMMS_CDDB_CLIENT_NAME"); - if (env) { - strs = g_strsplit(env, " ", 2); - if (strs && strs[0] && strs[1]) { - client = strs[0]; - version = strs[1]; - } - } - - if (!client || !version) { - client = PACKAGE_NAME; - version = PACKAGE_VERSION; - } - - buffer = g_strdup_printf("&hello=nobody+localhost+%s+%s", - client, version); - if (strs) - g_strfreev(strs); - } - return buffer; -} - -static gint -cddb_http_open_connection(const gchar * server, gint port) -{ - gint sock; - gchar *status; - - if ((sock = http_open_connection(server, 80)) == 0) - status = "Failed"; - else - status = "Ok"; - - cddb_log("Connecting to CDDB-server %s: %s", server, status); - return sock; -} - - -static gboolean -cddb_query(gchar * server, cdda_disc_toc_t * info, - cddb_disc_header_t * cddb_info) -{ - /* - * Query the cddb-server for the cd. - * Returns the *real* discid and category. - */ - - gint sock; - gchar *offsets, *getstr; - gchar buffer[256]; - gchar **response; - gint i; - gint ret; - - if ((sock = cddb_http_open_connection(server, 80)) == 0) - return FALSE; - - offsets = cddb_generate_offset_string(info); - - cddb_log("Sending query-command. Disc ID: %08x", - cdda_cddb_compute_discid(info)); - - getstr = - g_strdup_printf - ("GET /~cddb/cddb.cgi?cmd=cddb+query+%08x+%d+%s+%d%s&proto=%d HTTP/1.0\r\n\r\n", - cdda_cddb_compute_discid(info), - info->last_track - info->first_track + 1, offsets, - (info->leadout.minute * 60 + info->leadout.second), - cddb_generate_hello_string(), cdda_cfg.cddb_protocol_level); - cddb_log(getstr); - - g_free(offsets); - ret = write(sock, getstr, strlen(getstr)); - - if(ret != strlen(getstr)){ - g_free(getstr); - http_close_connection(sock); - return FALSE; - } - - g_free(getstr); - - if (http_read_first_line(sock, buffer, 256) < 0) { - http_close_connection(sock); - return FALSE; - } - - response = g_strsplit(buffer, " ", 4); - - cddb_log("Query response: %s", buffer); - - switch (strtol(response[0], NULL, 10)) { - case 200: - /* One exact match */ - for (i = 0; i < 4; i++) { - if (response[i] == NULL) { - g_strfreev(response); - return FALSE; - } - } - cddb_info->category = g_strdup(response[1]); - cddb_info->discid = strtoul(response[2], NULL, 16); - break; - case 210: - case 211: - /* multiple matches - use first match */ - g_strfreev(response); - if (http_read_first_line(sock, buffer, 256) < 0) { - http_close_connection(sock); - return FALSE; - } - response = g_strsplit(buffer, " ", 4); - for (i = 0; i < 4; i++) { - if (response[i] == NULL) { - g_strfreev(response); - return FALSE; - } - } - cddb_info->category = g_strdup(response[0]); - cddb_info->discid = strtoul(response[1], NULL, 16); - break; - default: /* FIXME: Handle other 2xx */ - g_strfreev(response); - return FALSE; - } - http_close_connection(sock); - - g_strfreev(response); - return TRUE; -} - -static gint -cddb_check_protocol_level(const gchar * server) -{ - gint level = 0, sock, n, ret; - gchar *str, buffer[256]; - - if ((sock = cddb_http_open_connection(server, 80)) == 0) - return 0; - - str = - g_strdup_printf - ("GET /~cddb/cddb.cgi?cmd=stat%s&proto=1 HTTP/1.0\r\n\r\n", - cddb_generate_hello_string()); - - ret = write(sock, str, strlen(str)); - if(ret != strlen(str)){ - g_free(str); - http_close_connection(sock); - return 0; - } - - - g_free(str); - - if ((n = http_read_first_line(sock, buffer, 256)) < 0 || - atoi(buffer) != 210) { - if (n > 0) - cddb_log("Getting cddb protocol level failed: %s", buffer); - else - cddb_log("Getting cddb protocol level failed."); - - http_close_connection(sock); - return 0; - } - - while (http_read_line(sock, buffer, 256) >= 0) { - g_strstrip(buffer); - if (!strncmp(buffer, "max proto:", 10)) - level = atoi(buffer + 10); - if (!strcmp(buffer, ".")) - break; - } - http_close_connection(sock); - cddb_log("Getting cddb protocol level. Got level %d", level); - return (MIN(level, CDDB_MAX_PROTOCOL_LEVEL)); -} - -#define BUF2SIZE (80*3) - -static gboolean -cddb_read(gchar * server, cddb_disc_header_t * cddb_info, cdinfo_t * cdinfo) -{ - gint sock; - gchar *readstr; - gchar buffer[256]; /* http line buffer */ - gchar *discid = NULL, *dartist = NULL, *dtitle = NULL, - *dyear = NULL, *dgenre = NULL, *ttitle = NULL; - gchar *realstr, *temp; - gint len, command; - gint num, oldnum; - gint ret; - - if ((sock = cddb_http_open_connection(server, 80)) == 0) - return FALSE; - - cddb_log("Sending read-command. Disc ID: %08x. Category: %s", - cddb_info->discid, cddb_info->category); - - readstr = - g_strdup_printf - ("GET /~cddb/cddb.cgi?cmd=cddb+read+%s+%08x%s&proto=%d HTTP/1.0\r\n\r\n", - cddb_info->category, cddb_info->discid, - cddb_generate_hello_string(), cdda_cfg.cddb_protocol_level); - cddb_log(readstr); - - ret = write(sock, readstr, strlen(readstr)); - if(ret != strlen(readstr)){ - g_free(readstr); - http_close_connection(sock); - return FALSE; - } - - g_free(readstr); - - if (http_read_first_line(sock, buffer, 256) < 0) { - http_close_connection(sock); - return FALSE; - } - - cddb_log("Read response: %s", buffer); - - command = 1; - oldnum = -1; - do { - realstr = strchr(buffer, '='); - if (buffer[0] == '#' || !realstr) - continue; - - realstr++; - len = strlen(realstr); - - switch (command) { - case 1: - if (!strncmp(buffer, "DISCID", 6)) { - discid = g_strdup(realstr); - break; - } - command++; - case 2: - if (!strncmp(buffer, "DTITLE", 6)) { - if((temp = strstr(buffer, " / ")) != NULL) { - dtitle = g_strdup(temp+3); - dartist = g_strndup(realstr, temp - realstr); - } - else { - dtitle = g_strdup(realstr); - } - break; - } - command++; - case 3: - if (!strncmp(buffer, "DYEAR", 5)) { - dyear = g_strdup(realstr); - break; - } - command++; - case 4: - if (!strncmp(buffer, "DGENRE", 6)) { - dgenre = g_strdup(realstr); - break; - } - - // we have obtained all necessary data to set discinfo - cdda_cdinfo_cd_set(cdinfo, dtitle, dartist, discid, dgenre, dyear); - - command++; - case 5: - if (!strncmp(buffer, "TTITLE", 6)) { - num = atoi(buffer + 6); - if (oldnum < 0 || num == oldnum) { - ttitle = g_strdup(realstr); - } - else { - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - ttitle = g_strdup(realstr); - } - oldnum = num; - break; - } - if (oldnum >= 0) - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - - oldnum = -1; - command++; - case 6: - if (!strncmp(buffer, "EXTD", 4)) { - break; - } - command++; - case 7: - if (!strncmp(buffer, "EXTT", 4)) { - break; - } - command++; - case 8: - if (!strncmp(buffer, "PLAYORDER", 9)) { - break; - } - command++; - default: - g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", - PACKAGE_NAME, buffer); - break; - } - - } while (http_read_line(sock, buffer, 256) >= 0); - - if (oldnum >= 0) - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - - http_close_connection(sock); - return TRUE; -} - -static gint -cddb_get_protocol_level(void) -{ - if (cdda_cfg.cddb_protocol_level < 1) - cdda_cfg.cddb_protocol_level = - cddb_check_protocol_level(cdda_cfg.cddb_server); - - return cdda_cfg.cddb_protocol_level; -} - -static GList * -cddb_get_server_list(const gchar * server, gint protocol_level) -{ - gint sock; - gchar *getstr; - gchar buffer[256]; - gchar **message; - GList *list = NULL; - gint ret; - - if ((sock = cddb_http_open_connection(server, 80)) == 0) - return NULL; - - cddb_log("Sending sites-command"); - - getstr = - g_strdup_printf - ("GET /~cddb/cddb.cgi?cmd=sites%s&proto=%d HTTP/1.0\r\n\r\n", - cddb_generate_hello_string(), protocol_level); - cddb_log(getstr); - - ret = write(sock, getstr, strlen(getstr)); - if(ret != strlen(getstr)){ - g_free(getstr); - http_close_connection(sock); - return NULL; - } - g_free(getstr); - - if (http_read_first_line(sock, buffer, 256) < 0) { - http_close_connection(sock); - return NULL; - } - - cddb_log("Sites response: %s", buffer); - - switch (atoi(buffer)) { - case 210: - while ((http_read_line(sock, buffer, 256)) > 1) { - message = g_strsplit(buffer, " ", 6); - if (message && message[0] && message[1] && - !strcasecmp(message[1], "http")) { - list = g_list_prepend(list, message); - } - else { - /* Ignore non-http servers */ - g_strfreev(message); - } - } - list = g_list_reverse(list); - break; - case 401: - /* No site information available */ - break; - default: - break; - } - http_close_connection(sock); - return list; -} - -gint -search_for_discid(gchar * abs_filename, gchar ** cddb_file, guint32 disc_id) -{ - GDir *dir; - const gchar *dir_entry; - gchar tmp_id[10]; - - if (!(dir = g_dir_open(abs_filename, 0, NULL))) - return (0); - - memset(tmp_id, 0, 10); - - snprintf(tmp_id, sizeof(tmp_id), "%08x", disc_id); - while ((dir_entry = g_dir_read_name(dir))) { - if (!strncmp(tmp_id, dir_entry, 8)) { - cddb_file[0] = g_build_filename(abs_filename, dir_entry, NULL); - g_dir_close(dir); - return (1); - } - } - g_dir_close(dir); - - return (0); -} - -gint -scan_cddb_dir(gchar * server, gchar ** cddb_file, guint32 disc_id) -{ - - GDir *dir; - const gchar *dir_entry; - gchar abs_filename[FILENAME_MAX]; - - if (!(dir = g_dir_open(&server[7], 0, NULL))) { - return 0; - } - - while ((dir_entry = g_dir_read_name(dir))) { - strcpy(abs_filename, &server[7]); - if (abs_filename[strlen(abs_filename) - 1] != '/') { - strcat(abs_filename, "/"); - } - strcat(abs_filename, dir_entry); - - if (dir_entry[0] != '.' && - g_file_test(abs_filename, G_FILE_TEST_IS_DIR) && - search_for_discid(abs_filename, cddb_file, disc_id)) { - break; - } - } - - g_dir_close(dir); - return (cddb_file[0] != NULL); -} - -gint -cddb_read_file(gchar * file, cddb_disc_header_t * cddb_info, - cdinfo_t * cdinfo) -{ - FILE *fd; - gchar buffer[256]; - gchar *realstr, *temp; - gchar *discid = NULL, *dartist = NULL, *dtitle = NULL, - *dyear = NULL, *dgenre = NULL, *ttitle = NULL; - gint len, command; - gint num, oldnum; - - if ((fd = fopen(file, "r")) == NULL) - return 0; - - command = 1; - oldnum = -1; - while (fgets(buffer, 256, fd) != NULL) { - realstr = strchr(buffer, '='); - if (buffer[0] == '#' || !realstr) - continue; - - realstr++; - len = strlen(realstr); - if (realstr[len - 1] == '\n') - realstr[--len] = '\0'; /* remove newline */ - - switch (command) { - case 1: - if (!strncmp(buffer, "DISCID", 6)) { - discid = g_strdup(realstr); - break; - } - command++; - case 2: - if (!strncmp(buffer, "DTITLE", 6)) { - if((temp = strstr(buffer, " / ")) != NULL) { - dtitle = g_strdup(temp+3); - dartist = g_strndup(realstr, temp - realstr); - } - else { - dtitle = g_strdup(realstr); - } - break; - } - command++; - case 3: - if (!strncmp(buffer, "DYEAR", 5)) { - dyear = g_strdup(realstr); - break; - } - command++; - case 4: - if (!strncmp(buffer, "DGENRE", 6)) { - dgenre = g_strdup(realstr); - break; - } - - // we have obtained all necessary data to set discinfo - cdda_cdinfo_cd_set(cdinfo, dtitle, dartist, discid, dgenre, dyear); - - command++; - case 5: - if (!strncmp(buffer, "TTITLE", 6)) { - num = atoi(buffer + 6); - if (oldnum < 0 || num == oldnum) { - ttitle = g_strdup(realstr); - } - else { - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - ttitle = g_strdup(realstr); - } - oldnum = num; - break; - } - if (oldnum >= 0) - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - - oldnum = -1; - command++; - case 6: - if (!strncmp(buffer, "EXTD", 4)) { - break; - } - command++; - case 7: - if (!strncmp(buffer, "EXTT", 4)) { - break; - } - command++; - case 8: - if (!strncmp(buffer, "PLAYORDER", 9)) { - break; - } - command++; - default: - g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s", - PACKAGE_NAME, buffer); - break; - } - - } - - if (oldnum >= 0) - cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, ttitle); - - fclose(fd); - return (1); -} - - -void -cdda_cddb_get_info(cdda_disc_toc_t * toc, cdinfo_t * cdinfo) -{ - guint32 disc_id; - cddb_disc_header_t cddb_disc_info; - gchar *cddb_file[1]; - disc_id = cdda_cddb_compute_discid(toc); - cddb_file[0] = NULL; - - if ((cached_id != disc_id) - && (strncmp(cdda_cfg.cddb_server, "file://", 7) != 0)) { - if (cddb_get_protocol_level() == 0) - return; - - cached_id = disc_id; - if (!cddb_query(cdda_cfg.cddb_server, toc, &cddb_disc_info)) - return; - if (!cddb_read(cdda_cfg.cddb_server, &cddb_disc_info, cdinfo)) - return; - cdinfo->is_valid = TRUE; - - } - else if ((cached_id != disc_id) - && (strncmp(cdda_cfg.cddb_server, "file://", 7) == 0)) { - cached_id = disc_id; - if (!scan_cddb_dir(cdda_cfg.cddb_server, cddb_file, disc_id)) - return; - if (!cddb_read_file(cddb_file[0], &cddb_disc_info, cdinfo)) { - g_free(cddb_file[0]); - return; - } - cdinfo->is_valid = TRUE; - g_free(cddb_file[0]); - } -} - -void -cdda_cddb_set_server(const gchar * new_server) -{ - if (strcmp(cdda_cfg.cddb_server, new_server)) { - g_free(cdda_cfg.cddb_server); - cdda_cfg.cddb_server = g_strdup(new_server); - cdda_cfg.cddb_protocol_level = 0; - cached_id = 0; - } -} - - -static gchar * -cddb_position_string(gchar * input) -{ - gchar deg[4], min[3]; - if (input == NULL || strlen(input) < 7) - return g_strdup(""); - strncpy(deg, input + 1, 3); - deg[3] = '\0'; - strncpy(min, input + 5, 2); - min[2] = '\0'; - return g_strdup_printf("%2d°%s'%c", atoi(deg), min, input[0]); -} - -static void -cddb_server_dialog_ok_cb(GtkWidget * w, gpointer data) -{ - gchar *text; - gint pos; - GtkEntry *entry = GTK_ENTRY(data); - - if (!GTK_CLIST(server_clist)->selection) - return; - pos = GPOINTER_TO_INT(GTK_CLIST(server_clist)->selection->data); - gtk_clist_get_text(GTK_CLIST(server_clist), pos, 0, &text); - cdda_cddb_set_server(text); - gtk_entry_set_text(entry, text); - gtk_widget_destroy(server_dialog); -} - -static void -cddb_server_dialog_select(GtkWidget * w, gint row, gint column, - GdkEvent * event, gpointer data) -{ - if (event->type == GDK_2BUTTON_PRESS) - cddb_server_dialog_ok_cb(NULL, NULL); -} - -void -cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data) -{ - GtkWidget *vbox, *bbox, *okbutton, *cancelbutton; - GtkEntry *server_entry = GTK_ENTRY(data); - gchar *titles[] = { "Server", "Latitude", "Longitude", "Description" }; - GList *servers; - const gchar *server; - gint level; - - if (server_dialog) - return; - - server = gtk_entry_get_text(server_entry); - - if ((level = cddb_check_protocol_level(server)) < 3) { - if (!level) - xmms_show_message("CDDB", - "Unable to connect to CDDB-server", - "Ok", FALSE, NULL, NULL); - else - /* CDDB level < 3 has the "sites" command, - but the format is different. Not supported yet */ - xmms_show_message("CDDB", - "Can't get server list from the current CDDB-server\n" - "Unsupported CDDB protocol level", - "Ok", FALSE, NULL, NULL); - return; - } - - if ((servers = cddb_get_server_list(server, level)) == NULL) { - xmms_show_message("CDDB", - "No site information available", - "Ok", FALSE, NULL, NULL); - return; - } - - server_dialog = gtk_dialog_new(); - g_signal_connect(G_OBJECT(server_dialog), "destroy", - G_CALLBACK(gtk_widget_destroyed), &server_dialog); - gtk_window_set_title(GTK_WINDOW(server_dialog), "CDDB servers"); - gtk_window_set_modal(GTK_WINDOW(server_dialog), TRUE); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 15); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(server_dialog)->vbox), vbox, - TRUE, TRUE, 0); - - server_clist = gtk_clist_new_with_titles(4, titles); - g_signal_connect(G_OBJECT(server_clist), "select-row", - G_CALLBACK(cddb_server_dialog_select), NULL); - gtk_box_pack_start(GTK_BOX(vbox), server_clist, TRUE, TRUE, 0); - - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(server_dialog)->action_area), - bbox, TRUE, TRUE, 0); - - okbutton = gtk_button_new_with_label("Ok"); - g_signal_connect(G_OBJECT(okbutton), "clicked", - G_CALLBACK(cddb_server_dialog_ok_cb), data); - gtk_box_pack_start(GTK_BOX(bbox), okbutton, TRUE, TRUE, 0); - cancelbutton = gtk_button_new_with_label("Cancel"); - g_signal_connect_swapped(G_OBJECT(cancelbutton), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(server_dialog)); - gtk_box_pack_start(GTK_BOX(bbox), cancelbutton, TRUE, TRUE, 0); - GTK_WIDGET_SET_FLAGS(okbutton, GTK_CAN_DEFAULT); - GTK_WIDGET_SET_FLAGS(cancelbutton, GTK_CAN_DEFAULT); - gtk_widget_grab_default(okbutton); - - while (servers) { - gchar *row[4]; - gint i; - - row[0] = g_strdup(((gchar **) servers->data)[0]); - row[1] = cddb_position_string(((gchar **) servers->data)[4]); - row[2] = cddb_position_string(((gchar **) servers->data)[5]); - row[3] = g_strdup(((gchar **) servers->data)[6]); - gtk_clist_append(GTK_CLIST(server_clist), row); - for (i = 0; i < 4; i++) - g_free(row[i]); - g_strfreev(servers->data); - servers = g_list_next(servers); - } - g_list_free(servers); - gtk_clist_columns_autosize(GTK_CLIST(server_clist)); - gtk_widget_show_all(server_dialog); -} - -static gboolean -cddb_update_log_window(gpointer data) -{ - if (!debug_window) { - cddb_timeout_id = 0; - return FALSE; - } - - G_LOCK(list); - if (temp_messages != NULL) { - GList *temp; - GDK_THREADS_ENTER(); - gtk_clist_freeze(GTK_CLIST(debug_clist)); - for (temp = temp_messages; temp; temp = temp->next) { - gchar *text = temp->data; - gtk_clist_append(GTK_CLIST(debug_clist), &text); - g_free(text); - } - gtk_clist_columns_autosize(GTK_CLIST(debug_clist)); - gtk_clist_thaw(GTK_CLIST(debug_clist)); - gtk_clist_moveto(GTK_CLIST(debug_clist), - GTK_CLIST(debug_clist)->rows - 1, -1, 0.5, 0); - GDK_THREADS_LEAVE(); - g_list_free(temp_messages); - temp_messages = NULL; - } - G_UNLOCK(list); - return TRUE; -} - - -void -cdda_cddb_show_network_window(GtkWidget * w, gpointer data) -{ - GtkWidget *vbox, *bbox, *close, *scroll_win; - GList *temp; - - if (debug_window) - return; - - debug_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(G_OBJECT(debug_window), "destroy", - G_CALLBACK(gtk_widget_destroyed), &debug_window); - gtk_window_set_title(GTK_WINDOW(debug_window), "CDDB networkdebug"); - gtk_window_set_resizable(GTK_WINDOW(debug_window), TRUE); - gtk_window_set_default_size(GTK_WINDOW(debug_window), 400, 150); - gtk_container_border_width(GTK_CONTAINER(debug_window), 10); - - vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(debug_window), vbox); - - scroll_win = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - debug_clist = gtk_clist_new(1); - gtk_container_add(GTK_CONTAINER(scroll_win), debug_clist); - gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0); - - temp = debug_messages; - while (temp) { - gtk_clist_prepend(GTK_CLIST(debug_clist), (gchar **) & temp->data); - temp = g_list_next(temp); - } - - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - - close = gtk_button_new_with_label("Close"); - g_signal_connect_swapped(G_OBJECT(close), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(debug_window)); - GTK_WIDGET_SET_FLAGS(close, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(bbox), close, TRUE, TRUE, 0); - gtk_widget_grab_default(close); - - gtk_clist_columns_autosize(GTK_CLIST(debug_clist)); - gtk_clist_set_button_actions(GTK_CLIST(debug_clist), 0, - GTK_BUTTON_IGNORED); - gtk_clist_moveto(GTK_CLIST(debug_clist), - GTK_CLIST(debug_clist)->rows - 1, -1, 0, 0); - - cddb_timeout_id = gtk_timeout_add(500, cddb_update_log_window, NULL); - gtk_widget_show_all(debug_window); -} - -void -cddb_quit(void) -{ - if (cddb_timeout_id) - gtk_timeout_remove(cddb_timeout_id); - cddb_timeout_id = 0; -} diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cddb.h --- a/src/cdaudio/cddb.h Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * cddb.h Copyright 1999 Håvard Kvålen - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - -#ifndef CDDB_H -#define CDDB_H - -#include - -typedef struct { - gchar *category; - guint32 discid; -} cddb_disc_header_t; - -#define CDDB_MAX_PROTOCOL_LEVEL 6 -#define CDDB_HOSTNAME_LEN 100 -#define CDDB_LOG_MAX 100 - -#endif diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cdinfo.c --- a/src/cdaudio/cdinfo.c Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/* - * cdinfo.c Copyright 1999 Espen Skoglund - * Copyright 1999 Håvard Kvålen - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "cdinfo.h" -#include "cdaudio.h" - -#include -#include -#include - -#include - - -/* - * Function cdda_cdinfo_flush (cdinfo) - * - * Free all information stored about the CD. - * - */ -void -cdda_cdinfo_flush(cdinfo_t * cdinfo) -{ - trackinfo_t *t; - gint i; - - if (cdinfo->albname) - g_free(cdinfo->albname); - if (cdinfo->artname) - g_free(cdinfo->artname); - - cdinfo->albname = cdinfo->artname = NULL; - - for (t = cdinfo->tracks, i = 0; i < 100; i++, t++) { - if (t->artist) - g_free(t->artist); - if (t->title) - g_free(t->title); - - t->artist = t->title = NULL; - t->num = -1; - } - cdinfo->is_valid = FALSE; -} - - -/* - * Function cdda_cdinfo_delete (cdinfo) - * - * Free the indicated `cdinfo' structure. - * - */ -void -cdda_cdinfo_delete(cdinfo_t * cdinfo) -{ - cdda_cdinfo_flush(cdinfo); - g_free(cdinfo); -} - - -/* - * Function cdda_cdinfo_new () - * - * Allocate a new `cdinfo' structure and return it. - * - */ -cdinfo_t * -cdda_cdinfo_new(void) -{ - cdinfo_t *ret; - ret = g_malloc0(sizeof(cdinfo_t)); - cdda_cdinfo_flush(ret); - - return ret; -} - - -/* - * Function cdda_cdinfo_track_set (cdinfo, num, artist, title) - * - * Set `artist', and `title' for a track `num'. If the CD is a - * singleartist disc, the `artist' on each track should be set to - * NULL. - * - */ -void -cdda_cdinfo_track_set(cdinfo_t * cdinfo, gint num, gchar * artist, - gchar * title) -{ - trackinfo_t *track = cdinfo->tracks + num; - - /* Check bounds */ - if (num < 1 || num >= 100) - return; - - track->artist = artist; - track->title = title; - track->num = num; - cdinfo->is_valid = TRUE; -} - - -/* - * Function cdda_cdinfo_cd_set (cdinfo, cdname, cdartist, discid, - * genre, year) - * - * Set name, artist, discid, genre and year for a cd. If CD is a - * multiartist disc, the `artist' should be set to NULL. - * - */ -void -cdda_cdinfo_cd_set(cdinfo_t * cdinfo, gchar * cdname, gchar * cdartist, - gchar * discid, gchar * genre, gchar *year) -{ - cdinfo->is_valid = TRUE; - cdinfo->albname = cdname; - cdinfo->artname = cdartist; - cdinfo->discid = discid ? atoi(discid) : 0; - cdinfo->genre = genre; - cdinfo->year = year ? atoi(year) : 0; -} - - -/* - * Function cdda_cdinfo_get (cdinfo, num, artist, album, title) - * - * Get artist, album, and title of the indicated track (i.e. store - * them in the specified pointers). Return 0 upon success, or -1 - * of track did not exist. The returned name must be subsequently - * freed using g_free(). - * - */ -gint -cdda_cdinfo_get(cdinfo_t * cdinfo, gint num, gchar ** artist, - gchar ** album, gchar ** title) -{ - trackinfo_t *track = cdinfo->tracks + num; - - /* Check validity */ - if (!cdinfo->is_valid || num < 1 || num >= 100) - return -1; - - *artist = track->artist ? track->artist : - cdinfo->artname ? cdinfo->artname : _("(unknown)"); - *album = cdinfo->albname ? cdinfo->albname : _("(unknown)"); - *title = track->title ? track->title : _("(unknown)"); - - return track->num == -1 ? -1 : 0; -} - - -/* - * Function cdda_cdinfo_write_file - * - * Writes the cdinfo_t structure to disk. - */ - - -void -cdda_cdinfo_write_file(guint32 cddb_discid, cdinfo_t * cdinfo) -{ - gchar *filename; - RcFile *rcfile; - gchar sectionname[10], trackstr[16]; - gint i, numtracks = cddb_discid & 0xff; - - sprintf(sectionname, "%08x", cddb_discid); - - filename = - g_strconcat(g_get_home_dir(), "/", BMP_RCPATH, "/cdinfo", NULL); - if ((rcfile = bmp_rcfile_open(filename)) == NULL) - rcfile = bmp_rcfile_new(); - - if (cdinfo->albname) - bmp_rcfile_write_string(rcfile, sectionname, "Albumname", - cdinfo->albname); - else - bmp_rcfile_write_string(rcfile, sectionname, "Albumname", ""); - - if (cdinfo->artname) - bmp_rcfile_write_string(rcfile, sectionname, "Artistname", - cdinfo->artname); - if (cdinfo->year) { - gchar *yearstr = g_strdup_printf("%4d", cdinfo->year); - bmp_rcfile_write_string(rcfile, sectionname, "Year", yearstr); - g_free(yearstr); - } - - if (cdinfo->genre) - bmp_rcfile_write_string(rcfile, sectionname, "Genre", cdinfo->genre); - - - for (i = 1; i <= numtracks; i++) { - if (cdinfo->tracks[i].artist) { - sprintf(trackstr, "track_artist%d", i); - bmp_rcfile_write_string(rcfile, sectionname, trackstr, - cdinfo->tracks[i].artist); - } - if (cdinfo->tracks[i].title) { - sprintf(trackstr, "track_title%d", i); - bmp_rcfile_write_string(rcfile, sectionname, trackstr, - cdinfo->tracks[i].title); - } - } - bmp_rcfile_write(rcfile, filename); - bmp_rcfile_free(rcfile); - g_free(filename); -} - -/* - * Function cdda_cdinfo_read_file - * - * Tries to find and read a album from the disk-cache. - * - * Returns true if the album is found. - */ - -gboolean -cdda_cdinfo_read_file(guint32 cddb_discid, cdinfo_t * cdinfo) -{ - gchar *filename; - RcFile *rcfile; - gchar sectionname[10], trackstr[16]; - gint i, numtracks = cddb_discid & 0xff; - gboolean track_found; - gchar *yearstr = NULL; - - sprintf(sectionname, "%08x", cddb_discid); - - filename = - g_strconcat(g_get_home_dir(), "/", BMP_RCPATH, "/cdinfo", NULL); - if ((rcfile = bmp_rcfile_open(filename)) == NULL) { - g_free(filename); - return FALSE; - } - g_free(filename); - - if (!bmp_rcfile_read_string - (rcfile, sectionname, "Albumname", &cdinfo->albname)) - return FALSE; - - bmp_rcfile_read_string(rcfile, sectionname, "Artistname", - &cdinfo->artname); - - bmp_rcfile_read_string(rcfile, sectionname, "Year", &yearstr); - if (yearstr) { - cdinfo->year = atoi(yearstr); - g_free(yearstr); - yearstr = NULL; - } - - bmp_rcfile_read_string(rcfile, sectionname, "Genre", &cdinfo->genre); - - for (i = 1; i <= numtracks; i++) { - track_found = FALSE; - sprintf(trackstr, "track_artist%d", i); - if (bmp_rcfile_read_string - (rcfile, sectionname, trackstr, &cdinfo->tracks[i].artist)) - track_found = TRUE; - sprintf(trackstr, "track_title%d", i); - if (bmp_rcfile_read_string - (rcfile, sectionname, trackstr, &cdinfo->tracks[i].title)) - track_found = TRUE; - if (track_found) - cdinfo->tracks[i].num = i; - } - cdinfo->is_valid = TRUE; - bmp_rcfile_free(rcfile); - return TRUE; -} diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/cdinfo.h --- a/src/cdaudio/cdinfo.h Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * cdinfo.h Copyright 1999 Espen Skoglund - * Copyright 1999 Håvard Kvålen - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -#ifndef CDINFO_H -#define CDINFO_H - -#include - -/* - * For holding info on a single CD track. - */ -typedef struct { - gchar *artist; - gchar *title; - gint num; -} trackinfo_t; - -/* - * For holding info on a complete CD. - */ -typedef struct { - gboolean is_valid; - gint discid; - gchar *albname; - gchar *artname; - gchar *genre; - gint year; - trackinfo_t tracks[100]; -} cdinfo_t; - -void cdda_cdinfo_flush(cdinfo_t * cdinfo); -cdinfo_t *cdda_cdinfo_new(void); -void cdda_cdinfo_delete(cdinfo_t * info); -void cdda_cdinfo_track_set(cdinfo_t * cdinfo, gint, gchar *, gchar *); -void cdda_cdinfo_cd_set(cdinfo_t * cdinfo, gchar *, gchar *, gchar *, gchar *, gchar *); -gint cdda_cdinfo_get(cdinfo_t * cdinfo, gint num, gchar **, gchar **, gchar **); -gboolean cdda_cdinfo_read_file(guint32 cddb_discid, cdinfo_t * cdinfo); -void cdda_cdinfo_write_file(guint32 cddb_discid, cdinfo_t * cdinfo); - - -#endif diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/configure.c --- a/src/cdaudio/configure.c Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,658 +0,0 @@ -/* BMP - Cross-platform multimedia player - * Copyright (C) 2003-2004 BMP development team. - * - * Based on XMMS: - * Copyright (C) 1998-2003 XMMS development team. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "cdaudio.h" - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - - -#define GET_TB(b) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b)) -#define SET_TB(b) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b), TRUE) - -struct driveconfig { - GtkWidget *device, *directory; - GtkWidget *mixer_oss, *mixer_drive; - GtkWidget *remove_button; - GtkWidget *dae; -}; - -static GList *drives; - -static GtkWidget *cdda_configure_win; -static GtkWidget *cdi_name, *cdi_name_override; -static GtkWidget *cdi_use_cddb, *cdi_cddb_server; - -void cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data); -void cdda_cddb_show_network_window(GtkWidget * w, gpointer data); -void cdda_cddb_set_server(const char *new_server); - -static GtkWidget *configurewin_add_drive(struct driveinfo *drive, - gpointer nb); - -static void -cdda_configurewin_ok_cb(GtkWidget * w, gpointer data) -{ - ConfigDb *db; - struct driveinfo *drive; - GList *node; - gint olddrives, ndrives, i; - - olddrives = g_list_length(cdda_cfg.drives); - for (node = cdda_cfg.drives; node; node = node->next) { - drive = node->data; - g_free(drive->device); - g_free(drive->directory); - g_free(drive); - } - g_list_free(cdda_cfg.drives); - cdda_cfg.drives = NULL; - - for (node = drives; node; node = node->next) { - struct driveconfig *config = node->data; - const gchar *tmp; - - drive = g_new0(struct driveinfo, 1); - drive->device = - g_strdup(gtk_entry_get_text(GTK_ENTRY(config->device))); - - tmp = gtk_entry_get_text(GTK_ENTRY(config->directory)); -// if (strlen(tmp) < 2 || tmp[strlen(tmp) - 1] == '/') - drive->directory = g_strdup(tmp); -// else -// drive->directory = g_strconcat(tmp, "/", NULL); - -// drive->directory = "CD_AUDIO"; - - if (GET_TB(config->mixer_oss)) - drive->mixer = CDDA_MIXER_OSS; - else if (GET_TB(config->mixer_drive)) - drive->mixer = CDDA_MIXER_DRIVE; - else - drive->mixer = CDDA_MIXER_NONE; - if (GET_TB(config->dae)) - drive->dae = CDDA_READ_DAE; - else - drive->dae = CDDA_READ_ANALOG; - - cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive); - } - - cdda_cfg.title_override = GET_TB(cdi_name_override); - g_free(cdda_cfg.name_format); - cdda_cfg.name_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(cdi_name))); - - cdda_cfg.use_cddb = GET_TB(cdi_use_cddb); - cdda_cddb_set_server(gtk_entry_get_text(GTK_ENTRY(cdi_cddb_server))); - - db = bmp_cfg_db_open(); - - drive = cdda_cfg.drives->data; - bmp_cfg_db_set_string(db, "CDDA", "device", drive->device); - bmp_cfg_db_set_string(db, "CDDA", "directory", drive->directory); - bmp_cfg_db_set_int(db, "CDDA", "mixer", drive->mixer); - bmp_cfg_db_set_int(db, "CDDA", "readmode", drive->dae); - -/* bmp_cfg_db_set_bool(db, "CDDA", "use_oss_mixer", cdda_cfg.use_oss_mixer); */ - - for (node = cdda_cfg.drives->next, i = 1; node; node = node->next, i++) { - char label[20]; - drive = node->data; - - sprintf(label, "device%d", i); - bmp_cfg_db_set_string(db, "CDDA", label, drive->device); - - sprintf(label, "directory%d", i); - bmp_cfg_db_set_string(db, "CDDA", label, drive->directory); - - sprintf(label, "mixer%d", i); - bmp_cfg_db_set_int(db, "CDDA", label, drive->mixer); - - sprintf(label, "readmode%d", i); - bmp_cfg_db_set_int(db, "CDDA", label, drive->dae); - } - - ndrives = g_list_length(cdda_cfg.drives); - - for (i = ndrives; i < olddrives; i++) - /* FIXME: Clear old entries */ ; - - bmp_cfg_db_set_int(db, "CDDA", "num_drives", ndrives); - - bmp_cfg_db_set_bool(db, "CDDA", "title_override", - cdda_cfg.title_override); - bmp_cfg_db_set_string(db, "CDDA", "name_format", cdda_cfg.name_format); - bmp_cfg_db_set_bool(db, "CDDA", "use_cddb", cdda_cfg.use_cddb); - bmp_cfg_db_set_string(db, "CDDA", "cddb_server", cdda_cfg.cddb_server); - bmp_cfg_db_set_int(db, "CDDA", "cddb_protocol_level", - cdda_cfg.cddb_protocol_level); - bmp_cfg_db_close(db); -} - -static void -configurewin_close(GtkButton * w, gpointer data) -{ - GList *node; - - for (node = drives; node; node = node->next) - g_free(node->data); - g_list_free(drives); - drives = NULL; - - gtk_widget_destroy(cdda_configure_win); -} - -static void -toggle_set_sensitive_cb(GtkToggleButton * w, gpointer data) -{ - gboolean set = gtk_toggle_button_get_active(w); - gtk_widget_set_sensitive(GTK_WIDGET(data), set); -} - -static void -configurewin_add_page(GtkButton * w, gpointer data) -{ - GtkNotebook *nb = GTK_NOTEBOOK(data); - GtkWidget *box = configurewin_add_drive(NULL, nb); - gchar *label = g_strdup_printf(_("Drive %d"), g_list_length(drives)); - - gtk_widget_show_all(box); - gtk_notebook_append_page(GTK_NOTEBOOK(nb), box, gtk_label_new(label)); - g_free(label); -} - -static void -redo_nb_labels(GtkNotebook * nb) -{ - gint i; - GtkWidget *child; - - for (i = 0; (child = gtk_notebook_get_nth_page(nb, i)) != NULL; i++) { - gchar *label = g_strdup_printf(_("Drive %d"), i + 1); - - gtk_notebook_set_tab_label_text(nb, child, label); - g_free(label); - } -} - - -static void -configurewin_remove_page(GtkButton * w, gpointer data) -{ - GList *node; - GtkNotebook *nb = GTK_NOTEBOOK(data); - gtk_notebook_remove_page(nb, gtk_notebook_get_current_page(nb)); - for (node = drives; node; node = node->next) { - struct driveconfig *drive = node->data; - - if (GTK_WIDGET(w) == drive->remove_button) { - if (node->next) - redo_nb_labels(nb); - drives = g_list_remove(drives, drive); - g_free(drive); - break; - } - } - if (g_list_length(drives) == 1) { - struct driveconfig *drive = drives->data; - gtk_widget_set_sensitive(drive->remove_button, FALSE); - } -} - - -static void -configurewin_check_drive(GtkButton * w, gpointer data) -{ - struct driveconfig *drive = data; - GtkWidget *window, *vbox, *label, *bbox, *closeb; - const gchar *device, *directory; - gint fd, dae_track = -1; - GString *str = g_string_new(""); - struct stat stbuf; - - device = gtk_entry_get_text(GTK_ENTRY(drive->device)); - directory = gtk_entry_get_text(GTK_ENTRY(drive->directory)); - - if ((fd = open(device, CDOPENFLAGS) < 0)) - g_string_sprintfa(str, _("Failed to open device %s\n" - "Error: %s\n\n"), device, strerror(errno)); - else { - cdda_disc_toc_t toc; - close(fd); - if (!cdda_get_toc(&toc, device)) - g_string_append(str, - _("Failed to read \"Table of Contents\"" - "\nMaybe no disc in the drive?\n\n")); - else { - gint i, data = 0; - g_string_sprintfa(str, _("Device %s OK.\n" - "Disc has %d tracks"), device, - toc.last_track - toc.first_track + 1); - for (i = toc.first_track; i <= toc.last_track; i++) - if (toc.track[i].flags.data_track) - data++; - else if (dae_track < 0) - dae_track = i; - if (data > 0) - g_string_sprintfa(str, _(" (%d data tracks)"), data); - g_string_sprintfa(str, _("\nTotal length: %d:%d\n"), - toc.leadout.minute, toc.leadout.second); -#ifdef CDDA_HAS_READAUDIO - if (dae_track == -1) - g_string_sprintfa(str, - _("Digital audio extraction " - "not tested as the disc has " - "no audio tracks\n")); - else { - gint fd = open(device, CDOPENFLAGS); - gint start, end, fr; - gchar buffer[CD_FRAMESIZE_RAW]; - start = LBA(toc.track[dae_track]); - - if (dae_track == toc.last_track) - end = LBA(toc.leadout); - else - end = LBA(toc.track[dae_track + 1]); - fr = read_audio_data(fd, start + (end - start) / 2, - 1, buffer); - if (fr > 0) - g_string_sprintfa(str, - _("Digital audio extraction " - "test: OK\n\n")); - else - g_string_sprintfa(str, - _("Digital audio extraction " - "test failed: %s\n\n"), - strerror(-fr)); - } -#else - g_string_sprintfa(str, "\n"); -#endif - } - } - if (stat(directory, &stbuf) < 0) { - g_string_sprintfa(str, _("Failed to check directory %s\n" - "Error: %s"), directory, strerror(errno)); - } - else { - if (!S_ISDIR(stbuf.st_mode)) - g_string_sprintfa(str, - _("Error: %s exist, but is not a directory"), - directory); - else - g_string_sprintfa(str, _("Directory %s OK."), directory); - } - - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_transient_for(GTK_WINDOW(window), - GTK_WINDOW(cdda_configure_win)); - gtk_container_set_border_width(GTK_CONTAINER(window), 10); - vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(window), vbox); - label = gtk_label_new(str->str); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - - closeb = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - GTK_WIDGET_SET_FLAGS(closeb, GTK_CAN_DEFAULT); - g_signal_connect_swapped(G_OBJECT(closeb), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(window)); - gtk_box_pack_start(GTK_BOX(bbox), closeb, TRUE, TRUE, 0); - gtk_widget_grab_default(closeb); - - g_string_free(str, TRUE); - - gtk_widget_show_all(window); -} - -static GtkWidget * -configurewin_add_drive(struct driveinfo *drive, gpointer nb) -{ - GtkWidget *vbox, *bbox, *dev_frame, *dev_table, *dev_label; - GtkWidget *dev_dir_label, *check_btn; - GtkWidget *volume_frame, *volume_box, *volume_none; - GtkWidget *readmode_frame, *readmode_box, *readmode_analog; - struct driveconfig *d = g_new0(struct driveconfig, 1); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); - - dev_frame = gtk_frame_new(_("Device:")); - gtk_box_pack_start(GTK_BOX(vbox), dev_frame, FALSE, FALSE, 0); - dev_table = gtk_table_new(2, 2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(dev_table), 5); - gtk_container_add(GTK_CONTAINER(dev_frame), dev_table); - gtk_table_set_row_spacings(GTK_TABLE(dev_table), 5); - gtk_table_set_col_spacings(GTK_TABLE(dev_table), 5); - - dev_label = gtk_label_new_with_mnemonic(_("_Device:")); - gtk_misc_set_alignment(GTK_MISC(dev_label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(dev_table), dev_label, 0, 1, 0, 1, - GTK_FILL, 0, 0, 0); - - d->device = gtk_entry_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(dev_label), d->device); - gtk_table_attach(GTK_TABLE(dev_table), d->device, 1, 2, 0, 1, - GTK_FILL | GTK_EXPAND, 0, 0, 0); - - dev_dir_label = gtk_label_new_with_mnemonic(_("Dir_ectory:")); - gtk_misc_set_alignment(GTK_MISC(dev_dir_label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(dev_table), dev_dir_label, 0, 1, 1, 2, - GTK_FILL, 0, 0, 0); - - - d->directory = gtk_entry_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(dev_dir_label), d->directory); - gtk_table_attach(GTK_TABLE(dev_table), d->directory, 1, 2, 1, 2, - GTK_FILL | GTK_EXPAND, 0, 0, 0); - - - readmode_frame = gtk_frame_new(_("Play mode:")); - gtk_box_pack_start(GTK_BOX(vbox), readmode_frame, FALSE, FALSE, 0); - - readmode_box = gtk_vbox_new(5, FALSE); - gtk_container_add(GTK_CONTAINER(readmode_frame), readmode_box); - - readmode_analog = gtk_radio_button_new_with_label(NULL, _("Analog")); - gtk_box_pack_start(GTK_BOX(readmode_box), readmode_analog, FALSE, - FALSE, 0); - - d->dae = - gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON - (readmode_analog), - _ - ("Digital audio extraction")); - gtk_box_pack_start(GTK_BOX(readmode_box), d->dae, FALSE, FALSE, 0); -#ifndef CDDA_HAS_READAUDIO - gtk_widget_set_sensitive(readmode_frame, FALSE); -#endif - - /* - * Volume config - */ - - volume_frame = gtk_frame_new(_("Volume control:")); - gtk_box_pack_start(GTK_BOX(vbox), volume_frame, FALSE, FALSE, 0); - - volume_box = gtk_vbox_new(5, FALSE); - gtk_container_add(GTK_CONTAINER(volume_frame), volume_box); - - volume_none = gtk_radio_button_new_with_label(NULL, _("No mixer")); - gtk_box_pack_start(GTK_BOX(volume_box), volume_none, FALSE, FALSE, 0); - - d->mixer_drive = - gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON - (volume_none), - _("CDROM drive")); - gtk_box_pack_start(GTK_BOX(volume_box), d->mixer_drive, FALSE, FALSE, 0); - - d->mixer_oss = - gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON - (volume_none), - _("OSS mixer")); - gtk_box_pack_start(GTK_BOX(volume_box), d->mixer_oss, FALSE, FALSE, 0); - - g_signal_connect(G_OBJECT(readmode_analog), "toggled", - G_CALLBACK(toggle_set_sensitive_cb), volume_frame); -#ifndef HAVE_OSS - gtk_widget_set_sensitive(d->mixer_oss, FALSE); -#endif - if (drive) { - gtk_entry_set_text(GTK_ENTRY(d->device), drive->device); - gtk_entry_set_text(GTK_ENTRY(d->directory), drive->directory); - if (drive->mixer == CDDA_MIXER_DRIVE) - SET_TB(d->mixer_drive); - else if (drive->mixer == CDDA_MIXER_OSS) - SET_TB(d->mixer_oss); - if (drive->dae == CDDA_READ_DAE) - SET_TB(d->dae); - } - - bbox = gtk_hbutton_box_new(); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); - - check_btn = gtk_button_new_with_label(_("Check drive...")); - GTK_WIDGET_SET_FLAGS(check_btn, GTK_CAN_DEFAULT); - gtk_box_pack_start_defaults(GTK_BOX(bbox), check_btn); - g_signal_connect(G_OBJECT(check_btn), "clicked", - G_CALLBACK(configurewin_check_drive), d); - - d->remove_button = gtk_button_new_with_label(_("Remove drive")); - GTK_WIDGET_SET_FLAGS(d->remove_button, GTK_CAN_DEFAULT); - gtk_box_pack_start_defaults(GTK_BOX(bbox), d->remove_button); - g_signal_connect(G_OBJECT(d->remove_button), "clicked", - G_CALLBACK(configurewin_remove_page), nb); - - - if (drives == NULL) - gtk_widget_set_sensitive(d->remove_button, FALSE); - else { - struct driveconfig *tmp = drives->data; - gtk_widget_set_sensitive(tmp->remove_button, TRUE); - } - - drives = g_list_append(drives, d); - - return vbox; -} - -void -cdda_configure(void) -{ - GtkWidget *vbox, *notebook; - GtkWidget *dev_vbox, *dev_notebook, *add_drive, *add_bbox; - GtkWidget *cdi_vbox; - GtkWidget *cdi_cddb_frame, *cdi_cddb_vbox, *cdi_cddb_hbox; - GtkWidget *cdi_cddb_server_hbox, *cdi_cddb_server_label; - GtkWidget *cdi_cddb_server_list, *cdi_cddb_debug_win; - GtkWidget *cdi_name_frame, *cdi_name_vbox, *cdi_name_hbox; - GtkWidget *cdi_name_label, *cdi_desc; - GtkWidget *cdi_name_enable_vbox; - GtkWidget *bbox, *ok, *cancel; - - GList *node; - gint i = 1; - - if (cdda_configure_win) - return; - - cdda_configure_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(G_OBJECT(cdda_configure_win), "destroy", - G_CALLBACK(gtk_widget_destroyed), &cdda_configure_win); - gtk_window_set_title(GTK_WINDOW(cdda_configure_win), - _("CD Audio Player Configuration")); - gtk_window_set_type_hint(GTK_WINDOW(cdda_configure_win), - GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_resizable(GTK_WINDOW(cdda_configure_win), FALSE); - gtk_window_set_position(GTK_WINDOW(cdda_configure_win), - GTK_WIN_POS_MOUSE); - gtk_container_border_width(GTK_CONTAINER(cdda_configure_win), 10); - - vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(cdda_configure_win), vbox); - - notebook = gtk_notebook_new(); - gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); - - /* - * Device config - */ - dev_vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(dev_vbox), 5); - - dev_notebook = gtk_notebook_new(); - gtk_notebook_set_scrollable(GTK_NOTEBOOK(dev_notebook), TRUE); - gtk_box_pack_start(GTK_BOX(dev_vbox), dev_notebook, FALSE, FALSE, 0); - - for (node = cdda_cfg.drives; node; node = node->next) { - struct driveinfo *drive = node->data; - gchar *label = g_strdup_printf(_("Drive %d"), i++); - GtkWidget *w; - - w = configurewin_add_drive(drive, dev_notebook); - gtk_notebook_append_page(GTK_NOTEBOOK(dev_notebook), w, - gtk_label_new(label)); - g_free(label); - - } - - add_bbox = gtk_hbutton_box_new(); - gtk_box_pack_start(GTK_BOX(dev_vbox), add_bbox, FALSE, FALSE, 0); - add_drive = gtk_button_new_with_label(_("Add drive")); - g_signal_connect(G_OBJECT(add_drive), "clicked", - G_CALLBACK(configurewin_add_page), dev_notebook); - GTK_WIDGET_SET_FLAGS(add_drive, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(add_bbox), add_drive, FALSE, FALSE, 0); - - - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dev_vbox, - gtk_label_new(_("Device"))); - - /* - * CD Info config - */ - cdi_vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(cdi_vbox), 5); - - - /* CDDB */ - cdi_cddb_frame = gtk_frame_new(_("CDDB:")); - gtk_box_pack_start(GTK_BOX(cdi_vbox), cdi_cddb_frame, FALSE, FALSE, 0); - - cdi_cddb_vbox = gtk_vbox_new(FALSE, 10); - gtk_container_border_width(GTK_CONTAINER(cdi_cddb_vbox), 5); - gtk_container_add(GTK_CONTAINER(cdi_cddb_frame), cdi_cddb_vbox); - - cdi_cddb_hbox = gtk_hbox_new(FALSE, 10); - gtk_container_border_width(GTK_CONTAINER(cdi_cddb_hbox), 0); - gtk_box_pack_start(GTK_BOX(cdi_cddb_vbox), - cdi_cddb_hbox, FALSE, FALSE, 0); - cdi_use_cddb = gtk_check_button_new_with_label(_("Use CDDB")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cdi_use_cddb), - cdda_cfg.use_cddb); - gtk_box_pack_start(GTK_BOX(cdi_cddb_hbox), cdi_use_cddb, FALSE, FALSE, 0); - cdi_cddb_server_list = gtk_button_new_with_label(_("Get server list")); - gtk_box_pack_end(GTK_BOX(cdi_cddb_hbox), cdi_cddb_server_list, FALSE, - FALSE, 0); - cdi_cddb_debug_win = gtk_button_new_with_label(_("Show network window")); - g_signal_connect(G_OBJECT(cdi_cddb_debug_win), "clicked", - G_CALLBACK(cdda_cddb_show_network_window), NULL); - gtk_box_pack_end(GTK_BOX(cdi_cddb_hbox), cdi_cddb_debug_win, FALSE, - FALSE, 0); - - cdi_cddb_server_hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(cdi_cddb_vbox), - cdi_cddb_server_hbox, FALSE, FALSE, 0); - - cdi_cddb_server_label = gtk_label_new(_("CDDB server:")); - gtk_box_pack_start(GTK_BOX(cdi_cddb_server_hbox), - cdi_cddb_server_label, FALSE, FALSE, 0); - - cdi_cddb_server = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(cdi_cddb_server), cdda_cfg.cddb_server); - gtk_box_pack_start(GTK_BOX(cdi_cddb_server_hbox), cdi_cddb_server, - TRUE, TRUE, 0); - g_signal_connect(G_OBJECT(cdi_cddb_server_list), "clicked", - G_CALLBACK(cdda_cddb_show_server_dialog), - cdi_cddb_server); - - /* - * Track names - */ - cdi_name_frame = gtk_frame_new(_("Track names:")); - gtk_box_pack_start(GTK_BOX(cdi_vbox), cdi_name_frame, FALSE, FALSE, 0); - - cdi_name_vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(cdi_name_frame), cdi_name_vbox); - gtk_container_border_width(GTK_CONTAINER(cdi_name_vbox), 5); - cdi_name_override = - gtk_check_button_new_with_label(_("Override generic titles")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cdi_name_override), - cdda_cfg.title_override); - gtk_box_pack_start(GTK_BOX(cdi_name_vbox), cdi_name_override, FALSE, - FALSE, 0); - - cdi_name_enable_vbox = gtk_vbox_new(FALSE, 10); - gtk_container_add(GTK_CONTAINER(cdi_name_vbox), cdi_name_enable_vbox); - gtk_widget_set_sensitive(cdi_name_enable_vbox, cdda_cfg.title_override); - g_signal_connect(G_OBJECT(cdi_name_override), "toggled", - G_CALLBACK(toggle_set_sensitive_cb), - cdi_name_enable_vbox); - - cdi_name_hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(cdi_name_enable_vbox), cdi_name_hbox, FALSE, - FALSE, 0); - cdi_name_label = gtk_label_new(_("Name format:")); - gtk_box_pack_start(GTK_BOX(cdi_name_hbox), cdi_name_label, FALSE, - FALSE, 0); - cdi_name = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(cdi_name), cdda_cfg.name_format); - gtk_box_pack_start(GTK_BOX(cdi_name_hbox), cdi_name, TRUE, TRUE, 0); - - cdi_desc = xmms_titlestring_descriptions("patn", 2); - gtk_box_pack_start(GTK_BOX(cdi_name_enable_vbox), cdi_desc, FALSE, - FALSE, 0); - - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), cdi_vbox, - gtk_label_new(_("CD Info"))); - - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); - gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - - - cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - g_signal_connect(G_OBJECT(cancel), "clicked", - G_CALLBACK(configurewin_close), NULL); - GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0); - - ok = gtk_button_new_from_stock(GTK_STOCK_OK); - g_signal_connect(G_OBJECT(ok), "clicked", - G_CALLBACK(cdda_configurewin_ok_cb), NULL); - g_signal_connect(G_OBJECT(ok), "clicked", - G_CALLBACK(configurewin_close), NULL); - GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT); - gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0); - gtk_widget_grab_default(ok); - - - gtk_widget_show_all(cdda_configure_win); -} diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/http.c --- a/src/cdaudio/http.c Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -/* - * http.c - * Some simple routines for connecting to a remote tcp socket - * Copyright 1999 Håvard Kvålen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -/* FIXME: We need to have *one* place in xmms where you configure proxies */ - -#include "http.h" - -gint -http_open_connection(const gchar * server, gint port) -{ - gint sock; -#ifdef USE_IPV6 - struct addrinfo hints, *res, *res0; - char service[6]; -#else - struct hostent *host; - struct sockaddr_in address; -#endif - -#ifdef USE_IPV6 - snprintf(service, 6, "%d", port); - memset(&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - - if (getaddrinfo(server, service, &hints, &res0)) - return 0; - - for (res = res0; res; res = res->ai_next) { - sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol); - if (sock < 0) { - if (res->ai_next) - continue; - else { - freeaddrinfo(res0); - return 0; - } - } - if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) { - if (res->ai_next) { - close(sock); - continue; - } else { - freeaddrinfo(res0); - return 0; - } - } - freeaddrinfo(res0); - return sock; - } -#else - sock = socket(AF_INET, SOCK_STREAM, 0); - address.sin_family = AF_INET; - - if (!(host = gethostbyname(server))) - return 0; - - memcpy(&address.sin_addr.s_addr, *(host->h_addr_list), - sizeof(address.sin_addr.s_addr)); - address.sin_port = g_htons(port); - - if (connect - (sock, (struct sockaddr *) &address, - sizeof(struct sockaddr_in)) == -1) - return 0; -#endif - - return sock; -} - -void -http_close_connection(gint sock) -{ - shutdown(sock, 2); - close(sock); -} - -gint -http_read_line(gint sock, gchar * buf, gint size) -{ - gint i = 0; - - while (i < size - 1) { - if (read(sock, buf + i, 1) <= 0) { - if (i == 0) - return -1; - else - break; - } - if (buf[i] == '\n') - break; - if (buf[i] != '\r') - i++; - } - buf[i] = '\0'; - return i; -} - -gint -http_read_first_line(gint sock, gchar * buf, gint size) -{ - /* Skips the HTTP-header, if there is one, and reads the first line into buf. - Returns number of bytes read. */ - - gint i; - /* Skip the HTTP-header */ - if ((i = http_read_line(sock, buf, size)) < 0) - return -1; - if (!strncmp(buf, "HTTP", 4)) { /* Check to make sure its not HTTP/0.9 */ - while (http_read_line(sock, buf, size) > 0) - /* nothing */ ; - if ((i = http_read_line(sock, buf, size)) < 0) - return -1; - } - - return i; -} - -gchar * -http_get(gchar * url) -{ - gchar *server, *getstr, *buf = NULL, *bptr; - gchar *gs, *gc, *turl = url; - gint sock, n, bsize, port = 0; - - /* Skip past ``http://'' part of URL */ - if (!strncmp(turl, "http:", 5)) { - turl += 5; - if (!strncmp(turl, "//", 2)) - turl += 2; - } - - /* If path starts with a '/', we are referring to localhost */ - if (turl[0] == '/') - server = "localhost"; - else - server = turl; - - /* Check if URL contains port specification */ - gc = strchr(turl, ':'); - gs = strchr(turl, '/'); - - if (gc != NULL && gc < gs) { - port = atoi(gc + 1); - *gc = '\0'; - } - if (port == 0) - port = 80; - - /* Make sure that server string is null terminated. */ - if (gs) - *gs = '\0'; - - - /* - * Now, open connection to server. - */ - sock = http_open_connection(server, port); - - /* Repair the URL string that we broke earlier on */ - if (gs) - *gs = '/'; - if (gc && gc == '\0') - *gc = ':'; - - if (sock == 0) - return NULL; - - /* - * Send query to socket. - */ - getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", gs ? gs : "/"); -/* getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", url ? url : "/"); */ - - if (write(sock, getstr, strlen(getstr)) == -1) { - http_close_connection(sock); - return NULL; - } - - /* - * Start receiving result. - */ - bsize = 4096; - bptr = buf = g_malloc(bsize); - - if ((n = http_read_first_line(sock, bptr, bsize)) == -1) { - g_free(buf); - buf = NULL; - goto Done; - } - - bsize -= n; - bptr += n; - - while (bsize > 0 && (n = http_read_line(sock, bptr, bsize)) != -1) { - bptr += n; - bsize -= n; - } - - Done: - http_close_connection(sock); - - /* - * Return result buffer to caller. - */ - return buf; -} diff -r 85ffec632924 -r e17e009b3d9b src/cdaudio/http.h --- a/src/cdaudio/http.h Wed Jul 25 16:48:53 2007 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright 1999 Håvard Kvålen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef XMMS_HTTP_H -#define XMMS_HTTP_H - -#include "config.h" -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include -#include -#include -#include -#include - - -gint http_open_connection(const gchar * server, gint port); -void http_close_connection(gint sock); -gint http_read_line(gint sock, gchar * buf, gint size); -gint http_read_first_line(gint sock, gchar * buf, gint size); -gchar *http_get(gchar * url); - -#endif