Change interface for read_audio_sectors.

This commit is contained in:
rocky
2003-09-20 12:34:02 +00:00
parent 6568624fb3
commit dd05f2e6ad
11 changed files with 157 additions and 174 deletions

View File

@@ -1,5 +1,5 @@
/* -*- c -*- /* -*- 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 <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -219,6 +219,13 @@ extern "C" {
*/ */
int cdio_read_audio_sector (const CdIo *obj, void *buf, lsn_t lsn); 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 Reads a single mode1 sector from cd device into data starting
from lsn. Returns 0 if no error. from lsn. Returns 0 if no error.

View File

@@ -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 <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -24,7 +24,7 @@
(*.cue). (*.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_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -463,7 +463,8 @@ _cdio_image_read_cue (_img_private_t *_obj)
from lsn. Returns 0 if no error. from lsn. Returns 0 if no error.
*/ */
static int 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; _img_private_t *_obj = user_data;
int ret; int ret;
@@ -477,7 +478,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn)
if (ret!=0) return ret; if (ret!=0) return ret;
ret = cdio_stream_read (_obj->gen.data_source, data, ret = cdio_stream_read (_obj->gen.data_source, data,
CDIO_CD_FRAMESIZE_RAW, 1); CDIO_CD_FRAMESIZE_RAW, nblocks);
} else { } else {
/* We need to pad out the first 272 bytes with 0's */ /* We need to pad out the first 272 bytes with 0's */
BZERO(data, 272); BZERO(data, 272);
@@ -487,7 +488,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn)
if (ret!=0) return ret; if (ret!=0) return ret;
ret = cdio_stream_read (_obj->gen.data_source, (uint8_t *) data+272, 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; return ret;
@@ -822,7 +823,7 @@ cdio_open_common (_img_private_t **_data)
.get_track_msf = _cdio_get_track_msf, .get_track_msf = _cdio_get_track_msf,
.lseek = _cdio_lseek, .lseek = _cdio_lseek,
.read = _cdio_read, .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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,

View File

@@ -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 <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #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 <cdio/sector.h> #include <cdio/sector.h>
#include <cdio/util.h> #include <cdio/util.h>
@@ -510,6 +510,7 @@ cdio_open_bsdi (const char *source_name)
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .read = cdio_generic_read,
.read_mode2_sector = _read_mode2_sector, .read_mode2_sector = _read_mode2_sector,
.read_audio_sectors = NULL,
.read_mode2_sectors = _read_mode2_sectors, .read_mode2_sectors = _read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,
.stat_size = _cdio_stat_size .stat_size = _cdio_stat_size

View File

@@ -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 <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #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 <string.h> #include <string.h>
@@ -236,19 +236,19 @@ _set_bsize (int fd, unsigned int bsize)
Can read only up to 25 blocks. Can read only up to 25 blocks.
*/ */
static int 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; typedef struct cdrom_generic_command cgc_t;
const int nblocks = 1; 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; cgc.cmd[0] = CDIO_MMC_GPCMD_READ_CD;
CDIO_MMC_SET_READ_TYPE (cgc.cmd, sector_type); CDIO_MMC_SET_READ_TYPE (cgc.cmd, sector_type);
CDIO_MMC_SET_READ_LBA (cgc.cmd, lba); CDIO_MMC_SET_READ_LBA (cgc.cmd, lba);
CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks);
CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cgc.cmd, CDIO_MMC_MCSB_ALL_HEADERS);
cgc.cmd[9] = 0x78; /* All headers */
cgc.buflen = CDIO_CD_FRAMESIZE_RAW * nblocks; cgc.buflen = CDIO_CD_FRAMESIZE_RAW * nblocks;
cgc.buffer = buf; cgc.buffer = buf;
@@ -263,13 +263,16 @@ _cdio_read_mmc_sector (int fd, void *buf, lba_t lba, int sector_type)
return 0; return 0;
} }
/* Packet driver to read mode2 sectors. /* MMC driver to read audio sectors.
Can read only up to 25 blocks. Can read only up to 25 blocks.
*/ */
static int 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. /* 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_CD:
case _AM_READ_10: case _AM_READ_10:
if (_cdio_read_mmc_sector (_obj->gen.fd, buf, lsn, if (_cdio_mmc_read_sectors (_obj->gen.fd, buf, lsn,
CDIO_MMC_READ_TYPE_ANY)) { CDIO_MMC_READ_TYPE_ANY, 1)) {
perror ("ioctl()"); perror ("ioctl()");
if (_obj->access_mode == _AM_READ_CD) { if (_obj->access_mode == _AM_READ_CD) {
cdio_info ("READ_CD failed; switching to READ_10 mode..."); 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, .get_track_msf = _cdio_get_track_msf,
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,

View File

@@ -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 <hvr@gnu.org> Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org>
@@ -38,7 +38,7 @@
#include "cdio_private.h" #include "cdio_private.h"
#include "_cdio_stdio.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 */ /* structures used */
@@ -595,7 +595,8 @@ _cdio_stat_size (void *user_data)
from LSN. Returns 0 if no error. from LSN. Returns 0 if no error.
*/ */
static int 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; _img_private_t *_obj = user_data;
@@ -621,7 +622,7 @@ _cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn)
SEEK_SET); SEEK_SET);
if (ret!=0) return ret; if (ret!=0) return ret;
ret = cdio_stream_read (_obj->gen.data_source, data, ret = cdio_stream_read (_obj->gen.data_source, data,
CDIO_CD_FRAMESIZE_RAW, 1); CDIO_CD_FRAMESIZE_RAW, nblocks);
if (ret==0) return ret; if (ret==0) return ret;
break; break;
} }
@@ -860,7 +861,7 @@ cdio_open_nrg (const char *source_name)
.get_track_msf = _cdio_get_track_msf, .get_track_msf = _cdio_get_track_msf,
.lseek = _cdio_lseek, .lseek = _cdio_lseek,
.read = _cdio_read, .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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,

