diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 26e24038..27dcd41c 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.18 2003/09/17 12:16:42 rocky Exp $ + $Id: _cdio_linux.c,v 1.19 2003/09/18 13:31:07 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.18 2003/09/17 12:16:42 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.19 2003/09/18 13:31:07 rocky Exp $"; #include @@ -236,18 +236,24 @@ _set_bsize (int fd, unsigned int bsize) Can read only up to 25 blocks. */ static int -_read_packet_audio_sector (int fd, void *buf, lba_t lba) +_cdio_read_packet_raw_sector (int fd, void *buf, lba_t lba, int sector_type) { struct cdrom_generic_command cgc; const int nblocks = 1; memset (&cgc, 0, sizeof (struct cdrom_generic_command)); - cgc.cmd[0] = GPCMD_READ_CD; - cgc.cmd[1] = 0; /* Any type of sectors returned */ + cgc.cmd[0] = CDIO_MMC_GPCMD_READ_CD; + cgc.cmd[1] = sector_type << 2; /* Any type of sectors returned */ + /*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 */ - SCSI_MMC_SET_READ_LBA(cgc.cmd, lba); - SCSI_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); + CDIO_MMC_SET_READ_LBA(cgc.cmd, lba); + CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); cgc.cmd[9] = 0x78; /* All headers */ @@ -264,6 +270,15 @@ _read_packet_audio_sector (int fd, void *buf, lba_t lba) return 0; } +/* Packet driver to read mode2 sectors. + Can read only up to 25 blocks. +*/ +static int +_read_packet_audio_sector (int fd, void *buf, lsn_t lsn) +{ + return _cdio_read_packet_raw_sector( fd, buf, lsn, 1); +} + /* Packet driver to read mode2 sectors. Can read only up to 25 blocks. */ @@ -275,10 +290,10 @@ __read_packet_mode2_sectors (int fd, void *buf, lba_t lba, memset (&cgc, 0, sizeof (struct cdrom_generic_command)); - cgc.cmd[0] = use_read_10 ? GPCMD_READ_10 : GPCMD_READ_CD; + cgc.cmd[0] = use_read_10 ? GPCMD_READ_10 : CDIO_MMC_GPCMD_READ_CD; - SCSI_MMC_SET_READ_LBA(cgc.cmd, lba); - SCSI_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); + CDIO_MMC_SET_READ_LBA(cgc.cmd, lba); + CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); if (!use_read_10) { @@ -445,7 +460,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) case _AM_READ_CD: case _AM_READ_10: - if (_read_packet_audio_sector (_obj->gen.fd, buf, lsn)) { + if (_cdio_read_packet_raw_sector (_obj->gen.fd, buf, lsn, 0)) { perror ("ioctl()"); if (_obj->access_mode == _AM_READ_CD) { cdio_info ("READ_CD failed; switching to READ_10 mode..."); diff --git a/lib/scsi_mmc.h b/lib/scsi_mmc.h index 1b24166e..4b84cfbc 100644 --- a/lib/scsi_mmc.h +++ b/lib/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.1 2003/09/14 09:36:32 rocky Exp $ + $Id: scsi_mmc.h,v 1.2 2003/09/18 13:31:07 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -26,13 +26,15 @@ #ifndef __SCSI_MMC_H__ #define __SCSI_MMC_H__ -#define SCSI_MMC_SET_READ_LBA(rec, lba) \ +#define CDIO_MMC_GPCMD_READ_CD 0xbe + +#define CDIO_MMC_SET_READ_LBA(rec, lba) \ rec[2] = (lba >> 24) & 0xff; \ rec[3] = (lba >> 16) & 0xff; \ rec[4] = (lba >> 8) & 0xff; \ rec[5] = (lba ) & 0xff -#define SCSI_MMC_SET_READ_LENGTH(rec, len) \ +#define CDIO_MMC_SET_READ_LENGTH(rec, len) \ rec[6] = (len >> 16) & 0xff; \ rec[7] = (len >> 8) & 0xff; \ rec[8] = (len ) & 0xff