Tighten code by putting more generic routines in cdio_generic:

to get first track number and number of tracks
  to get discmode

everybody now has gen.i_tracks and gen.i_first_track.

test/* format of output changed yet again.
This commit is contained in:
rocky
2004-07-29 02:16:20 +00:00
parent e606f025a0
commit 0d8a3e2a82
22 changed files with 285 additions and 302 deletions

View File

@@ -1,5 +1,5 @@
/* /*
$Id: scsi_mmc.h,v 1.21 2004/07/28 11:45:21 rocky Exp $ $Id: scsi_mmc.h,v 1.22 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -138,6 +138,9 @@ typedef enum scsi_mmc_direction {
#define CDIO_MMC_SET_READ_TYPE(cdb, sector_type) \ #define CDIO_MMC_SET_READ_TYPE(cdb, sector_type) \
cdb[1] = (sector_type << 2) cdb[1] = (sector_type << 2)
#define CDIO_MMC_SET_LEN16(cdb, pos, len) \
cdb[pos ] = (len >> 8) & 0xff; \
cdb[pos+1] = (len ) & 0xff
#define CDIO_MMC_SET_READ_LBA(cdb, lba) \ #define CDIO_MMC_SET_READ_LBA(cdb, lba) \
cdb[2] = (lba >> 24) & 0xff; \ cdb[2] = (lba >> 24) & 0xff; \
@@ -154,8 +157,7 @@ typedef enum scsi_mmc_direction {
cdb[8] = (len ) & 0xff cdb[8] = (len ) & 0xff
#define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \ #define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \
cdb[7] = (len >> 8) & 0xff; \ CDIO_MMC_SET_LEN16(cdb, 7, len)
cdb[8] = (len ) & 0xff
#define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \ #define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \
cdb[8] = (len ) & 0xff cdb[8] = (len ) & 0xff

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_generic.c,v 1.19 2004/06/26 00:39:00 rocky Exp $ $Id: _cdio_generic.c,v 1.20 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.19 2004/06/26 00:39:00 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.20 2004/07/29 02:16:20 rocky Exp $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -225,3 +225,123 @@ cdio_add_device_list(char **device_list[], const char *drive, int *num_drives)
} }
/*!
Get disc type associated with cd object.
*/
discmode_t
get_discmode_generic (void *p_user_data )
{
generic_img_private_t *p_env = p_user_data;
track_t i_track;
discmode_t discmode=CDIO_DISC_MODE_NO_INFO;
/* See if this is a DVD. */
cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */
dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL;
dvd.physical.layer_num = 0;
if (0 == scsi_mmc_get_dvd_struct_physical (p_env->cdio, &dvd)) {
switch(dvd.physical.layer[0].book_type) {
case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM;
case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM;
case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R;
case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW;
case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR;
case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW;
default: return CDIO_DISC_MODE_DVD_OTHER;
}
}
if (!p_env->toc_init)
p_env->cdio->op.read_toc (p_user_data);
if (!p_env->toc_init)
return CDIO_DISC_MODE_NO_INFO;
for (i_track = p_env->i_first_track;
i_track < p_env->i_first_track + p_env->i_tracks ;
i_track ++) {
track_format_t track_fmt =
p_env->cdio->op.get_track_format(p_env, i_track);
switch(track_fmt) {
case TRACK_FORMAT_AUDIO:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DA;
break;
case CDIO_DISC_MODE_CD_DA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_XA:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_XA;
break;
case CDIO_DISC_MODE_CD_XA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_DATA:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DATA;
break;
case CDIO_DISC_MODE_CD_DATA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_ERROR:
default:
discmode = CDIO_DISC_MODE_ERROR;
}
}
return discmode;
}
/*!
Return the number of of the first track.
CDIO_INVALID_TRACK is returned on error.
*/
track_t
get_first_track_num_generic(void *p_user_data)
{
generic_img_private_t *p_env = p_user_data;
if (!p_env->toc_init)
p_env->cdio->op.read_toc (p_user_data);
return p_env->toc_init ? p_env->i_first_track : CDIO_INVALID_TRACK;
}
/*!
Return the number of tracks in the current medium.
*/
track_t
get_num_tracks_generic(void *p_user_data)
{
generic_img_private_t *p_env = p_user_data;
if (!p_env->toc_init)
p_env->cdio->op.read_toc (p_user_data);
return p_env->toc_init ? p_env->i_tracks : CDIO_INVALID_TRACK;
}

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_linux.c,v 1.85 2004/07/28 11:45:21 rocky Exp $ $Id: _cdio_linux.c,v 1.86 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 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.85 2004/07/28 11:45:21 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.86 2004/07/29 02:16:20 rocky Exp $";
#include <string.h> #include <string.h>
@@ -70,12 +70,6 @@ static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.85 2004/07/28 11:45:21 rock
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
/* Default value in milliseconds we will wait for a command to
complete. */
#define DEFAULT_TIMEOUT 500
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
typedef enum { typedef enum {
_AM_NONE, _AM_NONE,
_AM_IOCTL, _AM_IOCTL,
@@ -109,7 +103,7 @@ typedef struct {
/**** prototypes for static functions ****/ /**** prototypes for static functions ****/
static bool is_cdrom_linux(const char *drive, char *mnttype); static bool is_cdrom_linux(const char *drive, char *mnttype);
static bool read_toc_linux (_img_private_t *p_env); static bool read_toc_linux (void *p_user_data);
static int run_scsi_cmd_linux( const void *p_user_data, static int run_scsi_cmd_linux( const void *p_user_data,
unsigned int i_timeout, unsigned int i_timeout,
unsigned int i_cdb, unsigned int i_cdb,
@@ -229,20 +223,6 @@ get_arg_linux (void *env, const char key[])
return NULL; return NULL;
} }
/*!
Return the number of of the first track.
CDIO_INVALID_TRACK is returned on error.
*/
static track_t
get_first_track_num_linux(void *p_user_data)
{
_img_private_t *p_env = p_user_data;
if (!p_env->gen.toc_init) read_toc_linux (p_env) ;
return p_env->gen.toc_init ? p_env->gen.i_first_track : CDIO_INVALID_TRACK;
}
/*! /*!
Return the the kind of drive capabilities of device. Return the the kind of drive capabilities of device.
@@ -251,12 +231,12 @@ get_first_track_num_linux(void *p_user_data)
*/ */
static void static void
get_drive_cap_linux (const void *env, get_drive_cap_linux (const void *p_user_data,
cdio_drive_read_cap_t *p_read_cap, cdio_drive_read_cap_t *p_read_cap,
cdio_drive_write_cap_t *p_write_cap, cdio_drive_write_cap_t *p_write_cap,
cdio_drive_misc_cap_t *p_misc_cap) cdio_drive_misc_cap_t *p_misc_cap)
{ {
const _img_private_t *_obj = env; const _img_private_t *_obj = p_user_data;
int32_t i_drivetype; int32_t i_drivetype;
i_drivetype = ioctl (_obj->gen.fd, CDROM_GET_CAPABILITY, CDSL_CURRENT); i_drivetype = ioctl (_obj->gen.fd, CDROM_GET_CAPABILITY, CDSL_CURRENT);
@@ -327,20 +307,6 @@ _get_mcn_linux (const void *env) {
return strdup(mcn.medium_catalog_number); return strdup(mcn.medium_catalog_number);
} }
/*!
Return the number of tracks in the current medium.
CDIO_INVALID_TRACK is returned on error.
*/
static track_t
_get_num_tracks_linux(void *p_user_data)
{
_img_private_t *p_env = p_user_data;
if (!p_env->gen.toc_init) read_toc_linux (p_env) ;
return p_env->gen.toc_init ? TOTAL_TRACKS : CDIO_INVALID_TRACK;
}
/*! /*!
Get format of track. Get format of track.
*/ */
@@ -349,7 +315,7 @@ _get_track_format_linux(void *p_user_data, track_t i_track)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track)
|| i_track < p_env->gen.i_first_track) || i_track < p_env->gen.i_first_track)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
@@ -383,9 +349,9 @@ _get_track_green_linux(void *p_user_data, track_t i_track)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
if (!p_env->gen.toc_init) read_toc_linux (p_env) ; if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ;
if (i_track >= (TOTAL_TRACKS+p_env->gen.i_first_track) if (i_track >= (p_env->gen.i_tracks+p_env->gen.i_first_track)
|| i_track < p_env->gen.i_first_track) || i_track < p_env->gen.i_first_track)
return false; return false;
@@ -413,12 +379,12 @@ _get_track_msf_linux(void *p_user_data, track_t i_track, msf_t *msf)
if (NULL == msf) return false; if (NULL == msf) return false;
if (!p_env->gen.toc_init) read_toc_linux (p_env) ; if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ;
if (i_track == CDIO_CDROM_LEADOUT_TRACK) if (i_track == CDIO_CDROM_LEADOUT_TRACK)
i_track = TOTAL_TRACKS + p_env->gen.i_first_track; i_track = p_env->gen.i_tracks + p_env->gen.i_first_track;
if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track)
|| i_track < p_env->gen.i_first_track) { || i_track < p_env->gen.i_first_track) {
return false; return false;
} else { } else {
@@ -838,8 +804,9 @@ _read_mode2_sectors_linux (void *p_user_data, void *data, lsn_t lsn,
Return false if successful or true if an error. Return false if successful or true if an error.
*/ */
static bool static bool
read_toc_linux (_img_private_t *p_env) read_toc_linux (void *p_user_data)
{ {
_img_private_t *p_env = p_user_data;
int i; int i;
/* read TOC header */ /* read TOC header */
@@ -850,9 +817,10 @@ read_toc_linux (_img_private_t *p_env)
} }
p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; p_env->gen.i_first_track = p_env->tochdr.cdth_trk0;
p_env->gen.i_tracks = p_env->tochdr.cdth_trk1;
/* read individual tracks */ /* read individual tracks */
for (i= p_env->gen.i_first_track; i<=TOTAL_TRACKS; i++) { for (i= p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++) {
p_env->tocent[i-p_env->gen.i_first_track].cdte_track = i; p_env->tocent[i-p_env->gen.i_first_track].cdte_track = i;
p_env->tocent[i-p_env->gen.i_first_track].cdte_format = CDROM_MSF; p_env->tocent[i-p_env->gen.i_first_track].cdte_format = CDROM_MSF;
if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
@@ -872,11 +840,11 @@ read_toc_linux (_img_private_t *p_env)
} }
/* read the lead-out track */ /* read the lead-out track */
p_env->tocent[TOTAL_TRACKS].cdte_track = CDIO_CDROM_LEADOUT_TRACK; p_env->tocent[p_env->gen.i_tracks].cdte_track = CDIO_CDROM_LEADOUT_TRACK;
p_env->tocent[TOTAL_TRACKS].cdte_format = CDROM_MSF; p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF;
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
&p_env->tocent[TOTAL_TRACKS]) == -1 ) { &p_env->tocent[p_env->gen.i_tracks]) == -1 ) {
cdio_warn("%s: %s\n", cdio_warn("%s: %s\n",
"error in ioctl CDROMREADTOCENTRY for lead-out", "error in ioctl CDROMREADTOCENTRY for lead-out",
strerror(errno)); strerror(errno));
@@ -884,7 +852,7 @@ read_toc_linux (_img_private_t *p_env)
} }
/* /*
struct cdrom_msf0 *msf= &env->tocent[TOTAL_TRACKS].cdte_addr.msf; struct cdrom_msf0 *msf= &env->tocent[p_env->gen.i_tracks].cdte_addr.msf;
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n",
i, msf->minute, msf->second, msf->frame); i, msf->minute, msf->second, msf->frame);
@@ -1034,7 +1002,7 @@ get_cdtext_linux (void *p_user_data, track_t i_track)
if ( NULL == p_env || if ( NULL == p_env ||
(0 != i_track (0 != i_track
&& i_track >= TOTAL_TRACKS+p_env->gen.i_first_track ) ) && i_track >= p_env->gen.i_tracks+p_env->gen.i_first_track ) )
return NULL; return NULL;
p_env->b_cdtext_init = init_cdtext_linux(p_env); p_env->b_cdtext_init = init_cdtext_linux(p_env);
@@ -1204,9 +1172,9 @@ cdio_open_am_linux (const char *psz_orig_source, const char *access_mode)
.get_devices = cdio_get_devices_linux, .get_devices = cdio_get_devices_linux,
.get_discmode = get_discmode_linux, .get_discmode = get_discmode_linux,
.get_drive_cap = get_drive_cap_linux, .get_drive_cap = get_drive_cap_linux,
.get_first_track_num= get_first_track_num_linux, .get_first_track_num= get_first_track_num_generic,
.get_mcn = _get_mcn_linux, .get_mcn = _get_mcn_linux,
.get_num_tracks = _get_num_tracks_linux, .get_num_tracks = get_num_tracks_generic,
.get_track_format = _get_track_format_linux, .get_track_format = _get_track_format_linux,
.get_track_green = _get_track_green_linux, .get_track_green = _get_track_green_linux,
.get_track_lba = NULL, /* This could be implemented if need be. */ .get_track_lba = NULL, /* This could be implemented if need be. */
@@ -1218,6 +1186,7 @@ cdio_open_am_linux (const char *psz_orig_source, const char *access_mode)
.read_mode1_sectors = _read_mode1_sectors_linux, .read_mode1_sectors = _read_mode1_sectors_linux,
.read_mode2_sector = _read_mode2_sector_linux, .read_mode2_sector = _read_mode2_sector_linux,
.read_mode2_sectors = _read_mode2_sectors_linux, .read_mode2_sectors = _read_mode2_sectors_linux,
.read_toc = read_toc_linux,
.run_scsi_mmc_cmd = &run_scsi_cmd_linux, .run_scsi_mmc_cmd = &run_scsi_cmd_linux,
.set_arg = set_arg_linux, .set_arg = set_arg_linux,
.stat_size = stat_size_linux .stat_size = stat_size_linux

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_sunos.c,v 1.65 2004/07/28 01:09:59 rocky Exp $ $Id: _cdio_sunos.c,v 1.66 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -38,7 +38,7 @@
#ifdef HAVE_SOLARIS_CDROM #ifdef HAVE_SOLARIS_CDROM
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.65 2004/07/28 01:09:59 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.66 2004/07/29 02:16:20 rocky Exp $";
#ifdef HAVE_GLOB_H #ifdef HAVE_GLOB_H
#include <glob.h> #include <glob.h>
@@ -65,8 +65,6 @@ static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.65 2004/07/28 01:09:59 rock
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "cdtext_private.h" #include "cdtext_private.h"
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
/* reader */ /* reader */
typedef enum { typedef enum {
@@ -407,8 +405,9 @@ _set_arg_solaris (void *p_user_data, const char key[], const char value[])
Return true if successful or false if an error. Return true if successful or false if an error.
*/ */
static bool static bool
read_toc_solaris (_img_private_t *p_env) read_toc_solaris (void *p_user_data)
{ {
_img_private_t *p_env = p_user_data;
int i; int i;
/* read TOC header */ /* read TOC header */
@@ -419,9 +418,10 @@ read_toc_solaris (_img_private_t *p_env)
} }
p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; p_env->gen.i_first_track = p_env->tochdr.cdth_trk0;
p_env->gen.i_tracks = p_env->tochdr.cdth_trk1;
/* read individual tracks */ /* read individual tracks */
for (i=p_env->tochdr.cdth_trk0; i<=p_env->tochdr.cdth_trk1; i++) { for (i=p_env->gen.i_first_track; i<=gen.i_tracks; i++) {
p_env->tocent[i-1].cdte_track = i; p_env->tocent[i-1].cdte_track = i;
p_env->tocent[i-1].cdte_format = CDIO_CDROM_MSF; p_env->tocent[i-1].cdte_format = CDIO_CDROM_MSF;
if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1 ) { if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1 ) {
@@ -494,7 +494,7 @@ get_cdtext_solaris (void *p_user_data, track_t i_track)
if ( NULL == p_env || if ( NULL == p_env ||
(0 != i_track (0 != i_track
&& i_track >= TOTAL_TRACKS+p_env->gen.i_first_track ) && i_track >= p_env->gen.i_tracks+p_env->gen.i_first_track )
|| p_env ->b_cdtext_error ) || p_env ->b_cdtext_error )
return NULL; return NULL;
@@ -603,123 +603,6 @@ cdio_get_default_device_solaris(void)
return strdup(DEFAULT_CDIO_DEVICE); return strdup(DEFAULT_CDIO_DEVICE);
} }
/*!
Get disc type associated with cd object.
*/
static discmode_t
get_discmode_solaris (void *p_user_data)
{
_img_private_t *p_env = p_user_data;
track_t i_track;
discmode_t discmode=CDIO_DISC_MODE_NO_INFO;
/* See if this is a DVD. */
cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */
dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL;
dvd.physical.layer_num = 0;
if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env,
&run_scsi_cmd_solaris,
&dvd)) {
switch(dvd.physical.layer[0].book_type) {
case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM;
case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM;
case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R;
case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW;
case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR;
case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW;
default: return CDIO_DISC_MODE_DVD_OTHER;
}
}
if (!p_env->gen.toc_init)
read_toc_solaris (p_env);
if (!p_env->gen.toc_init)
return CDIO_DISC_MODE_NO_INFO;
for (i_track = p_env->gen.i_first_track;
i_track < p_env->gen.i_first_track + TOTAL_TRACKS ;
i_track ++) {
track_format_t track_fmt=get_track_format_solaris(p_env, i_track);
switch(track_fmt) {
case TRACK_FORMAT_AUDIO:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DA;
break;
case CDIO_DISC_MODE_CD_DA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_XA:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_XA;
break;
case CDIO_DISC_MODE_CD_XA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_DATA:
switch(discmode) {
case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DATA;
break;
case CDIO_DISC_MODE_CD_DATA:
case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR:
/* No change*/
break;
default:
discmode = CDIO_DISC_MODE_CD_MIXED;
}
break;
case TRACK_FORMAT_ERROR:
default:
discmode = CDIO_DISC_MODE_ERROR;
}
}
return discmode;
}
/*!
Return the number of of the first track.
CDIO_INVALID_TRACK is returned on error.
*/
static track_t
get_first_track_num_solaris(void *p_user_data)
{
_img_private_t *p_env = p_user_data;
if (!p_env->gen.toc_init) read_toc_solaris (p_env) ;
return p_env->gen.i_first_track;
}
/*!
Return the number of tracks in the current medium.
*/
static track_t
_cdio_get_num_tracks(void *p_user_data)
{
_img_private_t *p_env = p_user_data;
return TOTAL_TRACKS;
}
/*! /*!
Get format of track. Get format of track.
*/ */
@@ -728,7 +611,7 @@ get_track_format_solaris(void *p_user_data, track_t i_track)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
if ( (i_track > TOTAL_TRACKS+p_env->gen.i_first_track) if ( (i_track > p_env->gen.i_tracks+p_env->gen.i_first_track)
|| i_track < p_env->gen.i_first_track) || i_track < p_env->gen.i_first_track)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
@@ -765,7 +648,7 @@ _cdio_get_track_green(void *p_user_data, track_t i_track)
if (!p_env->gen.init) init_solaris(p_env); if (!p_env->gen.init) init_solaris(p_env);
if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; if (!p_env->gen.toc_init) read_toc_solaris (p_env) ;
if (i_track >= TOTAL_TRACKS+p_env->gen.i_first_track if (i_track >= p_env->gen.i_tracks+p_env->gen.i_first_track
|| i_track < p_env->gen.i_first_track) || i_track < p_env->gen.i_first_track)
return false; return false;
@@ -797,9 +680,9 @@ _cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf)
if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; if (!p_env->gen.toc_init) read_toc_solaris (p_env) ;
if (i_track == CDIO_CDROM_LEADOUT_TRACK) if (i_track == CDIO_CDROM_LEADOUT_TRACK)
i_track = TOTAL_TRACKS + p_env->gen.i_first_track; i_track = p_env->gen.i_tracks + p_env->gen.i_first_track;
if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track)
|| i_track < p_env->gen.i_first_track) { || i_track < p_env->gen.i_first_track) {
return false; return false;
} else { } else {
@@ -883,11 +766,11 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
.get_cdtext = get_cdtext_solaris, .get_cdtext = get_cdtext_solaris,
.get_default_device = cdio_get_default_device_solaris, .get_default_device = cdio_get_default_device_solaris,
.get_devices = cdio_get_devices_solaris, .get_devices = cdio_get_devices_solaris,
.get_discmode = get_discmode_solaris, .get_discmode = get_discmode_generic,
.get_drive_cap = scsi_mmc_get_drive_cap_generic, .get_drive_cap = scsi_mmc_get_drive_cap_generic,
.get_first_track_num= get_first_track_num_solaris, .get_first_track_num= get_first_track_num_generic,
.get_mcn = scsi_mmc_get_mcn_generic, .get_mcn = scsi_mmc_get_mcn_generic,
.get_num_tracks = _cdio_get_num_tracks, .get_num_tracks = get_num_tracks_generic,
.get_track_format = get_track_format_solaris, .get_track_format = get_track_format_solaris,
.get_track_green = _cdio_get_track_green, .get_track_green = _cdio_get_track_green,
.get_track_lba = NULL, /* This could be implemented if need be. */ .get_track_lba = NULL, /* This could be implemented if need be. */
@@ -899,6 +782,7 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode)
.read_mode1_sectors = _read_mode1_sectors_solaris, .read_mode1_sectors = _read_mode1_sectors_solaris,
.read_mode2_sector = _read_mode2_sector_solaris, .read_mode2_sector = _read_mode2_sector_solaris,
.read_mode2_sectors = _read_mode2_sectors_solaris, .read_mode2_sectors = _read_mode2_sectors_solaris,
.read_toc = &read_toc_solaris,
.run_scsi_mmc_cmd = &run_scsi_cmd_solaris, .run_scsi_mmc_cmd = &run_scsi_cmd_solaris,
.stat_size = _cdio_stat_size, .stat_size = _cdio_stat_size,
.set_arg = _set_arg_solaris .set_arg = _set_arg_solaris

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio_private.h,v 1.35 2004/07/27 01:06:02 rocky Exp $ $Id: cdio_private.h,v 1.36 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -181,14 +181,14 @@ extern "C" {
from lsn. from lsn.
Returns 0 if no error. Returns 0 if no error.
*/ */
int (*read_mode2_sectors) (void *env, void *buf, lsn_t lsn, int (*read_mode2_sectors) (void *p_env, void *p_buf, lsn_t lsn,
bool mode2_form2, unsigned int nblocks); bool mode2_form2, unsigned int nblocks);
/*! /*!
Reads a single mode1 sector from cd device into buf starting Reads a single mode1 sector from cd device into buf starting
from lsn. Returns 0 if no error. from lsn. Returns 0 if no error.
*/ */
int (*read_mode1_sector) (void *env, void *buf, lsn_t lsn, int (*read_mode1_sector) (void *p_env, void *p_buf, lsn_t lsn,
bool mode1_form2); bool mode1_form2);
/*! /*!
@@ -196,16 +196,17 @@ extern "C" {
from lsn. from lsn.
Returns 0 if no error. Returns 0 if no error.
*/ */
int (*read_mode1_sectors) (void *env, void *buf, lsn_t lsn, int (*read_mode1_sectors) (void *p_env, void *p_buf, lsn_t lsn,
bool mode1_form2, unsigned int nblocks); bool mode1_form2, unsigned int nblocks);
bool (*read_toc) ( void *p_env ) ;
/*! /*!
Run a SCSI MMC command. Run a SCSI MMC command.
cdio CD structure set by cdio_open(). cdio CD structure set by cdio_open().
i_timeout time in milliseconds we will wait for the command i_timeout_ms time in milliseconds we will wait for the command
to complete. If this value is -1, use the default to complete.
time-out value.
cdb_len number of bytes in cdb (6, 10, or 12). cdb_len number of bytes in cdb (6, 10, or 12).
cdb CDB bytes. All values that are needed should be set on cdb CDB bytes. All values that are needed should be set on
input. input.
@@ -228,9 +229,6 @@ extern "C" {
*/ */
uint32_t (*stat_size) (void *env); uint32_t (*stat_size) (void *env);
/*! Pointer to parent container object. */
CdIo *cdio;
} cdio_funcs; } cdio_funcs;
@@ -258,6 +256,7 @@ extern "C" {
*/ */
int fd; /**< File descriptor of device */ int fd; /**< File descriptor of device */
track_t i_first_track; /**< The starting track number. */ track_t i_first_track; /**< The starting track number. */
track_t i_tracks; /**< The number of tracks. */
CdioDataSource *data_source; CdioDataSource *data_source;
CdIo *cdio; /**< a way to call general cdio routines. */ CdIo *cdio; /**< a way to call general cdio routines. */
} generic_img_private_t; } generic_img_private_t;
@@ -372,6 +371,21 @@ extern "C" {
*/ */
bool cdio_is_device_quiet_generic(const char *source_name); bool cdio_is_device_quiet_generic(const char *source_name);
/*!
Return the number of of the first track.
CDIO_INVALID_TRACK is returned on error.
*/
track_t get_first_track_num_generic(void *p_user_data);
/*!
Return the number of tracks in the current medium.
*/
track_t get_num_tracks_generic(void *p_user_data);
/*!
Get disc type associated with cd object.
*/
discmode_t get_discmode_generic (void *p_user_data );
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1,5 +1,5 @@
/* /*
$Id: bincue.c,v 1.38 2004/07/26 02:54:37 rocky Exp $ $Id: bincue.c,v 1.39 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -26,7 +26,7 @@
(*.cue). (*.cue).
*/ */
static const char _rcsid[] = "$Id: bincue.c,v 1.38 2004/07/26 02:54:37 rocky Exp $"; static const char _rcsid[] = "$Id: bincue.c,v 1.39 2004/07/29 02:16:20 rocky Exp $";
#include "image.h" #include "image.h"
#include "cdio_assert.h" #include "cdio_assert.h"
@@ -81,8 +81,6 @@ typedef struct {
exactly 13 bytes */ exactly 13 bytes */
track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track
add 1 for leadout. */ add 1 for leadout. */
track_t i_tracks; /* number of tracks in image */
track_t i_first_track; /* track number of first track */
cdtext_t cdtext; /* CD-TEXT */ cdtext_t cdtext; /* CD-TEXT */
discmode_t disc_mode; discmode_t disc_mode;
} _img_private_t; } _img_private_t;
@@ -113,7 +111,7 @@ _init_bincue (_img_private_t *env)
get into infinite recursion calling passing right here. get into infinite recursion calling passing right here.
*/ */
env->gen.init = true; env->gen.init = true;
env->i_first_track = 1; env->gen.i_first_track = 1;
env->psz_mcn = NULL; env->psz_mcn = NULL;
env->disc_mode = CDIO_DISC_MODE_NO_INFO; env->disc_mode = CDIO_DISC_MODE_NO_INFO;
@@ -129,10 +127,11 @@ _init_bincue (_img_private_t *env)
if ( !parse_cuefile(env, env->psz_cue_name) ) return false; if ( !parse_cuefile(env, env->psz_cue_name) ) return false;
/* Fake out leadout track and sector count for last track*/ /* Fake out leadout track and sector count for last track*/
cdio_lsn_to_msf (lead_lsn, &env->tocent[env->i_tracks].start_msf); cdio_lsn_to_msf (lead_lsn, &env->tocent[env->gen.i_tracks].start_msf);
env->tocent[env->i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn); env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn);
env->tocent[env->i_tracks - env->i_first_track].sec_count = env->tocent[env->gen.i_tracks - env->gen.i_first_track].sec_count =
cdio_lsn_to_lba(lead_lsn - env->tocent[env->i_tracks - env->i_first_track].start_lba); cdio_lsn_to_lba(lead_lsn -
env->tocent[env->gen.i_tracks - env->gen.i_first_track].start_lba);
return true; return true;
} }
@@ -157,7 +156,7 @@ _lseek_bincue (void *user_data, off_t offset, int whence)
unsigned int i; unsigned int i;
env->pos.lba = 0; env->pos.lba = 0;
for (i=0; i<env->i_tracks; i++) { for (i=0; i<env->gen.i_tracks; i++) {
track_info_t *this_track=&(env->tocent[i]); track_info_t *this_track=&(env->tocent[i]);
env->pos.index = i; env->pos.index = i;
if ( (this_track->sec_count*this_track->datasize) >= offset) { if ( (this_track->sec_count*this_track->datasize) >= offset) {
@@ -174,7 +173,7 @@ _lseek_bincue (void *user_data, off_t offset, int whence)
env->pos.lba += this_track->sec_count; env->pos.lba += this_track->sec_count;
} }
if (i==env->i_tracks) { if (i==env->gen.i_tracks) {
cdio_warn ("seeking outside range of disk image"); cdio_warn ("seeking outside range of disk image");
return -1; return -1;
} else { } else {
@@ -275,7 +274,7 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
char psz_line[MAXLINE]; /* text of current line read in file fp. */ char psz_line[MAXLINE]; /* text of current line read in file fp. */
unsigned int i_line=0; /* line number in file of psz_line. */ unsigned int i_line=0; /* line number in file of psz_line. */
int i = -1; /* Position in tocent. Same as int i = -1; /* Position in tocent. Same as
cd->i_tracks - 1 */ cd->gen.i_tracks - 1 */
char *psz_keyword, *psz_field; char *psz_keyword, *psz_field;
cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN; cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN;
cdtext_field_t cdtext_key; cdtext_field_t cdtext_key;
@@ -295,8 +294,8 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
} }
if (cd) { if (cd) {
cd->i_tracks=0; cd->gen.i_tracks=0;
cd->i_first_track=1; cd->gen.i_first_track=1;
cd->psz_mcn=NULL; cd->psz_mcn=NULL;
} }
@@ -380,12 +379,12 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
track_info_t *this_track=NULL; track_info_t *this_track=NULL;
if (cd) { if (cd) {
this_track = &(cd->tocent[cd->i_tracks]); this_track = &(cd->tocent[cd->gen.i_tracks]);
this_track->track_num = cd->i_tracks; this_track->track_num = cd->gen.i_tracks;
this_track->num_indices = 0; this_track->num_indices = 0;
b_first_index_for_track = false; b_first_index_for_track = false;
cdtext_init (&(cd->tocent[cd->i_tracks].cdtext)); cdtext_init (&(cd->tocent[cd->gen.i_tracks].cdtext));
cd->i_tracks++; cd->gen.i_tracks++;
} }
i++; i++;
@@ -692,7 +691,7 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
cd->tocent[i].indexes[cd->tocent[i].nindex++] = lba; cd->tocent[i].indexes[cd->tocent[i].nindex++] = lba;
#else #else
track_info_t *this_track= track_info_t *this_track=
&(cd->tocent[cd->i_tracks - cd->i_first_track]); &(cd->tocent[cd->gen.i_tracks - cd->gen.i_first_track]);
if (start_index != 0) { if (start_index != 0) {
if (!b_first_index_for_track) { if (!b_first_index_for_track) {
@@ -702,15 +701,15 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
this_track->start_lba = lba; this_track->start_lba = lba;
} }
if (cd->i_tracks > 1) { if (cd->gen.i_tracks > 1) {
/* Figure out number of sectors for previous track */ /* Figure out number of sectors for previous track */
track_info_t *prev_track=&(cd->tocent[cd->i_tracks-2]); track_info_t *prev_track=&(cd->tocent[cd->gen.i_tracks-2]);
if ( this_track->start_lba < prev_track->start_lba ) { if ( this_track->start_lba < prev_track->start_lba ) {
cdio_log (log_level, cdio_log (log_level,
"track %d at LBA %lu starts before track %d at LBA %lu", "track %d at LBA %lu starts before track %d at LBA %lu",
cd->i_tracks, cd->gen.i_tracks,
(unsigned long int) this_track->start_lba, (unsigned long int) this_track->start_lba,
cd->i_tracks, cd->gen.i_tracks,
(unsigned long int) prev_track->start_lba); (unsigned long int) prev_track->start_lba);
prev_track->sec_count = 0; prev_track->sec_count = 0;
} else if ( this_track->start_lba >= prev_track->start_lba } else if ( this_track->start_lba >= prev_track->start_lba
@@ -723,7 +722,7 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
(long unsigned int) (long unsigned int)
this_track->start_lba - prev_track->start_lba, this_track->start_lba - prev_track->start_lba,
CDIO_PREGAP_SECTORS, CDIO_PREGAP_SECTORS,
cd->i_tracks); cd->gen.i_tracks);
/* Include pregap portion in sec_count. Maybe the pregap /* Include pregap portion in sec_count. Maybe the pregap
was omitted. */ was omitted. */
prev_track->sec_count = this_track->start_lba - prev_track->sec_count = this_track->start_lba -
@@ -976,10 +975,10 @@ _get_track_format_bincue(void *user_data, track_t i_track)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
if (i_track > env->i_tracks || i_track == 0) if (i_track > env->gen.i_tracks || i_track == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
return env->tocent[i_track-env->i_first_track].track_format; return env->tocent[i_track-env->gen.i_first_track].track_format;
} }
/*! /*!
@@ -996,11 +995,11 @@ _get_track_green_bincue(void *user_data, track_t i_track)
_img_private_t *env = user_data; _img_private_t *env = user_data;
if ( NULL == env || if ( NULL == env ||
( i_track < env->i_first_track ( i_track < env->gen.i_first_track
|| i_track >= env->i_tracks + env->i_first_track ) ) || i_track >= env->gen.i_tracks + env->gen.i_first_track ) )
return false; return false;
return env->tocent[i_track-env->i_first_track].track_green; return env->tocent[i_track-env->gen.i_first_track].track_green;
} }
/*! /*!
@@ -1015,10 +1014,10 @@ _get_lba_track_bincue(void *user_data, track_t i_track)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = env->i_tracks+1; if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = env->gen.i_tracks+1;
if (i_track <= env->i_tracks + env->i_first_track && i_track != 0) { if (i_track <= env->gen.i_tracks + env->gen.i_first_track && i_track != 0) {
return env->tocent[i_track-env->i_first_track].start_lba; return env->tocent[i_track-env->gen.i_first_track].start_lba;
} else } else
return CDIO_INVALID_LBA; return CDIO_INVALID_LBA;
} }

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdrdao.c,v 1.23 2004/07/26 02:54:37 rocky Exp $ $Id: cdrdao.c,v 1.24 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
toc reading routine adapted from cuetools toc reading routine adapted from cuetools
@@ -25,7 +25,7 @@
(*.cue). (*.cue).
*/ */
static const char _rcsid[] = "$Id: cdrdao.c,v 1.23 2004/07/26 02:54:37 rocky Exp $"; static const char _rcsid[] = "$Id: cdrdao.c,v 1.24 2004/07/29 02:16:20 rocky Exp $";
#include "image.h" #include "image.h"
#include "cdio_assert.h" #include "cdio_assert.h"
@@ -81,8 +81,6 @@ typedef struct {
exactly 13 bytes */ exactly 13 bytes */
track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track
add 1 for leadout. */ add 1 for leadout. */
track_t i_tracks; /* number of tracks in image */
track_t i_first_track; /* track number of first track */
cdtext_t cdtext; /* CD-TEXT */ cdtext_t cdtext; /* CD-TEXT */
discmode_t disc_mode; discmode_t disc_mode;
} _img_private_t; } _img_private_t;
@@ -108,7 +106,7 @@ _init_cdrdao (_img_private_t *env)
get into infinite recursion calling passing right here. get into infinite recursion calling passing right here.
*/ */
env->gen.init = true; env->gen.init = true;
env->i_first_track = 1; env->gen.i_first_track = 1;
env->psz_mcn = NULL; env->psz_mcn = NULL;
env->disc_mode = CDIO_DISC_MODE_NO_INFO; env->disc_mode = CDIO_DISC_MODE_NO_INFO;
@@ -123,10 +121,10 @@ _init_cdrdao (_img_private_t *env)
return false; return false;
/* Fake out leadout track and sector count for last track*/ /* Fake out leadout track and sector count for last track*/
cdio_lsn_to_msf (lead_lsn, &env->tocent[env->i_tracks].start_msf); cdio_lsn_to_msf (lead_lsn, &env->tocent[env->gen.i_tracks].start_msf);
env->tocent[env->i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn); env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn);
env->tocent[env->i_tracks-env->i_first_track].sec_count = env->tocent[env->gen.i_tracks-env->gen.i_first_track].sec_count =
cdio_lsn_to_lba(lead_lsn - env->tocent[env->i_tracks-1].start_lba); cdio_lsn_to_lba(lead_lsn - env->tocent[env->gen.i_tracks-1].start_lba);
return true; return true;
} }
@@ -151,7 +149,7 @@ _lseek_cdrdao (void *user_data, off_t offset, int whence)
unsigned int i; unsigned int i;
env->pos.lba = 0; env->pos.lba = 0;
for (i=0; i<env->i_tracks; i++) { for (i=0; i<env->gen.i_tracks; i++) {
track_info_t *this_track=&(env->tocent[i]); track_info_t *this_track=&(env->tocent[i]);
env->pos.index = i; env->pos.index = i;
if ( (this_track->sec_count*this_track->datasize) >= offset) { if ( (this_track->sec_count*this_track->datasize) >= offset) {
@@ -168,7 +166,7 @@ _lseek_cdrdao (void *user_data, off_t offset, int whence)
env->pos.lba += this_track->sec_count; env->pos.lba += this_track->sec_count;
} }
if (i==env->i_tracks) { if (i==env->gen.i_tracks) {
cdio_warn ("seeking outside range of disk image"); cdio_warn ("seeking outside range of disk image");
return -1; return -1;
} else { } else {
@@ -273,7 +271,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
char psz_line[MAXLINE]; /* text of current line read in file fp. */ char psz_line[MAXLINE]; /* text of current line read in file fp. */
unsigned int i_line=0; /* line number in file of psz_line. */ unsigned int i_line=0; /* line number in file of psz_line. */
int i = -1; /* Position in tocent. Same as int i = -1; /* Position in tocent. Same as
cd->i_tracks - 1 */ cd->gen.i_tracks - 1 */
char *psz_keyword, *psz_field; char *psz_keyword, *psz_field;
cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN; cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN;
cdtext_field_t cdtext_key; cdtext_field_t cdtext_key;
@@ -806,7 +804,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
} }
} }
if (NULL != cd) cd->i_tracks = i+1; if (NULL != cd) cd->gen.i_tracks = i+1;
fclose (fp); fclose (fp);
return true; return true;
@@ -1019,10 +1017,10 @@ _get_track_format_cdrdao(void *user_data, track_t i_track)
if (!env->gen.init) _init_cdrdao(env); if (!env->gen.init) _init_cdrdao(env);
if (i_track > env->i_tracks || i_track == 0) if (i_track > env->gen.i_tracks || i_track == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
return env->tocent[i_track-env->i_first_track].track_format; return env->tocent[i_track-env->gen.i_first_track].track_format;
} }
/*! /*!
@@ -1040,10 +1038,10 @@ _get_track_green_cdrdao(void *user_data, track_t i_track)
if (!env->gen.init) _init_cdrdao(env); if (!env->gen.init) _init_cdrdao(env);
if (i_track > env->i_tracks || i_track == 0) if (i_track > env->gen.i_tracks || i_track == 0)
return false; return false;
return env->tocent[i_track-env->i_first_track].track_green; return env->tocent[i_track-env->gen.i_first_track].track_green;
} }
/*! /*!
@@ -1059,9 +1057,10 @@ _get_lba_track_cdrdao(void *user_data, track_t i_track)
_img_private_t *env = user_data; _img_private_t *env = user_data;
_init_cdrdao (env); _init_cdrdao (env);
if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = env->i_tracks+1; if (i_track == CDIO_CDROM_LEADOUT_TRACK)
i_track = env->gen.i_tracks+1;
if (i_track <= env->i_tracks+1 && i_track != 0) { if (i_track <= env->gen.i_tracks+1 && i_track != 0) {
return env->tocent[i_track-1].start_lba; return env->tocent[i_track-1].start_lba;
} else } else
return CDIO_INVALID_LBA; return CDIO_INVALID_LBA;

View File

@@ -1,5 +1,5 @@
/* /*
$Id: nrg.c,v 1.35 2004/07/26 02:54:37 rocky Exp $ $Id: nrg.c,v 1.36 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org>
@@ -45,7 +45,7 @@
#include "_cdio_stdio.h" #include "_cdio_stdio.h"
#include "nrg.h" #include "nrg.h"
static const char _rcsid[] = "$Id: nrg.c,v 1.35 2004/07/26 02:54:37 rocky Exp $"; static const char _rcsid[] = "$Id: nrg.c,v 1.36 2004/07/29 02:16:20 rocky Exp $";
/* reader */ /* reader */
@@ -77,8 +77,6 @@ typedef struct {
track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track
add 1 for leadout. */ add 1 for leadout. */
track_t i_tracks; /* number of tracks in image */
track_t i_first_track; /* track number of first track */
cdtext_t cdtext; /* CD-TEXT */ cdtext_t cdtext; /* CD-TEXT */
discmode_t disc_mode; discmode_t disc_mode;
@@ -110,8 +108,8 @@ _register_mapping (_img_private_t *env, lsn_t start_lsn, uint32_t sec_count,
track_format_t track_format, bool track_green, track_format_t track_format, bool track_green,
int flags) int flags)
{ {
const int track_num=env->i_tracks; const int track_num=env->gen.i_tracks;
track_info_t *this_track=&(env->tocent[env->i_tracks]); track_info_t *this_track=&(env->tocent[env->gen.i_tracks]);
_mapping_t *_map = _cdio_malloc (sizeof (_mapping_t)); _mapping_t *_map = _cdio_malloc (sizeof (_mapping_t));
_map->start_lsn = start_lsn; _map->start_lsn = start_lsn;
@@ -186,10 +184,10 @@ _register_mapping (_img_private_t *env, lsn_t start_lsn, uint32_t sec_count,
default: default:
/*this_track->datasize=CDIO_CD_FRAMESIZE_RAW;*/ /*this_track->datasize=CDIO_CD_FRAMESIZE_RAW;*/
cdio_warn ("track %d has unknown format %d", cdio_warn ("track %d has unknown format %d",
env->i_tracks, this_track->track_format); env->gen.i_tracks, this_track->track_format);
} }
env->i_tracks++; env->gen.i_tracks++;
cdio_debug ("start lsn: %lu sector count: %0lu -> %8ld (%08lx)", cdio_debug ("start lsn: %lu sector count: %0lu -> %8ld (%08lx)",
(long unsigned int) start_lsn, (long unsigned int) start_lsn,
@@ -284,8 +282,8 @@ parse_nrg (_img_private_t *env, const char *psz_nrg_name)
*/ */
env->is_cues = true; /* HACK alert. */ env->is_cues = true; /* HACK alert. */
env->i_tracks = 0; env->gen.i_tracks = 0;
env->i_first_track = 1; env->gen.i_first_track = 1;
for (idx = 1; idx < entries-1; idx += 2) { for (idx = 1; idx < entries-1; idx += 2) {
lsn_t sec_count; lsn_t sec_count;
int addrtype = _entries[idx].addr_ctrl / 16; int addrtype = _entries[idx].addr_ctrl / 16;
@@ -430,7 +428,7 @@ parse_nrg (_img_private_t *env, const char *psz_nrg_name)
} }
if (0 == form2) { if (0 == form2) {
int i; int i;
for (i=0; i<env->i_tracks; i++) { for (i=0; i<env->gen.i_tracks; i++) {
env->tocent[i].track_format= track_format; env->tocent[i].track_format= track_format;
env->tocent[i].datastart = 0; env->tocent[i].datastart = 0;
env->tocent[i].track_green = false; env->tocent[i].track_green = false;
@@ -445,7 +443,7 @@ parse_nrg (_img_private_t *env, const char *psz_nrg_name)
} }
} else if (2 == form2) { } else if (2 == form2) {
int i; int i;
for (i=0; i<env->i_tracks; i++) { for (i=0; i<env->gen.i_tracks; i++) {
env->tocent[i].track_green = true; env->tocent[i].track_green = true;
env->tocent[i].track_format= track_format; env->tocent[i].track_format= track_format;
env->tocent[i].datasize = CDIO_CD_FRAMESIZE; env->tocent[i].datasize = CDIO_CD_FRAMESIZE;
@@ -729,10 +727,10 @@ parse_nrg (_img_private_t *env, const char *psz_nrg_name)
/* Don't use _stat_size_nrg since that will lead to recursion since /* Don't use _stat_size_nrg since that will lead to recursion since
we haven't fully initialized things yet. we haven't fully initialized things yet.
*/ */
cdio_lsn_to_msf (env->size, &env->tocent[env->i_tracks].start_msf); cdio_lsn_to_msf (env->size, &env->tocent[env->gen.i_tracks].start_msf);
env->tocent[env->i_tracks].start_lba = cdio_lsn_to_lba(env->size); env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(env->size);
env->tocent[env->i_tracks-1].sec_count = env->tocent[env->gen.i_tracks-1].sec_count =
cdio_lsn_to_lba(env->size - env->tocent[env->i_tracks-1].start_lba); cdio_lsn_to_lba(env->size - env->tocent[env->gen.i_tracks-1].start_lba);
free(footer_buf); free(footer_buf);
return true; return true;
@@ -789,7 +787,7 @@ _lseek_nrg (void *user_data, off_t offset, int whence)
unsigned int i; unsigned int i;
for (i=0; i<env->i_tracks; i++) { for (i=0; i<env->gen.i_tracks; i++) {
track_info_t *this_track=&(env->tocent[i]); track_info_t *this_track=&(env->tocent[i]);
env->pos.index = i; env->pos.index = i;
if ( (this_track->sec_count*this_track->datasize) >= offset) { if ( (this_track->sec_count*this_track->datasize) >= offset) {
@@ -806,7 +804,7 @@ _lseek_nrg (void *user_data, off_t offset, int whence)
env->pos.lba += this_track->sec_count; env->pos.lba += this_track->sec_count;
} }
if (i==env->i_tracks) { if (i==env->gen.i_tracks) {
cdio_warn ("seeking outside range of disk image"); cdio_warn ("seeking outside range of disk image");
return -1; return -1;
} else } else
@@ -1098,7 +1096,7 @@ _get_track_format_nrg(void *user_data, track_t track_num)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
if (track_num > env->i_tracks || track_num == 0) if (track_num > env->gen.i_tracks || track_num == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
if ( env->dtyp != DTYP_INVALID) { if ( env->dtyp != DTYP_INVALID) {
@@ -1128,7 +1126,7 @@ _get_track_green_nrg(void *user_data, track_t track_num)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
if (track_num > env->i_tracks || track_num == 0) if (track_num > env->gen.i_tracks || track_num == 0)
return false; return false;
if ( MTYP_AUDIO_CD == env->mtyp) return false; if ( MTYP_AUDIO_CD == env->mtyp) return false;
@@ -1210,15 +1208,15 @@ cdio_open_nrg (const char *psz_source)
.stat_size = _stat_size_nrg, .stat_size = _stat_size_nrg,
}; };
_data = _cdio_malloc (sizeof (_img_private_t)); _data = _cdio_malloc (sizeof (_img_private_t));
_data->gen.init = false; _data->gen.init = false;
_data->i_tracks = 0; _data->gen.i_tracks = 0;
_data->mtyp = 0; _data->mtyp = 0;
_data->dtyp = DTYP_INVALID; _data->dtyp = DTYP_INVALID;
_data->i_first_track = 1; _data->gen.i_first_track= 1;
_data->is_dao = false; _data->is_dao = false;
_data->is_cues = false; /* FIXME: remove is_cues. */ _data->is_cues = false; /* FIXME: remove is_cues. */
ret = cdio_new ((void *)_data, &_funcs); ret = cdio_new ((void *)_data, &_funcs);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: image_common.h,v 1.14 2004/07/24 14:23:37 rocky Exp $ $Id: image_common.h,v 1.15 2004/07/29 02:16:20 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -45,7 +45,7 @@ _free_image (void *user_data)
if (NULL == env) return; if (NULL == env) return;
for (i_track=0; i_track < env->i_tracks; i_track++) { for (i_track=0; i_track < env->gen.i_tracks; i_track++) {
free_if_notnull(env->tocent[i_track].filename); free_if_notnull(env->tocent[i_track].filename);
free_if_notnull(env->tocent[i_track].isrc); free_if_notnull(env->tocent[i_track].isrc);
cdtext_destroy(&(env->tocent[i_track].cdtext)); cdtext_destroy(&(env->tocent[i_track].cdtext));
@@ -106,7 +106,7 @@ _get_cdtext_image (void *user_data, track_t i_track)
if ( NULL == env || if ( NULL == env ||
( 0 != i_track ( 0 != i_track
&& i_track >= env->i_tracks + env->i_first_track ) ) && i_track >= env->gen.i_tracks + env->gen.i_first_track ) )
return NULL; return NULL;
if (CDIO_CDROM_LEADOUT_TRACK == i_track) if (CDIO_CDROM_LEADOUT_TRACK == i_track)
@@ -115,7 +115,7 @@ _get_cdtext_image (void *user_data, track_t i_track)
if (0 == i_track) if (0 == i_track)
return &(env->cdtext); return &(env->cdtext);
else else
return &(env->tocent[i_track-env->i_first_track].cdtext); return &(env->tocent[i_track-env->gen.i_first_track].cdtext);
} }
@@ -159,10 +159,10 @@ _get_track_msf_image(void *user_data, track_t track_num, msf_t *msf)
if (NULL == msf) return false; if (NULL == msf) return false;
if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = env->i_tracks+1; if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = env->gen.i_tracks+1;
if (track_num <= env->i_tracks+1 && track_num != 0) { if (track_num <= env->gen.i_tracks+1 && track_num != 0) {
*msf = env->tocent[track_num-env->i_first_track].start_msf; *msf = env->tocent[track_num-env->gen.i_first_track].start_msf;
return true; return true;
} else } else
return false; return false;
@@ -177,7 +177,7 @@ _get_first_track_num_image(void *user_data)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
return env->i_first_track; return env->gen.i_first_track;
} }
/*! /*!
@@ -188,7 +188,7 @@ _get_num_tracks_image(void *user_data)
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
return env->i_tracks; return env->gen.i_tracks;
} }
/*! /*!

View File

@@ -25,7 +25,6 @@ Writing....
__________________________________ __________________________________
Disc mode is listed as: CD-DA Disc mode is listed as: CD-DA
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 audio false 1: 00:02:00 000000 audio false

View File

@@ -25,7 +25,6 @@ Writing....
__________________________________ __________________________________
Disc mode is listed as: CD-DA Disc mode is listed as: CD-DA
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 audio false 1: 00:02:00 000000 audio false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
Media Catalog Number (MCN): not available Media Catalog Number (MCN): not available
__________________________________ __________________________________
CD Analysis Report CD Analysis Report

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
Media Catalog Number (MCN): not available Media Catalog Number (MCN): not available
__________________________________ __________________________________
CD Analysis Report CD Analysis Report

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM form 1 Disc mode is listed as: CD-DATA Form 1
CD-ROM Track List (1 - 1) CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 data false 1: 00:02:00 000000 data false

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM XA form2 Disc mode is listed as: CD DATA Form 2
CD-ROM Track List (1 - 2) CD-ROM Track List (1 - 2)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 XA true 1: 00:02:00 000000 XA true

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM XA form2 Disc mode is listed as: CD DATA Form 2
CD-ROM Track List (1 - 2) CD-ROM Track List (1 - 2)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 XA true 1: 00:02:00 000000 XA true

View File

@@ -24,7 +24,7 @@ Writing....
Can write DVD-RAM : No Can write DVD-RAM : No
__________________________________ __________________________________
Disc mode is listed as: CD-ROM XA form2 Disc mode is listed as: CD DATA Form 2
CD-ROM Track List (1 - 5) CD-ROM Track List (1 - 5)
#: MSF LSN Type Green? #: MSF LSN Type Green?
1: 00:02:00 000000 XA true 1: 00:02:00 000000 XA true