diff --git a/include/cdio/cdio.h b/include/cdio/cdio.h index 9e8acc4e..697f824b 100644 --- a/include/cdio/cdio.h +++ b/include/cdio/cdio.h @@ -1,5 +1,5 @@ /* -*- c -*- - $Id: cdio.h,v 1.19 2003/09/13 06:25:36 rocky Exp $ + $Id: cdio.h,v 1.20 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -219,6 +219,13 @@ extern "C" { */ int cdio_read_audio_sector (const CdIo *obj, void *buf, lsn_t lsn); + /*! + Reads a audio sector from cd device into data starting + from lsn. Returns 0 if no error. + */ + int cdio_read_audio_sectors (const CdIo *obj, void *buf, lsn_t lsn, + unsigned int nblocks); + /*! Reads a single mode1 sector from cd device into data starting from lsn. Returns 0 if no error. diff --git a/lib/_cdio_bincue.c b/lib/_cdio_bincue.c index 9261c6c3..2caecd37 100644 --- a/lib/_cdio_bincue.c +++ b/lib/_cdio_bincue.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bincue.c,v 1.28 2003/09/18 13:49:59 rocky Exp $ + $Id: _cdio_bincue.c,v 1.29 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -24,7 +24,7 @@ (*.cue). */ -static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.28 2003/09/18 13:49:59 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.29 2003/09/20 12:34:02 rocky Exp $"; #include "cdio_assert.h" #include "cdio_private.h" @@ -463,7 +463,8 @@ _cdio_image_read_cue (_img_private_t *_obj) from lsn. Returns 0 if no error. */ static int -_cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) +_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn, + unsigned int nblocks) { _img_private_t *_obj = user_data; int ret; @@ -477,7 +478,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) if (ret!=0) return ret; ret = cdio_stream_read (_obj->gen.data_source, data, - CDIO_CD_FRAMESIZE_RAW, 1); + CDIO_CD_FRAMESIZE_RAW, nblocks); } else { /* We need to pad out the first 272 bytes with 0's */ BZERO(data, 272); @@ -487,7 +488,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) if (ret!=0) return ret; ret = cdio_stream_read (_obj->gen.data_source, (uint8_t *) data+272, - CDIO_CD_FRAMESIZE_RAW - 272, 1); + CDIO_CD_FRAMESIZE_RAW - 272, nblocks); } return ret; @@ -822,7 +823,7 @@ cdio_open_common (_img_private_t **_data) .get_track_msf = _cdio_get_track_msf, .lseek = _cdio_lseek, .read = _cdio_read, - .read_audio_sector = _cdio_read_audio_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, diff --git a/lib/_cdio_bsdi.c b/lib/_cdio_bsdi.c index c6ea6825..6655d394 100644 --- a/lib/_cdio_bsdi.c +++ b/lib/_cdio_bsdi.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bsdi.c,v 1.11 2003/09/01 15:11:36 rocky Exp $ + $Id: _cdio_bsdi.c,v 1.12 2003/09/20 12:34:02 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_bsdi.c,v 1.11 2003/09/01 15:11:36 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.12 2003/09/20 12:34:02 rocky Exp $"; #include #include @@ -510,6 +510,7 @@ cdio_open_bsdi (const char *source_name) .lseek = cdio_generic_lseek, .read = cdio_generic_read, .read_mode2_sector = _read_mode2_sector, + .read_audio_sectors = NULL, .read_mode2_sectors = _read_mode2_sectors, .set_arg = _cdio_set_arg, .stat_size = _cdio_stat_size diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 6eb53217..489c7780 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.20 2003/09/19 04:37:31 rocky Exp $ + $Id: _cdio_linux.c,v 1.21 2003/09/20 12:34:02 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_linux.c,v 1.20 2003/09/19 04:37:31 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.21 2003/09/20 12:34:02 rocky Exp $"; #include @@ -236,19 +236,19 @@ _set_bsize (int fd, unsigned int bsize) Can read only up to 25 blocks. */ static int -_cdio_read_mmc_sector (int fd, void *buf, lba_t lba, int sector_type) +_cdio_mmc_read_sectors (int fd, void *buf, lba_t lba, int sector_type, + unsigned int nblocks) { - struct cdrom_generic_command cgc; - const int nblocks = 1; + typedef struct cdrom_generic_command cgc_t; + cgc_t cgc; - memset (&cgc, 0, sizeof (struct cdrom_generic_command)); + memset (&cgc, 0, sizeof (cgc_t)); cgc.cmd[0] = CDIO_MMC_GPCMD_READ_CD; CDIO_MMC_SET_READ_TYPE (cgc.cmd, sector_type); CDIO_MMC_SET_READ_LBA (cgc.cmd, lba); CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); - - cgc.cmd[9] = 0x78; /* All headers */ + CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cgc.cmd, CDIO_MMC_MCSB_ALL_HEADERS); cgc.buflen = CDIO_CD_FRAMESIZE_RAW * nblocks; cgc.buffer = buf; @@ -263,13 +263,16 @@ _cdio_read_mmc_sector (int fd, void *buf, lba_t lba, int sector_type) return 0; } -/* Packet driver to read mode2 sectors. +/* MMC driver to read audio sectors. Can read only up to 25 blocks. */ static int -_read_packet_audio_sector (int fd, void *buf, lsn_t lsn) +_cdio_read_audio_sectors (void *user_data, void *buf, lsn_t lsn, + unsigned int nblocks) { - return _cdio_read_mmc_sector( fd, buf, lsn, CDIO_MMC_READ_TYPE_CDDA); + _img_private_t *_obj = user_data; + return _cdio_mmc_read_sectors( _obj->gen.fd, buf, lsn, + CDIO_MMC_READ_TYPE_CDDA, nblocks); } /* Packet driver to read mode2 sectors. @@ -453,8 +456,8 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) case _AM_READ_CD: case _AM_READ_10: - if (_cdio_read_mmc_sector (_obj->gen.fd, buf, lsn, - CDIO_MMC_READ_TYPE_ANY)) { + if (_cdio_mmc_read_sectors (_obj->gen.fd, buf, lsn, + CDIO_MMC_READ_TYPE_ANY, 1)) { perror ("ioctl()"); if (_obj->access_mode == _AM_READ_CD) { cdio_info ("READ_CD failed; switching to READ_10 mode..."); @@ -949,7 +952,7 @@ cdio_open_linux (const char *orig_source_name) .get_track_msf = _cdio_get_track_msf, .lseek = cdio_generic_lseek, .read = cdio_generic_read, - .read_audio_sector = _cdio_read_audio_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, diff --git a/lib/_cdio_nrg.c b/lib/_cdio_nrg.c index 85d14748..c750dfa8 100644 --- a/lib/_cdio_nrg.c +++ b/lib/_cdio_nrg.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_nrg.c,v 1.16 2003/09/14 07:02:17 rocky Exp $ + $Id: _cdio_nrg.c,v 1.17 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2001,2003 Herbert Valerio Riedel @@ -38,7 +38,7 @@ #include "cdio_private.h" #include "_cdio_stdio.h" -static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.16 2003/09/14 07:02:17 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.17 2003/09/20 12:34:02 rocky Exp $"; /* structures used */ @@ -595,7 +595,8 @@ _cdio_stat_size (void *user_data) from LSN. Returns 0 if no error. */ static int -_cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) +_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn, + unsigned int nblocks) { _img_private_t *_obj = user_data; @@ -621,7 +622,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) SEEK_SET); if (ret!=0) return ret; ret = cdio_stream_read (_obj->gen.data_source, data, - CDIO_CD_FRAMESIZE_RAW, 1); + CDIO_CD_FRAMESIZE_RAW, nblocks); if (ret==0) return ret; break; } @@ -860,7 +861,7 @@ cdio_open_nrg (const char *source_name) .get_track_msf = _cdio_get_track_msf, .lseek = _cdio_lseek, .read = _cdio_read, - .read_audio_sector = _cdio_read_audio_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, diff --git a/lib/_cdio_osx.c b/lib/_cdio_osx.c index 1b1d3665..3f0a82f4 100644 --- a/lib/_cdio_osx.c +++ b/lib/_cdio_osx.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_osx.c,v 1.6 2003/09/15 01:37:32 rocky Exp $ + $Id: _cdio_osx.c,v 1.7 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2003 Rocky Bernstein from vcdimager code Copyright (C) 2001 Herbert Valerio Riedel @@ -31,7 +31,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.6 2003/09/15 01:37:32 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.7 2003/09/20 12:34:02 rocky Exp $"; #include #include @@ -184,9 +184,10 @@ _cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn, Returns 0 if no error. */ static int -_cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) +_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn, + unsigned int nblocks) { - return _cdio_read_mode2_sectors(user_data, data, lsn, true, 1); + return _cdio_read_mode2_sectors(user_data, data, lsn, true, nblocks); } /*! @@ -643,7 +644,7 @@ cdio_open_osx (const char *source_name) .get_track_msf = NULL, .lseek = cdio_generic_lseek, .read = cdio_generic_read, - .read_audio_sector = _cdio_read_audio_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, diff --git a/lib/_cdio_sunos.c b/lib/_cdio_sunos.c index c817a549..375eb520 100644 --- a/lib/_cdio_sunos.c +++ b/lib/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.16 2003/09/14 09:34:17 rocky Exp $ + $Id: _cdio_sunos.c,v 1.17 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -36,7 +36,7 @@ #ifdef HAVE_SOLARIS_CDROM -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.16 2003/09/14 09:34:17 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.17 2003/09/20 12:34:02 rocky Exp $"; #include #include @@ -112,6 +112,43 @@ _cdio_init (_img_private_t *_obj) return true; } +static int +_cdio_mmc_read_sectors (int fd, void *buf, lsn_t lsn, int sector_type, + unsigned int nblocks) +{ + struct uscsi_cmd sc; + union scsi_cdb cdb; + int sub_channel = 0; + + memset(&cdb, 0, sizeof(cdb)); + memset(&sc, 0, sizeof(sc)); + + cdb.scc_cmd = CDIO_MMC_GPCMD_READ_CD; + CDIO_MMC_SET_READ_TYPE(cdb.cdb_opaque, sector_type); + CDIO_MMC_SET_READ_LBA(cdb.cdb_opaque, lsn); + CDIO_MMC_SET_READ_LENGTH(cdb.cdb_opaque, blocks); + CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb.cdb_opaque, + CDIO_MMC_MCSB_ALL_HEADERS); + cdb.cdb_opaque[10] = sub_channel; + + sc.uscsi_cdb = (caddr_t)&cdb; + sc.uscsi_cdblen = 12; + sc.uscsi_bufaddr = (caddr_t) buf; + sc.uscsi_buflen = CDIO_CD_FRAMESIZE_RAW; + sc.uscsi_flags = USCSI_ISOLATE | USCSI_READ; + sc.uscsi_timeout = 20; + if (ioctl(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 sc.uscsi_status; +} + /*! Reads a single mode2 sector from cd device into data starting from lsn. Returns 0 if no error. @@ -163,54 +200,8 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, 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 = 0; /* all types */ - /*sector_type = 1;*/ /* CD-DA */ - /*sector_type = 2;*/ /* mode1 */ - /*sector_type = 3;*/ /* mode2 */ - /*sector_type = 4;*/ /* mode2/form1 */ - /*sector_type = 5;*/ /* mode2/form2 */ - 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; - - SCSI_MMC_SET_READ_LBA(cdb.cdb_opaque, lsn); - SCSI_MMC_SET_READ_LENGTH(cdb.cdb_opaque, blocks); - - 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) buf; - sc.uscsi_buflen = M2RAW_SECTOR_SIZE; - 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); + if (_cdio_mmc_read_sectors(_obj->gen.fd, &data, lsn, + CDIO_MMC_READ_TYPE_MODE2, 1)) { return 1; } break; @@ -225,6 +216,18 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, return 0; } +/* MMC driver to read audio sectors. + Can read only up to 25 blocks. +*/ +static int +_cdio_read_audio_sectors (void *user_data, void *buf, lsn_t lsn, + unsigned int nblocks) +{ + _img_private_t *_obj = user_data; + return _cdio_mmc_read_sectors( _obj->gen.fd, buf, lsn, + CDIO_MMC_READ_TYPE_CDDA, nblocks); +} + /*! Reads a single audio sector from CD device into data starting from lsn. Returns 0 if no error. @@ -232,13 +235,12 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, static int _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) { + _img_private_t *_obj = user_data; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; struct cdrom_msf *msf = (struct cdrom_msf *) &buf; msf_t _msf; - _img_private_t *_obj = user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); + cdio_lsn_to_msf (lsn, &_msf); msf->cdmsf_min0 = from_bcd8(_msf.m); msf->cdmsf_sec0 = from_bcd8(_msf.s); msf->cdmsf_frame0 = from_bcd8(_msf.f); @@ -275,49 +277,8 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) 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; - - SCSI_MMC_SET_READ_LBA(cdb.cdb_opaque, lsn); - SCSI_MMC_SET_READ_LENGTH(cdb.cdb_opaque, blocks); - - 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) buf; - sc.uscsi_buflen = CDIO_CD_FRAMESIZE_RAW; - 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); + if (_cdio_mmc_read_sectors(_obj->gen.fd, &data, lsn, + CDIO_MMC_READ_TYPE_CDDA, 1)) { return 1; } break; @@ -703,7 +664,7 @@ cdio_open_solaris (const char *source_name) .get_track_msf = _cdio_get_track_msf, .lseek = cdio_generic_lseek, .read = cdio_generic_read, - .read_audio_sector = _cdio_read_audio_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .stat_size = _cdio_stat_size, diff --git a/lib/_cdio_win32.c b/lib/_cdio_win32.c index 16b4b2d6..085ca1ef 100644 --- a/lib/_cdio_win32.c +++ b/lib/_cdio_win32.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_win32.c,v 1.11 2003/09/14 09:34:18 rocky Exp $ + $Id: _cdio_win32.c,v 1.12 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_win32.c,v 1.11 2003/09/14 09:34:18 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_win32.c,v 1.12 2003/09/20 12:34:02 rocky Exp $"; #include #include @@ -113,7 +113,6 @@ typedef struct __RAW_READ_INFO { #define SRB_DIR_OUT 0x10 #define SRB_EVENT_NOTIFY 0x40 -#define READ_CD 0xbe #define SECTOR_TYPE_MODE2 0x14 #define READ_CD_USERDATA_MODE2 0x10 @@ -486,18 +485,15 @@ _cdio_win32_free (void *user_data) Returns 0 if no error. */ static int -_cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn) +_cdio_mmc_read_sectors (void *user_data, void *data, lsn_t lsn, + int sector_type, unsigned int nblocks) { - unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; _img_private_t *_obj = user_data; + unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; if( _obj->hASPI ) { HANDLE hEvent; struct SRB_ExecSCSICmd ssc; - int blocks = 1; - int sector_type; - int sync, header_code, user_data, edc_ecc, error_field; - int sub_channel; /* Create the transfer completion event */ hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); @@ -506,18 +502,6 @@ _cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn) } /* Data selection */ - sector_type = 0; /* all types */ - /*sector_type = 1;*/ /* CD-DA */ - /*sector_type = 2;*/ /* mode1 */ - /*sector_type = 3;*/ /* mode2 */ - /*sector_type = 4;*/ /* mode2/form1 */ - /*sector_type = 5;*/ /* mode2/form2 */ - sync = 0; - header_code = 2; - user_data = 1; - edc_ecc = 0; - error_field = 0; - sub_channel = 0; memset( &ssc, 0, sizeof( ssc ) ); @@ -531,20 +515,13 @@ _cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn) ssc.SRB_CDBLen = 12; /* Operation code */ - ssc.CDBByte[ 0 ] = READ_CD; + ssc.CDBByte[ 0 ] = CDIO_MMC_GPCMD_READ_CD; - /* Start of LSN */ - ssc.CDBByte[ 1 ] = (sector_type) << 2; - - SCSI_MMC_SET_READ_LBA(ssc.CDBByte, lsn); - SCSI_MMC_SET_READ_LENGTH(ssc.CDBByte, blocks); - - ssc.CDBByte[ 9 ] = (sync << 7) | - (header_code << 5) | - (user_data << 4) | - (edc_ecc << 3) | - (error_field << 1); - /* ssc.CDBByte[ 9 ] = READ_CD_USERDATA_MODE2; */ + CDIO_MMC_SET_READ_TYPE(ssc.CDBByte, sector_type); + CDIO_MMC_SET_READ_LBA(ssc.CDBByte, lsn); + CDIO_MMC_SET_READ_LENGTH(ssc.CDBByte, blocks); + CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(ssc.CDBByte, + CDIO_MMC_MCSB_ALL_HEADERS); /* Result buffer */ ssc.SRB_BufPointer = buf; @@ -590,6 +567,19 @@ _cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn) return 0; } +/*! + Reads an audio device into data starting from lsn. + Returns 0 if no error. + */ +static int +_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn, + unsigned int nblocks) +{ + _img_private_t *_obj = user_data; + return _cdio_mmc_read_sectors( user_data, data, lsn, + CDIO_MMC_READ_TYPE_CDDA, nblocks ); +} + /*! Reads a single mode2 sector from cd device into data starting from lsn. Returns 0 if no error. @@ -616,7 +606,7 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, _obj->gen.ioctls_debugged++; - ret = _cdio_read_raw_sector(user_data, buf, lsn); + ret = _cdio_mmc_read_sectors(user_data, buf, lsn, CDIO_MMC_READ_TYPE_ANY, 1); if( ret != 0 ) return ret; @@ -635,7 +625,7 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, */ static int _cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn, - bool mode2_form2, unsigned nblocks) + bool mode2_form2, unsigned int nblocks) { _img_private_t *_obj = user_data; int i; @@ -1094,7 +1084,7 @@ cdio_open_win32 (const char *source_name) .get_track_msf = _cdio_get_track_msf, .lseek = NULL, .read = NULL, - .read_audio_sector = _cdio_read_raw_sector, + .read_audio_sectors = _cdio_read_audio_sectors, .read_mode2_sector = _cdio_read_mode2_sector, .read_mode2_sectors = _cdio_read_mode2_sectors, .set_arg = _cdio_set_arg, diff --git a/lib/cdio.c b/lib/cdio.c index 70be9ce0..94ffd309 100644 --- a/lib/cdio.c +++ b/lib/cdio.c @@ -1,5 +1,5 @@ /* - $Id: cdio.c,v 1.25 2003/09/14 14:34:51 rocky Exp $ + $Id: cdio.c,v 1.26 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 2001 Herbert Valerio Riedel @@ -35,7 +35,7 @@ #include #include "cdio_private.h" -static const char _rcsid[] = "$Id: cdio.c,v 1.25 2003/09/14 14:34:51 rocky Exp $"; +static const char _rcsid[] = "$Id: cdio.c,v 1.26 2003/09/20 12:34:02 rocky Exp $"; const char *track_format2str[6] = @@ -505,8 +505,20 @@ cdio_read_audio_sector (const 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); + if (obj->op.read_audio_sectors != NULL) + return obj->op.read_audio_sectors (obj->user_data, buf, lsn, 1); + return -1; +} + +int +cdio_read_audio_sectors (const CdIo *obj, void *buf, lsn_t lsn, + unsigned int nblocks) +{ + cdio_assert (obj != NULL); + cdio_assert (buf != NULL); + + if (obj->op.read_audio_sectors != NULL) + return obj->op.read_audio_sectors (obj->user_data, buf, lsn, nblocks); return -1; } diff --git a/lib/cdio_private.h b/lib/cdio_private.h index f6e9b6e1..2a79d5fc 100644 --- a/lib/cdio_private.h +++ b/lib/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.12 2003/09/18 13:40:54 rocky Exp $ + $Id: cdio_private.h,v 1.13 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -123,7 +123,8 @@ extern "C" { 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); + int (*read_audio_sectors) (void *user_data, void *buf, lsn_t lsn, + unsigned int nblocks); /*! Reads a single mode2 sector from cd device into buf starting diff --git a/lib/scsi_mmc.h b/lib/scsi_mmc.h index 5171a254..40f80399 100644 --- a/lib/scsi_mmc.h +++ b/lib/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.3 2003/09/19 04:36:41 rocky Exp $ + $Id: scsi_mmc.h,v 1.4 2003/09/20 12:34:02 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -55,4 +55,9 @@ rec[7] = (len >> 8) & 0xff; \ rec[8] = (len ) & 0xff +#define CDIO_MMC_MCSB_ALL_HEADERS 0x78 + +#define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(rec, val) \ + rec[9] = val; + #endif /* __SCSI_MMC_H__ */