View File

@@ -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 <rocky@panix.com> from vcdimager code Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> from vcdimager code
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -31,7 +31,7 @@
# include "config.h" # include "config.h"
#endif #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 <cdio/sector.h> #include <cdio/sector.h>
#include <cdio/util.h> #include <cdio/util.h>
@@ -184,9 +184,10 @@ _cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn,
Returns 0 if no error. Returns 0 if no error.
*/ */
static int 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, .get_track_msf = NULL,
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,

View File

@@ -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 <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -36,7 +36,7 @@
#ifdef HAVE_SOLARIS_CDROM #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 <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -112,6 +112,43 @@ _cdio_init (_img_private_t *_obj)
return true; 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. Reads a single mode2 sector from cd device into data starting from lsn.
Returns 0 if no error. 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: case _AM_SUN_CTRL_ATAPI:
{ {
struct uscsi_cmd sc; if (_cdio_mmc_read_sectors(_obj->gen.fd, &data, lsn,
union scsi_cdb cdb; CDIO_MMC_READ_TYPE_MODE2, 1)) {
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);
return 1; return 1;
} }
break; break;
@@ -225,6 +216,18 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
return 0; 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. Reads a single audio sector from CD device into data starting from lsn.
Returns 0 if no error. Returns 0 if no error.
@@ -232,13 +235,12 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
static int static int
_cdio_read_audio_sector (void *user_data, void *data, lsn_t lsn) _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, }; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf; struct cdrom_msf *msf = (struct cdrom_msf *) &buf;
msf_t _msf; msf_t _msf;
_img_private_t *_obj = user_data; cdio_lsn_to_msf (lsn, &_msf);
cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf);
msf->cdmsf_min0 = from_bcd8(_msf.m); msf->cdmsf_min0 = from_bcd8(_msf.m);
msf->cdmsf_sec0 = from_bcd8(_msf.s); msf->cdmsf_sec0 = from_bcd8(_msf.s);
msf->cdmsf_frame0 = from_bcd8(_msf.f); 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: case _AM_SUN_CTRL_ATAPI:
{ {
struct uscsi_cmd sc; if (_cdio_mmc_read_sectors(_obj->gen.fd, &data, lsn,
union scsi_cdb cdb; CDIO_MMC_READ_TYPE_CDDA, 1)) {
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);
return 1; return 1;
} }
break; break;
@@ -703,7 +664,7 @@ cdio_open_solaris (const char *source_name)
.get_track_msf = _cdio_get_track_msf, .get_track_msf = _cdio_get_track_msf,
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.stat_size = _cdio_stat_size, .stat_size = _cdio_stat_size,

View File

