From 48adac95ad409a3a8c669111d68ae00b98d8bcc2 Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 17 Jun 2004 01:15:17 +0000 Subject: [PATCH] getFirstrack_osx and getNumberOfTracks_osx do duplicate scanning that could be done when looking for the leadout track. Revised code to removes these routines, consolidating the searching in one loop. To be *very* conservative, a first loop finds the positions of the leadout, first track and last track. This code then doesn't assume that the track numbers are in order. They could be given track 3, 2, and then 1 or 2, 3, and then 1. Another loop then maps first_track..last_track 0..number_of_tracks - 1 --- lib/_cdio_osx.c | 99 +++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 61 deletions(-) diff --git a/lib/_cdio_osx.c b/lib/_cdio_osx.c index 5848e610..cfb083ab 100644 --- a/lib/_cdio_osx.c +++ b/lib/_cdio_osx.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_osx.c,v 1.35 2004/06/16 04:51:29 thesin Exp $ + $Id: _cdio_osx.c,v 1.36 2004/06/17 01:15:17 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein from vcdimager code: @@ -33,7 +33,7 @@ #include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.35 2004/06/16 04:51:29 thesin Exp $"; +static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.36 2004/06/17 01:15:17 rocky Exp $"; #include #include @@ -67,6 +67,9 @@ static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.35 2004/06/16 04:51:29 thesin #include #include +/* Note leadout should be 0xAA, But OSX seems to use 0xA2. */ +#define OSX_CDROM_LEADOUT_TRACK 0xA2 + #define TOTAL_TRACKS (env->i_last_track - env->i_first_track) #define CDROM_CDI_TRACK 0x1 @@ -103,57 +106,6 @@ _free_osx (void *user_data) { if (NULL != env->pTOC) free((void *) env->pTOC); } -/**************************************************************************** - cdio_getNumberOfTracks: get number of tracks in TOC - This is an internal routine and is called once per CD open. - ****************************************************************************/ -static track_t -getNumberOfTracks_osx( CDTOC *pTOC, int i_descriptors ) -{ - track_t i_track = CDIO_INVALID_TRACK; - int i; - int i_tracks = 0; - CDTOCDescriptor *pTrackDescriptors; - - pTrackDescriptors = pTOC->descriptors; - - for( i = i_descriptors; i >= 0; i-- ) - { - i_track = pTrackDescriptors[i].point; - - if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO || i_track == 0xA2 ) - continue; - - i_tracks++; - } - - return( i_tracks ); -} - -/*! - Return the number of the first track. - CDIO_INVALID_TRACK is returned on error. -*/ -static track_t -getFirstTrack_osx( CDTOC *pTOC, int i_descriptors ) -{ - track_t i_track = CDIO_INVALID_TRACK; - int i; - CDTOCDescriptor *pTrackDescriptors; - - pTrackDescriptors = pTOC->descriptors; - - for( i = 0; i <= i_descriptors; i++ ) - { - i_track = pTrackDescriptors[i].point; - - if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO || i_track == 0xA2 ) - continue; - return ( i_track ); - } - return CDIO_INVALID_TRACK; -} - /*! Reads nblocks of mode2 form2 sectors from cd device into data starting from lsn. @@ -419,15 +371,16 @@ _cdio_read_toc (_img_private_t *env) IOObjectRelease( service ); env->i_descriptors = CDTOCGetDescriptorCount ( env->pTOC ); - env->i_first_track = getFirstTrack_osx(env->pTOC, env->i_descriptors); - env->i_last_track = getNumberOfTracks_osx(env->pTOC, env->i_descriptors); - /* Read in starting sectors */ + /* Read in starting sectors. There may be non-tracks mixed in with + the real tracks. So find the first and last track number by + scanning. Also find the lead-out track position. + */ { int i, i_leadout = -1; + CDTOCDescriptor *pTrackDescriptors; track_t i_track; - int i_tracks; env->pp_lba = malloc( TOTAL_TRACKS * sizeof(int) ); if( env->pp_lba == NULL ) @@ -438,19 +391,43 @@ _cdio_read_toc (_img_private_t *env) } pTrackDescriptors = env->pTOC->descriptors; + + env->i_first_track = CDIO_CD_MAX_TRACKS+1; + env->i_last_track = CDIO_CD_MIN_TRACK_NO-1; - for( i_tracks = 0, i = 0; i <= env->i_descriptors; i++ ) + for( i = 0; i <= env->i_descriptors; i++ ) { i_track = pTrackDescriptors[i].point; - if( i_track == 0xA2 ) + if( i_track == OSX_CDROM_LEADOUT_TRACK ) /* Note leadout should be 0xAA, But OSX seems to use 0xA2. */ i_leadout = i; - + if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO ) continue; - env->pp_lba[i_tracks--] = + if (env->i_first_track > i_track) + env->i_first_track = i_track; + + if (env->i_last_track < i_track) + env->i_last_track = i_track; + + } + + /* Now that we know what the first track number is, we can make sure + index positions are ordered starting at 0. + */ + for( i = 0; i <= env->i_descriptors; i++ ) + { + i_track = pTrackDescriptors[i].point; + + if( i_track == OSX_CDROM_LEADOUT_TRACK ) + i_leadout = i; + + if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO ) + continue; + + env->pp_lba[i_track - env->i_first_track] = cdio_lsn_to_lba(CDConvertMSFToLBA( pTrackDescriptors[i].p )); }