Read TOC buf fixes. Now tries MMC FULLTOC and then falls back to

Windows' DeviceIoCtl READ_TOC.
This commit is contained in:
rocky
2004-11-07 06:22:49 +00:00
parent 2f1d2c045c
commit c653d900fe

View File

@@ -1,5 +1,5 @@
/* /*
$Id: win32_ioctl.c,v 1.41 2004/11/01 10:39:30 rocky Exp $ $Id: win32_ioctl.c,v 1.42 2004/11/07 06:22:49 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
@@ -26,7 +26,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.41 2004/11/01 10:39:30 rocky Exp $"; static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.42 2004/11/07 06:22:49 rocky Exp $";
#ifdef HAVE_WIN32_CDROM #ifdef HAVE_WIN32_CDROM
@@ -542,23 +542,17 @@ init_win32ioctl (_img_private_t *env)
return false; return false;
} }
/*! /*!
Read and cache the CD's Track Table of Contents and track info. Read and cache the CD's Track Table of Contents and track info.
Return true if successful or false if an error. via a SCSI MMC READ_TOC (FULTOC). Return true if successful or
false if an error.
*/ */
bool static bool
read_toc_win32ioctl (_img_private_t *p_env) read_toc_win32mmc (_img_private_t *p_env)
{ {
scsi_mmc_cdb_t cdb = {{0, }}; scsi_mmc_cdb_t cdb = {{0, }};
CDROM_TOC_FULL cdrom_toc_full; CDROM_TOC_FULL cdrom_toc_full;
CDROM_TOC cdrom_toc; int i_status, i, i_track_format, i_seen_flag;
DWORD dwBytesReturned;
int i_status, i, i_track_format, test;
if ( ! p_env )
return false;
/* Read full TOC, (not supported on DVD media) */
/* Operation code */ /* Operation code */
CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC);
@@ -578,63 +572,85 @@ read_toc_win32ioctl (_img_private_t *p_env)
&cdb, SCSI_MMC_DATA_READ, &cdb, SCSI_MMC_DATA_READ,
sizeof(cdrom_toc_full), &cdrom_toc_full); sizeof(cdrom_toc_full), &cdrom_toc_full);
if (i_status == 0) { if ( 0 != i_status ) {
cdio_info ("READTOC failed\n"); cdio_debug ("SCSI MMC READ_TOC failed\n");
return false; return false;
} else { }
test=0;
for( i = 0 ; i <= CDIO_CD_MAX_TRACKS+3; i++ ) { i_seen_flag=0;
for( i = 0 ; i <= CDIO_CD_MAX_TRACKS+3; i++ ) {
if (cdrom_toc_full.TrackData[i].POINT == 0xA0) { /* First track number */
p_env->gen.i_first_track = cdrom_toc_full.TrackData[i].PMIN; if ( 0xA0 == cdrom_toc_full.TrackData[i].POINT ) {
i_track_format = cdrom_toc_full.TrackData[i].PSEC; /* First track number */
test|=0x01; p_env->gen.i_first_track = cdrom_toc_full.TrackData[i].PMIN;
} i_track_format = cdrom_toc_full.TrackData[i].PSEC;
i_seen_flag|=0x01;
if (cdrom_toc_full.TrackData[i].POINT == 0xA1) { /* Last track number */
p_env->gen.i_tracks = cdrom_toc_full.TrackData[i].PMIN - p_env->gen.i_first_track + 1;
test|=0x02;
}
if (cdrom_toc_full.TrackData[i].POINT == 0xA2) { /* Start position of the lead out */
p_env->tocent[ p_env->gen.i_tracks ].start_lsn = cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ p_env->gen.i_tracks ].Control = cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ p_env->gen.i_tracks ].Format = i_track_format;
test|=0x04;
}
if (cdrom_toc_full.TrackData[i].POINT > 0 && cdrom_toc_full.TrackData[i].POINT <= p_env->gen.i_tracks) {
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].start_lsn = cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Control = cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Format = i_track_format;
cdio_debug("p_sectors: %i, %lu", i,
(unsigned long int) (p_env->tocent[i].start_lsn));
if (cdrom_toc_full.TrackData[i].POINT == p_env->gen.i_tracks)
test|=0x08;
}
if (test == 0x0F)
break;
} }
if (test == 0x0F)
{ if ( 0xA1 == cdrom_toc_full.TrackData[i].POINT ) {
p_env->gen.toc_init = true; /* Last track number */
return true; p_env->gen.i_tracks =
cdrom_toc_full.TrackData[i].PMIN - p_env->gen.i_first_track + 1;
i_seen_flag|=0x02;
} }
if ( 0xA2 == cdrom_toc_full.TrackData[i].POINT ) {
/* Start position of the lead out */
p_env->tocent[ p_env->gen.i_tracks ].start_lsn =
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ p_env->gen.i_tracks ].Control
= cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ p_env->gen.i_tracks ].Format = i_track_format;
i_seen_flag|=0x04;
}
if (cdrom_toc_full.TrackData[i].POINT > 0
&& cdrom_toc_full.TrackData[i].POINT <= p_env->gen.i_tracks) {
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].start_lsn =
cdio_msf3_to_lba(
cdrom_toc_full.TrackData[i].PMIN,
cdrom_toc_full.TrackData[i].PSEC,
cdrom_toc_full.TrackData[i].PFRAME );
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Control =
cdrom_toc_full.TrackData[i].Control;
p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Format =
i_track_format;
cdio_debug("p_sectors: %i, %lu", i,
(unsigned long int) (p_env->tocent[i].start_lsn));
if (cdrom_toc_full.TrackData[i].POINT == p_env->gen.i_tracks)
i_seen_flag|=0x08;
}
if ( 0x0F == i_seen_flag ) break;
} }
if ( 0x0F == i_seen_flag ) {
p_env->gen.toc_init = true;
return true;
}
return false;
}
/* No full TOC available */ /*!
/* read the normal TOC as fallback */ Read and cache the CD's Track Table of Contents and track info.
Return true if successful or false if an error.
*/
bool
read_toc_win32ioctl (_img_private_t *p_env)
{
CDROM_TOC cdrom_toc;
DWORD dwBytesReturned;
unsigned int i;
if ( ! p_env ) return false;
if ( read_toc_win32mmc(p_env) ) return true;
/* No SCSI MMC READ_TOC (FULTOC) read via DeviceIoControl as fallback */
if( DeviceIoControl( p_env->h_device_handle, if( DeviceIoControl( p_env->h_device_handle,
IOCTL_CDROM_READ_TOC, IOCTL_CDROM_READ_TOC,
NULL, 0, &cdrom_toc, sizeof(CDROM_TOC), NULL, 0, &cdrom_toc, sizeof(CDROM_TOC),
@@ -653,12 +669,11 @@ read_toc_win32ioctl (_img_private_t *p_env)
p_env->gen.i_first_track = cdrom_toc.FirstTrack; p_env->gen.i_first_track = cdrom_toc.FirstTrack;
p_env->gen.i_tracks = cdrom_toc.LastTrack - cdrom_toc.FirstTrack + 1; p_env->gen.i_tracks = cdrom_toc.LastTrack - cdrom_toc.FirstTrack + 1;
for( i = 0 ; i <= p_env->gen.i_tracks ; i++ ) { for( i = 0 ; i <= p_env->gen.i_tracks ; i++ ) {
p_env->tocent[ i ].start_lsn = cdio_msf3_to_lba( p_env->tocent[ i ].start_lsn =
cdrom_toc.TrackData[i].Address[1], cdio_msf3_to_lba( cdrom_toc.TrackData[i].Address[1],
cdrom_toc.TrackData[i].Address[2], cdrom_toc.TrackData[i].Address[2],
cdrom_toc.TrackData[i].Address[3] ); cdrom_toc.TrackData[i].Address[3] );
p_env->tocent[ i ].Control = cdrom_toc.TrackData[i].Control; p_env->tocent[ i ].Control = cdrom_toc.TrackData[i].Control;
p_env->tocent[ i ].Format = cdrom_toc.TrackData[i].Format; p_env->tocent[ i ].Format = cdrom_toc.TrackData[i].Format;
cdio_debug("p_sectors: %i, %lu", i, cdio_debug("p_sectors: %i, %lu", i,
@@ -666,7 +681,6 @@ read_toc_win32ioctl (_img_private_t *p_env)
} }
p_env->gen.toc_init = true; p_env->gen.toc_init = true;
return true; return true;
} }
/*! /*!