@@ -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 <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -26,7 +26,7 @@
# include "config.h" # include "config.h"
#endif #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 <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -113,7 +113,6 @@ typedef struct __RAW_READ_INFO {
#define SRB_DIR_OUT 0x10 #define SRB_DIR_OUT 0x10
#define SRB_EVENT_NOTIFY 0x40 #define SRB_EVENT_NOTIFY 0x40
#define READ_CD 0xbe
#define SECTOR_TYPE_MODE2 0x14 #define SECTOR_TYPE_MODE2 0x14
#define READ_CD_USERDATA_MODE2 0x10 #define READ_CD_USERDATA_MODE2 0x10
@@ -486,18 +485,15 @@ _cdio_win32_free (void *user_data)
Returns 0 if no error. Returns 0 if no error.
*/ */
static int 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; _img_private_t *_obj = user_data;
unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
if( _obj->hASPI ) { if( _obj->hASPI ) {
HANDLE hEvent; HANDLE hEvent;
struct SRB_ExecSCSICmd ssc; 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 */ /* Create the transfer completion event */
hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
@@ -506,18 +502,6 @@ _cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn)
} }
/* Data selection */ /* 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 ) ); 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; ssc.SRB_CDBLen = 12;
/* Operation code */ /* Operation code */
ssc.CDBByte[ 0 ] = READ_CD; ssc.CDBByte[ 0 ] = CDIO_MMC_GPCMD_READ_CD;
/* Start of LSN */ CDIO_MMC_SET_READ_TYPE(ssc.CDBByte, sector_type);
ssc.CDBByte[ 1 ] = (sector_type) << 2; CDIO_MMC_SET_READ_LBA(ssc.CDBByte, lsn);
CDIO_MMC_SET_READ_LENGTH(ssc.CDBByte, blocks);
SCSI_MMC_SET_READ_LBA(ssc.CDBByte, lsn); CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(ssc.CDBByte,
SCSI_MMC_SET_READ_LENGTH(ssc.CDBByte, blocks); CDIO_MMC_MCSB_ALL_HEADERS);
ssc.CDBByte[ 9 ] = (sync << 7) |
(header_code << 5) |
(user_data << 4) |
(edc_ecc << 3) |
(error_field << 1);
/* ssc.CDBByte[ 9 ] = READ_CD_USERDATA_MODE2; */
/* Result buffer */ /* Result buffer */
ssc.SRB_BufPointer = buf; ssc.SRB_BufPointer = buf;
@@ -590,6 +567,19 @@ _cdio_read_raw_sector (void *user_data, void *data, lsn_t lsn)
return 0; 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 Reads a single mode2 sector from cd device into data starting
from lsn. Returns 0 if no error. 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++; _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; if( ret != 0 ) return ret;
@@ -635,7 +625,7 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
*/ */
static int static int
_cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn, _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; _img_private_t *_obj = user_data;
int i; int i;
@@ -1094,7 +1084,7 @@ cdio_open_win32 (const char *source_name)
.get_track_msf = _cdio_get_track_msf, .get_track_msf = _cdio_get_track_msf,
.lseek = NULL, .lseek = NULL,
.read = 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_sector = _cdio_read_mode2_sector,
.read_mode2_sectors = _cdio_read_mode2_sectors, .read_mode2_sectors = _cdio_read_mode2_sectors,
.set_arg = _cdio_set_arg, .set_arg = _cdio_set_arg,

View File

@@ -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 <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -35,7 +35,7 @@
#include <cdio/logging.h> #include <cdio/logging.h>
#include "cdio_private.h" #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] = 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 (obj != NULL);
cdio_assert (buf != NULL); cdio_assert (buf != NULL);
if (obj->op.read_audio_sector != NULL) if (obj->op.read_audio_sectors != NULL)
return obj->op.read_audio_sector (obj->user_data, buf, lsn); 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; return -1;
} }

View File

@@ -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 <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -123,7 +123,8 @@ extern "C" {
Reads a single mode2 sector from cd device into buf starting Reads a single mode2 sector from cd device into buf starting
from lsn. Returns 0 if no error. 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 Reads a single mode2 sector from cd device into buf starting

View File

@@ -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 <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -55,4 +55,9 @@
rec[7] = (len >> 8) & 0xff; \ rec[7] = (len >> 8) & 0xff; \
rec[8] = (len ) & 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__ */ #endif /* __SCSI_MMC_H__ */