Change interface for read_audio_sectors.
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
20
lib/cdio.c
20
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 <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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user