diff --git a/lib/_cdio_bincue.c b/lib/_cdio_bincue.c index 00a4a45f..17f7ac6b 100644 --- a/lib/_cdio_bincue.c +++ b/lib/_cdio_bincue.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bincue.c,v 1.11 2003/04/07 11:24:55 rocky Exp $ + $Id: _cdio_bincue.c,v 1.12 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -28,7 +28,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.11 2003/04/07 11:24:55 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.12 2003/04/10 04:13:41 rocky Exp $"; #include #include @@ -564,8 +564,8 @@ _cdio_get_arg (void *user_data, const char key[]) /*! Return a string containing the default VCD device if none is specified. */ -static char * -_cdio_get_default_device() +char * +cdio_get_default_device_bincue(void) { return strdup(DEFAULT_CDIO_DEVICE); } @@ -692,7 +692,7 @@ cdio_open_bincue (const char *source_name) .eject_media = cdio_generic_bogus_eject_media, .free = cdio_generic_stream_free, .get_arg = _cdio_get_arg, - .get_default_device = _cdio_get_default_device, + .get_default_device = cdio_get_default_device_bincue, .get_first_track_num= _cdio_get_first_track_num, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, @@ -731,7 +731,7 @@ cdio_open_cue (const char *cue_name) .eject_media = cdio_generic_bogus_eject_media, .free = cdio_generic_stream_free, .get_arg = _cdio_get_arg, - .get_default_device = _cdio_get_default_device, + .get_default_device = cdio_get_default_device_bincue, .get_first_track_num= _cdio_get_first_track_num, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, diff --git a/lib/_cdio_bsdi.c b/lib/_cdio_bsdi.c index 912edb44..dc4259f8 100644 --- a/lib/_cdio_bsdi.c +++ b/lib/_cdio_bsdi.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bsdi.c,v 1.7 2003/04/08 10:35:09 rocky Exp $ + $Id: _cdio_bsdi.c,v 1.8 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -27,18 +27,20 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.7 2003/04/08 10:35:09 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.8 2003/04/10 04:13:41 rocky Exp $"; #include "cdio_assert.h" #include "cdio_private.h" #include "sector.h" #include "util.h" +#define DEFAULT_CDIO_DEVICE "/dev/rsr0c" +#include + #ifdef HAVE_BSDI_CDROM #include #include -#include #include #include #include @@ -48,8 +50,6 @@ static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.7 2003/04/08 10:35:09 rocky #include #include -#define DEFAULT_CDIO_DEVICE "/dev/rsr0c" - #define TOTAL_TRACKS (_obj->tochdr.cdth_trk1) #define FIRST_TRACK_NUM (_obj->tochdr.cdth_trk0) @@ -360,15 +360,6 @@ _cdio_get_arg (void *user_data, const char key[]) return NULL; } -/*! - Return a string containing the default VCD device if none is specified. - */ -static char * -_cdio_get_default_device() -{ - return strdup(DEFAULT_CDIO_DEVICE); -} - /*! Return the number of of the first track. CDIO_INVALID_TRACK is returned on error. @@ -482,6 +473,15 @@ _cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf) #endif /* HAVE_BSDI_CDROM */ +/*! + Return a string containing the default VCD device if none is specified. + */ +char * +cdio_get_default_device_bsdi(void) +{ + return strdup(DEFAULT_CDIO_DEVICE); +} + /*! Initialization routine. This is the only thing that doesn't get called via a function pointer. In fact *we* are the @@ -499,7 +499,7 @@ cdio_open_bsdi (const char *source_name) .eject_media = _cdio_eject_media, .free = cdio_generic_free, .get_arg = _cdio_get_arg, - .get_default_device = _cdio_get_default_device, + .get_default_device = cdio_get_default_device_bsdi, .get_first_track_num= _cdio_get_first_track_num, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, diff --git a/lib/_cdio_freebsd.c b/lib/_cdio_freebsd.c index 745b8c10..3fae0b7c 100644 --- a/lib/_cdio_freebsd.c +++ b/lib/_cdio_freebsd.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_freebsd.c,v 1.5 2003/03/30 00:40:29 rocky Exp $ + $Id: _cdio_freebsd.c,v 1.6 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -26,18 +26,22 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_freebsd.c,v 1.5 2003/03/30 00:40:29 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_freebsd.c,v 1.6 2003/04/10 04:13:41 rocky Exp $"; #include "cdio_assert.h" #include "cdio_private.h" #include "sector.h" #include "util.h" +/* Is this the right default? */ +#define DEFAULT_CDIO_DEVICE "/dev/acd0c" + +#include + #ifdef HAVE_FREEBSD_CDROM #include #include -#include #include #include #include @@ -51,9 +55,6 @@ static const char _rcsid[] = "$Id: _cdio_freebsd.c,v 1.5 2003/03/30 00:40:29 roc #include #include -/* Is this the right default? */ -#define DEFAULT_CDIO_DEVICE "/dev/acd0c" - #define TOTAL_TRACKS (_obj->tochdr.ending_track \ - obj->tochdr.starting_track + 1) #define FIRST_TRACK_NUM (_obj->tochdr.starting_track) @@ -365,15 +366,6 @@ _cdio_get_arg (void *user_data, const char key[]) return NULL; } -/*! - Return a string containing the default VCD device if none is specified. - */ -static char * -_cdio_get_default_device() -{ - return strdup(DEFAULT_CDIO_DEVICE); -} - /*! Return the number of of the first track. CDIO_INVALID_TRACK is returned on error. @@ -487,6 +479,15 @@ _cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf) #endif /* HAVE_FREEBSD_CDROM */ +/*! + Return a string containing the default VCD device if none is specified. + */ +char * +cdio_get_default_device_freebsd() +{ + return strdup(DEFAULT_CDIO_DEVICE); +} + /*! Initialization routine. This is the only thing that doesn't get called via a function pointer. In fact *we* are the @@ -553,3 +554,4 @@ cdio_have_freebsd (void) #endif /* HAVE_FREEBSD_CDROM */ } + diff --git a/lib/_cdio_generic.c b/lib/_cdio_generic.c index 859fd74f..1ec267e4 100644 --- a/lib/_cdio_generic.c +++ b/lib/_cdio_generic.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_generic.c,v 1.5 2003/04/07 11:24:04 rocky Exp $ + $Id: _cdio_generic.c,v 1.6 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.5 2003/04/07 11:24:04 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.6 2003/04/10 04:13:41 rocky Exp $"; #include #include @@ -90,7 +90,7 @@ cdio_generic_init (void *user_data) if (_obj->fd < 0) { - cdio_error ("open (%s): %s", _obj->source_name, strerror (errno)); + cdio_warn ("open (%s): %s", _obj->source_name, strerror (errno)); return false; } diff --git a/lib/_cdio_nrg.c b/lib/_cdio_nrg.c index f13e9abb..2c9e5382 100644 --- a/lib/_cdio_nrg.c +++ b/lib/_cdio_nrg.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_nrg.c,v 1.8 2003/04/07 11:25:40 rocky Exp $ + $Id: _cdio_nrg.c,v 1.9 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001,2003 Herbert Valerio Riedel @@ -38,7 +38,7 @@ #include "util.h" #include "_cdio_stdio.h" -static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.8 2003/04/07 11:25:40 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.9 2003/04/10 04:13:41 rocky Exp $"; /* structures used */ @@ -691,8 +691,8 @@ _cdio_get_arg (void *user_data, const char key[]) /*! Return a string containing the default VCD device if none is specified. */ -static char * -_cdio_get_default_device() +char * +cdio_get_default_device_nrg() { return strdup(DEFAULT_CDIO_DEVICE); } @@ -787,7 +787,7 @@ cdio_open_nrg (const char *source_name) .eject_media = cdio_generic_bogus_eject_media, .free = cdio_generic_stream_free, .get_arg = _cdio_get_arg, - .get_default_device = _cdio_get_default_device, + .get_default_device = cdio_get_default_device_nrg, .get_first_track_num= _cdio_get_first_track_num, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, diff --git a/lib/_cdio_sunos.c b/lib/_cdio_sunos.c index 5e05e746..ff45088f 100644 --- a/lib/_cdio_sunos.c +++ b/lib/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.8 2003/04/08 10:17:56 rocky Exp $ + $Id: _cdio_sunos.c,v 1.9 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -29,9 +29,11 @@ #include "sector.h" #include "util.h" +#define DEFAULT_CDIO_DEVICE "/vol/dev/aliases/cdrom0" + #ifdef HAVE_SOLARIS_CDROM -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.8 2003/04/08 10:17:56 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.9 2003/04/10 04:13:41 rocky Exp $"; #include #include @@ -54,8 +56,6 @@ static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.8 2003/04/08 10:17:56 rocky #include #include -#define DEFAULT_CDIO_DEVICE "/vol/dev/aliases/cdrom0" - #define TOTAL_TRACKS (_obj->tochdr.cdth_trk1) #define FIRST_TRACK_NUM (_obj->tochdr.cdth_trk0) @@ -115,7 +115,7 @@ _cdio_init (_img_private_t *_obj) Returns 0 if no error. */ static int -_read_mode2_sector (void *user_data, void *data, lsn_t lsn, +_cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, bool mode2_form2) { char buf[M2RAW_SECTOR_SIZE] = { 0, }; @@ -226,13 +226,117 @@ _read_mode2_sector (void *user_data, void *data, lsn_t lsn, return 0; } +/*! + Reads a single mode2 sector from cd device into data starting from lsn. + Returns 0 if no error. + */ +static int +_cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) +{ + struct cdrom_msf *msf = (struct cdrom_msf *) &data; + msf_t _msf; + + _img_private_t *_obj = user_data; + + cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); + msf->cdmsf_min0 = from_bcd8(_msf.m); + msf->cdmsf_sec0 = from_bcd8(_msf.s); + msf->cdmsf_frame0 = from_bcd8(_msf.f); + + if (_obj->gen.ioctls_debugged == 75) + cdio_debug ("only displaying every 75th ioctl from now on"); + + if (_obj->gen.ioctls_debugged == 30 * 75) + cdio_debug ("only displaying every 30*75th ioctl from now on"); + + if (_obj->gen.ioctls_debugged < 75 + || (_obj->gen.ioctls_debugged < (30 * 75) + && _obj->gen.ioctls_debugged % 75 == 0) + || _obj->gen.ioctls_debugged % (30 * 75) == 0) + cdio_debug ("reading %2.2d:%2.2d:%2.2d", + msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0); + + _obj->gen.ioctls_debugged++; + + switch (_obj->access_mode) + { + case _AM_NONE: + cdio_error ("No way to read CD audio"); + return 1; + break; + + case _AM_SUN_CTRL_SCSI: + if (ioctl (_obj->gen.fd, CDROMCDDA, &data) == -1) { + perror ("ioctl(..,CDROMCDDA,..)"); + return 1; + /* exit (EXIT_FAILURE); */ + } + break; + + case _AM_SUN_CTRL_ATAPI: + { + struct uscsi_cmd sc; + union scsi_cdb cdb; + int blocks = 1; + int sector_type; + int sync, header_code, user_data, edc_ecc, error_field; + int sub_channel; + + sector_type = 1; + sync = 0; + header_code = 2; + user_data = 1; + edc_ecc = 0; + error_field = 0; + sub_channel = 0; + + memset(&cdb, 0, sizeof(cdb)); + memset(&sc, 0, sizeof(sc)); + cdb.scc_cmd = 0xBE; + cdb.cdb_opaque[1] = (sector_type) << 2; + cdb.cdb_opaque[2] = (lsn >> 24) & 0xff; + cdb.cdb_opaque[3] = (lsn >> 16) & 0xff; + cdb.cdb_opaque[4] = (lsn >> 8) & 0xff; + cdb.cdb_opaque[5] = lsn & 0xff; + cdb.cdb_opaque[6] = (blocks >> 16) & 0xff; + cdb.cdb_opaque[7] = (blocks >> 8) & 0xff; + cdb.cdb_opaque[8] = blocks & 0xff; + cdb.cdb_opaque[9] = (sync << 7) | + (header_code << 5) | + (user_data << 4) | + (edc_ecc << 3) | + (error_field << 1); + cdb.cdb_opaque[10] = sub_channel; + + sc.uscsi_cdb = (caddr_t)&cdb; + sc.uscsi_cdblen = 12; + sc.uscsi_bufaddr = (caddr_t) data; + sc.uscsi_buflen = CDIO_CD_FRAMESIZE; + sc.uscsi_flags = USCSI_ISOLATE | USCSI_READ; + sc.uscsi_timeout = 20; + if (ioctl(_obj->gen.fd, USCSICMD, &sc)) { + perror("USCSICMD: READ CD"); + return 1; + } + if (sc.uscsi_status) { + cdio_error("SCSI command failed with status %d\n", + sc.uscsi_status); + return 1; + } + break; + } + } + + return 0; +} + /*! Reads nblocks of mode2 sectors from cd device into data starting from lsn. Returns 0 if no error. */ static int -_read_mode2_sectors (void *user_data, void *data, uint32_t lsn, +_cdio_read_mode2_sectors (void *user_data, void *data, uint32_t lsn, bool mode2_form2, unsigned nblocks) { _img_private_t *_obj = user_data; @@ -241,13 +345,13 @@ _read_mode2_sectors (void *user_data, void *data, uint32_t lsn, for (i = 0; i < nblocks; i++) { if (mode2_form2) { - if ( (retval = _read_mode2_sector (_obj, + if ( (retval = _cdio_read_mode2_sector (_obj, ((char *)data) + (M2RAW_SECTOR_SIZE * i), lsn + i, true)) ) return retval; } else { char buf[M2RAW_SECTOR_SIZE] = { 0, }; - if ( (retval = _read_mode2_sector (_obj, buf, lsn + i, true)) ) + if ( (retval = _cdio_read_mode2_sector (_obj, buf, lsn + i, true)) ) return retval; memcpy (((char *)data) + (CDIO_CD_FRAMESIZE * i), @@ -421,8 +525,8 @@ _cdio_get_arg (void *user_data, const char key[]) /*! Return a string containing the default VCD device if none is specified. */ -static char * -_cdio_get_default_device(void) +char * +cdio_get_default_device_solaris(void) { char *volume_device; char *volume_name; @@ -562,6 +666,15 @@ _cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf) } } +#else +/*! + Return a string containing the default VCD device if none is specified. + */ +char * +cdio_get_default_device_solaris(void) +{ + return strdup(DEFAULT_CDIO_DEVICE); +} #endif /* HAVE_SOLARIS_CDROM */ /*! @@ -581,7 +694,7 @@ cdio_open_solaris (const char *source_name) .eject_media = _cdio_eject_media, .free = cdio_generic_free, .get_arg = _cdio_get_arg, - .get_default_device = _cdio_get_default_device, + .get_default_device = cdio_get_default_device_solaris, .get_first_track_num= _cdio_get_first_track_num, .get_num_tracks = _cdio_get_num_tracks, .get_track_format = _cdio_get_track_format, @@ -590,8 +703,9 @@ cdio_open_solaris (const char *source_name) .get_track_msf = _cdio_get_track_msf, .lseek = cdio_generic_lseek, .read = cdio_generic_read, - .read_mode2_sector = _read_mode2_sector, - .read_mode2_sectors = _read_mode2_sectors, + .read_audio_sector = _cdio_read_audio_sector, + .read_mode2_sector = _cdio_read_mode2_sector, + .read_mode2_sectors = _cdio_read_mode2_sectors, .stat_size = _cdio_stat_size, .set_arg = _cdio_set_arg }; diff --git a/lib/cdio.c b/lib/cdio.c index b648839d..b5a6984e 100644 --- a/lib/cdio.c +++ b/lib/cdio.c @@ -1,5 +1,5 @@ /* - $Id: cdio.c,v 1.6 2003/04/04 00:41:10 rocky Exp $ + $Id: cdio.c,v 1.7 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 2001 Herbert Valerio Riedel @@ -28,7 +28,7 @@ #include "logging.h" #include "cdio_private.h" -static const char _rcsid[] = "$Id: cdio.c,v 1.6 2003/04/04 00:41:10 rocky Exp $"; +static const char _rcsid[] = "$Id: cdio.c,v 1.7 2003/04/10 04:13:41 rocky Exp $"; const char *track_format2str[5] = @@ -65,6 +65,7 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "Unknown", "No driver", &cdio_have_false, + NULL, NULL }, @@ -73,7 +74,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "BSDI", "BSDI ATAPI and SCSI driver", &cdio_have_bsdi, - cdio_open_bsdi + cdio_open_bsdi, + &cdio_get_default_device_bsdi }, {DRIVER_FREEBSD, @@ -81,7 +83,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "FreeBSD", "FreeBSD driver", &cdio_have_freebsd, - cdio_open_freebsd + &cdio_open_freebsd, + &cdio_get_default_device_freebsd }, {DRIVER_LINUX, @@ -89,7 +92,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "Linux", "Linux ioctl and packet driver", &cdio_have_linux, - &cdio_open_linux + &cdio_open_linux, + &cdio_get_default_device_freebsd }, {DRIVER_SOLARIS, @@ -97,7 +101,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "Solaris", "Solaris ATAPI and SCSI driver", &cdio_have_solaris, - &cdio_open_solaris + &cdio_open_solaris, + &cdio_get_default_device_solaris }, {DRIVER_BINCUE, @@ -105,7 +110,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "BIN/CUE", "bin/cuesheet disk image driver", &cdio_have_bincue, - &cdio_open_bincue + &cdio_open_bincue, + &cdio_get_default_device_bincue }, {DRIVER_NRG, @@ -113,7 +119,8 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { "NRG", "Nero NRG disk image driver", &cdio_have_nrg, - &cdio_open_nrg + &cdio_open_nrg, + &cdio_get_default_device_nrg } }; @@ -151,14 +158,26 @@ cdio_get_arg (const CdIo *obj, const char key[]) /*! Return a string containing the default CD device if none is specified. + if CdIo is NULL (we haven't initialized a specific device driver), + then find a suitable one and return the default device for that. NULL is returned if we couldn't get a default device. */ char * cdio_get_default_device (const CdIo *obj) { - cdio_assert (obj != NULL); - + if (obj == NULL) { + driver_id_t driver_id; + /* Scan for driver */ + for (driver_id=DRIVER_UNKNOWN; driver_id<=MAX_DRIVER; driver_id++) { + if ( (*CdIo_all_drivers[driver_id].have_driver)() && + *CdIo_all_drivers[driver_id].get_default_device ) { + return (*CdIo_all_drivers[driver_id].get_default_device)(); + } + } + return NULL; + } + if (obj->op.get_default_device) { return obj->op.get_default_device (); } else { @@ -255,6 +274,28 @@ cdio_get_track_lba(const CdIo *obj, track_t track_num) } } +/*! + Return the starting LSN for track number + track_num in obj. Tracks numbers start at 1. + The "leadout" track is specified either by + using track_num LEADOUT_TRACK or the total tracks+1. + CDIO_INVALID_LBA is returned on error. +*/ +lsn_t +cdio_get_track_lsn(const CdIo *obj, track_t track_num) +{ + if (obj == NULL) return CDIO_INVALID_LBA; + + if (obj->op.get_track_lba) { + return cdio_lba_to_lsn(obj->op.get_track_lba (obj->user_data, track_num)); + } else { + msf_t msf; + if (cdio_get_track_msf(obj, track_num, &msf)) + return cdio_msf_to_lsn(&msf); + return CDIO_INVALID_LSN; + } +} + /*! Return the starting MSF (minutes/secs/frames) for track number track_num in obj. Track numbers start at 1. @@ -382,6 +423,17 @@ cdio_read (CdIo *obj, void *buf, size_t size) return -1; } +int +cdio_read_audio_sector (CdIo *obj, void *buf, lsn_t lsn) +{ + cdio_assert (obj != NULL); + cdio_assert (buf != NULL); + + if (obj->op.read_audio_sector != NULL) + return obj->op.read_audio_sector (obj->user_data, buf, lsn); + return -1; +} + int cdio_read_mode2_sectors (CdIo *obj, void *buf, lsn_t lsn, bool mode2raw, unsigned num_sectors) @@ -436,6 +488,20 @@ cdio_set_arg (CdIo *obj, const char key[], const char value[]) return obj->op.set_arg (obj->user_data, key, value); } +static CdIo * +scan_for_driver(driver_id_t start, driver_id_t end, const char *source_name) +{ + driver_id_t driver_id; + + for (driver_id=start; driver_id<=end; driver_id++) { + if ((*CdIo_all_drivers[driver_id].have_driver)()) { + CdIo *ret=(*CdIo_all_drivers[driver_id].driver_open)(source_name); + if (ret != NULL) return ret; + } + } + return NULL; +} + /*! Sets up to read from place specified by source_name and driver_id This should be called before using any other routine, except cdio_init. This will call cdio_init, if that hasn't been @@ -461,13 +527,8 @@ cdio_open (const char *source_name, driver_id_t driver_id) case DRIVER_DEVICE: { /* Scan for a driver. */ - for (driver_id=DRIVER_UNKNOWN; driver_id<=MAX_DRIVER; driver_id++) { - if ((*CdIo_all_drivers[driver_id].have_driver)()) { - CdIo *ret=(*CdIo_all_drivers[driver_id].driver_open)(source_name); - if (ret != NULL) return ret; - } - } - return NULL; + CdIo *ret = scan_for_driver(DRIVER_UNKNOWN, MAX_DRIVER, source_name); + return ret; } break; case DRIVER_BSDI: @@ -496,18 +557,10 @@ cdio_open (const char *source_name, driver_id_t driver_id) CdIo * cdio_open_cd (const char *source_name) { - driver_id_t driver_id; - if (CdIo_last_driver == -1) cdio_init(); /* Scan for a driver. */ - for (driver_id=DRIVER_UNKNOWN; driver_id<=MAX_DRIVER; driver_id++) { - if ((*CdIo_all_drivers[driver_id].have_driver)()) { - CdIo *ret=(*CdIo_all_drivers[driver_id].driver_open)(source_name); - if (ret != NULL) return ret; - } - } - return NULL; + return scan_for_driver(DRIVER_UNKNOWN, MAX_DRIVER, source_name); } diff --git a/lib/cdio.h b/lib/cdio.h index d245d099..6101aea5 100644 --- a/lib/cdio.h +++ b/lib/cdio.h @@ -1,5 +1,5 @@ /* - $Id: cdio.h,v 1.7 2003/04/06 06:45:13 rocky Exp $ + $Id: cdio.h,v 1.8 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -110,7 +110,9 @@ extern "C" { /*! Return a string containing the default CD device if none is specified. - + if CdIo is NULL (we haven't initialized a specific device driver), + then find a suitable one and return the default device for that. + NULL is returned if we couldn't get a default device. */ char * cdio_get_default_device (const CdIo *obj); @@ -150,6 +152,15 @@ extern "C" { */ lba_t cdio_get_track_lba(const CdIo *obj, track_t track_num); + /*! + Return the starting LSN for track number + track_num in obj. Tracks numbers start at 1. + The "leadout" track is specified either by + using track_num LEADOUT_TRACK or the total tracks+1. + CDIO_INVALID_LBA is returned on error. + */ + lsn_t cdio_get_track_lsn(const CdIo *obj, track_t track_num); + /*! Return the starting MSF (minutes/secs/frames) for track number track_num in obj. Track numbers start at 1. @@ -182,6 +193,12 @@ extern "C" { */ ssize_t cdio_read(CdIo *obj, void *buf, size_t size); + /*! + Reads a single mode2 sector from cd device into data starting + from lsn. Returns 0 if no error. + */ + int cdio_read_audio_sector (CdIo *obj, void *buf, lsn_t lsn); + /*! Reads a single mode2 sector from cd device into data starting from lsn. Returns 0 if no error. @@ -238,7 +255,9 @@ extern "C" { */ CdIo * cdio_open_bincue (const char *bin_name); - /*! cdrao CD routines. Source is the some sort of device. + char * cdio_get_default_device_bincue(void); + + /*! CD routines. Source is the some sort of device. NULL is returned on error. */ @@ -255,26 +274,36 @@ extern "C" { */ CdIo * cdio_open_bsdi (const char *source_name); + char * cdio_get_default_device_bsdi(void); + /*! BSDI CD-reading routines. NULL is returned on error. */ CdIo * cdio_open_freebsd (const char *source_name); + char * cdio_get_default_device_freebsd(void); + /*! Linux CD-reading routines. NULL is returned on error. */ CdIo * cdio_open_linux (const char *source_name); + + char * cdio_get_default_device_linux(void); /*! Solaris CD-reading routines. NULL is returned on error. */ CdIo * cdio_open_solaris (const char *soruce_name); + char * cdio_get_default_device_solaris(void); + /*! Nero CD disk-image routines. NULL is returned on error. */ CdIo * cdio_open_nrg (const char *source_name); + char * cdio_get_default_device_nrg(void); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/lib/cdio_private.h b/lib/cdio_private.h index fad7eb42..0776c5c4 100644 --- a/lib/cdio_private.h +++ b/lib/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.5 2003/04/07 11:31:19 rocky Exp $ + $Id: cdio_private.h,v 1.6 2003/04/10 04:13:41 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -122,6 +122,12 @@ extern "C" { */ ssize_t (*read) (void *user_data, void *buf, size_t size); + /*! + Reads a single mode2 sector from cd device into buf starting + from lsn. Returns 0 if no error. + */ + int (*read_audio_sector) (void *user_data, void *buf, lsn_t lsn); + /*! Reads a single mode2 sector from cd device into buf starting from lsn. Returns 0 if no error. @@ -191,6 +197,7 @@ extern "C" { const char *describe; bool (*have_driver) (void); CdIo *(*driver_open) (const char *source_name); + char *(*get_default_device) (void); } CdIo_driver_t; /* The below array gives of the drivers that are currently available for