libcdio-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libcdio-devel] proposed pre-gap patch


From: R. Bernstein
Subject: [Libcdio-devel] proposed pre-gap patch
Date: Thu, 13 Mar 2008 15:08:37 -0400

Thanks! I'll apply this privately at home tonight and look at it
then. Just two more days until 0.80 is released and then this will go
into trunk. (I'm not sure I want to create a branch for what amounts
to two days.)

Robert William Fuller writes:
 > This is the whole shebang minus the regression tests.  It includes the 
 > modifications to the documentation, pre-gap support for cdrdao in 
 > addition to nrg and bin/cue, as well as updates to the library 
 > revisions.  The only thing missing is regression tests.  Hopefully, I'll 
 > get to those shortly.
 > 
 > It turns out texi is pretty easy.  I didn't even need to read the 
 > documentation!  (Although I probably should....)
 > 
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/doc/libcdio.texi libcdio-0.80/doc/libcdio.texi
 > --- libcdio-0.80-clean/doc/libcdio.texi      2007-12-15 17:35:53.000000000 
 > -0500
 > +++ libcdio-0.80/doc/libcdio.texi    2008-03-13 14:26:00.000000000 -0400
 > @@ -876,18 +876,20 @@
 >  @menu
 >  * Tracks::   Tracks
 >  * Sectors::  Block addressing (MSF, LSN, LBA)
 > +* Pre-gaps::  Track pre-gaps
 >  @end menu
 >  
 >  @node Tracks
 >  @section tracks --- disc subdivisions
 >  @cindex track
 > address@hidden gaps
 >  
 >  In this section we describe CD properties and terms that we make use
 >  of in @value{libcdio}.
 >  
 >  A CD is formated into a number of @term{tracks}, and a CD can hold at
 >  most 99 such tracks. This is defined by @code{CDIO_CD_MAX_TRACKS} in
 > address@hidden/sector.h}. Between the tracks CD specifications require a
 > address@hidden/sector.h}. Between some tracks CD specifications require a
 >  ``2 second'' in gap (called a @term{lead-in gap}. This is unused space
 >  with no ``data'' similar to the space between tracks on an old
 >  phonograph. The word ``second'' here really refers to a measure of
 > @@ -900,9 +902,9 @@
 >  second'' lead-in gap and there is supposed to be another ``2 second''
 >  @term{lead-out} gap at the end (or outer edge) of the CD.
 >  
 > -People have discovered that they can put useful data in the various
 > -gaps and their equipment can read this, violating the standards but
 > -allowing a CD to store more data.
 > +People have discovered that they can put useful data in the @term{lead-in}
 > +and @term{lead-out} gaps, and their equipment can read this, violating
 > +the standards but allowing a CD to store more data.
 >  
 >  In order to determine the number of tracks on a CD and where they
 >  start, commands are used to get this table-of-contents or @term{TOC}
 > @@ -922,7 +924,7 @@
 >  @cindex frames
 >  
 >  A track is broken up into a number of 2352-byte @emph{blocks} which we
 > -sometimes call @emph{sectors} or @emph{frames}. Whereas tracks have to
 > +sometimes call @emph{sectors} or @emph{frames}. Whereas tracks may
 >  have a gap between them, a block or sector does not. (In
 >  @value{libcdio} the block size constant is defined using
 >  @code{CDIO_CD_FRAMESIZE_RAW}).
 > @@ -981,6 +983,138 @@
 >  add 150. Why the distinction between LBA and LSN? I don't know,
 >  perhaps this has something to do with ``multisession'' CDs.
 >  
 > address@hidden Pre-gaps
 > address@hidden track pre-gaps -- @acronym{CD-DA} discs and gaps
 > address@hidden CD-DA
 > address@hidden gaps
 > address@hidden lead in
 > address@hidden lead out
 > address@hidden pre-gap
 > address@hidden Q sub-channel
 > +
 > +Gaps are possibly one of the least understood topics in audio discs.
 > +In the case of @acronym{CD-DA} discs, standards require a silent 2
 > +second gap before the first audio track and after the last audio track
 > +(in each session.)  These are respectively referred to as
 > address@hidden and @term{lead-out} gaps.  No other gaps are required.
 > +It is important not to confuse the required @term{lead-in} and
 > address@hidden gaps with the optional track @term{pre-gap}s.  Track
 > address@hidden are the gaps that may occur between audio tracks.
 > +Typically, track @term{pre-gap}s are filled with silence so that the
 > +listener knows that one song has ended, and the next will soon begin.
 > +However, track @term{pre-gap}s do not have to contain silence.  One
 > +exception is an audio disc of a live performance.  Because the
 > +performer may seamlessly move from one piece of the performance to the
 > +next, it would be unnatural for the disc to contain silence between
 > +the two pieces.  Instead, the track number updates with no
 > +interruption in the performance.  This allows the listener to either
 > +hear the entire performance without unnatural interruptions, or to
 > +conveniently skip to certain pieces of the performance.  Finally, some
 > address@hidden discs--whose behavior will be described below--lack
 > +track @term{pre-gap}s altogether although they must still include the
 > address@hidden and @term{lead-out} gaps.
 > +
 > +In order to understand the track @term{pre-gap}s that occur between
 > +audio tracks, it is necessary to understand how CD players display the
 > +track number and time.  Embedded in each block of audio data is
 > +non-audio information known as the @term{Q sub-channel}.  The
 > address@hidden sub-channel} data tells the CD player what track number and 
 > time
 > +it should display while it is playing the block of audio data in which
 > +the @term{Q sub-channel} data is embedded.  Near the end of some
 > +tracks, the @term{Q sub-channel} may instruct the CD player to update
 > +the track number to the next track, and display a count down to the
 > +next track, often starting at -2 seconds and proceeding to zero.  This
 > +is known as an audio track @term{pre-gap}.  It may either contain
 > +silence, or as previously discussed--in the case of live
 > +performances--it may contain audio.  Almost as often as not, there is
 > +no @term{pre-gap} whatsoever.  Regardless, an audio track
 > address@hidden is purely determined by the contents of the
 > address@hidden sub-channel}, which is embedded in each audio sector.  This 
 > has
 > +some interesting implications for the track forward button.
 > +
 > +When the track forward button is pressed on a CD player, the CD player
 > +advances to the next track, skipping that track's @term{pre-gap}.
 > +This is because the CD player uses the starting address of the track
 > +from the disc's table of contents (TOC) to determine where to start
 > +playing a track when either the track forward or track backward
 > +buttons are pressed.  So to hear a @term{pre-gap} for track 4, the
 > +listener must either listen to track 3 first, or use the track forward
 > +or backward buttons to go to track 4, then use the seek backward
 > +button to back up into track 4's @term{pre-gap}, which is really part
 > +of track 3, at least according to the TOC.  Track 1 @term{pre-gap}s
 > +are especially interesting because some commercial discs have audio
 > +hidden before the beginning of the first track!  The only way to hear
 > +this hidden audio with a standard player is to use the seek backward
 > +button as soon as track 1 begins playing!
 > +
 > +Audio track @term{pre-gap}s may be specified in a couple of different
 > +ways in the popular cue file format.  The first way of specifying a
 > address@hidden is to use the @command{PREGAP} command.  This will
 > +place a @term{pre-gap} containing silence before a track.  The second
 > +way of specifying a @term{pre-gap} is to give a track an
 > address@hidden 00} as well as the more normal @command{INDEX 01}.
 > address@hidden 01} will be used to specify the start of the track in
 > +the disc's TOC, while @command{INDEX 00} will be used to specify the
 > +start of the track's @term{pre-gap} as recorded in the @term{Q sub-channel}.
 > address@hidden 00} is ordinarily used for specifying
 > +track @term{pre-gap}s that contain audio rather than silence.  Thus,
 > +the cue file format may be used to specify track @term{pre-gap}s with
 > +silence or audio, depending on whether the @command{PREGAP} or
 > address@hidden 00} commands are specified.  If neither type of
 > address@hidden is specified for a track, no @term{pre-gap} is created
 > +for that track, which merely means the absence of @term{pre-gap}
 > +information in the @term{Q sub-channel}, and the lack of a short count
 > +down to the next track.
 > +
 > +Various @acronym{CD-DA} ripping programs take various approaches to
 > +track @term{pre-gap}s.  Some ripping programs ignore track
 > address@hidden altogether, relying solely on the disc's TOC to
 > +determine where tracks begin and end.  If a disc is ripped with such a
 > +program, then re-burned later, the resulting disc will lack track
 > address@hidden, and thereby lack the playback behavior of counting
 > +down to the next track.  Other ripping programs detect track
 > address@hidden and record them in the popular cue file format among
 > +others.  Such ripping programs sometimes allow the user to determine
 > +whether track @term{pre-gap}s will be appended to the prior track or
 > +pre-pended to the track to which they "belong".  Note that if a
 > +ripping program is ignorant of track @term{pre-gap}s, the track
 > address@hidden will be appended to the prior track, because that is
 > +where the disc's TOC puts them.  Thus, there are many different ways
 > +an application may chose to deal with track @term{pre-gap}s.
 > +Consequently, @kbd{libcdio} does not dictate the policy a ripping
 > +program should use in dealing with track @term{pre-gap}s.  Hence,
 > address@hidden provides the @code{cdio_get_track_pregap_[lba|lsn]()}
 > +interfaces to allow the application to deal with track @term{pre-gap}s
 > +as it sees fit.
 > +
 > +Note that the @code{cdio_get_track_pregap_[lba|lsn]()} interfaces
 > +currently only provide information for CDRDAO TOC, CDRWIN BIN/CUE, and
 > +NRG images.  Getting the track @term{pre-gap}s from a CD drive is a
 > +more complicated problem because not all CD drives support reading the
 > address@hidden sub-channel} DIRECTLY at @emph{high} speed, and there is no
 > +interface to determine whether or not a drive supports this optional
 > +feature, aside from trying to read the @term{Q sub-channel}, and
 > +possibly incurring IO errors.  However, all drives DO support reading
 > +the @term{Q sub-channel} INDIRECTLY while playing an audio disc by
 > +asking the drive for the current position.  Unfortunately, this occurs
 > +at normal playback speed, and requires a certain settling time after
 > +the disc starts playing.  Thus, using this @emph{slow} interface
 > +requires a more sophisticated algorithm, such as binary search or some
 > +heuristic, like backing up progressively from the end of the prior
 > +track to look for the next track's @term{pre-gap}.  Note that CD
 > +drives seek @emph{slow}ly, so it is better to simply use a drive that
 > +can read the @term{Q sub-channel} directly at @emph{high} speed, and
 > +avoid complicated software solutions.  (Not to mention that if the
 > +user has an older system with an analog audio cable hooked up between
 > +their soundboard and their drive, and a ripping program uses the
 > address@hidden interface, the user will hear bits of the audio on the
 > +disc!)  Consequently, because there is no good universal solution to
 > +the problem of reading the @term{Q sub-channel} from a drive,
 > address@hidden currently leaves this problem up to the application, a
 > +problem which is readily approachable through either @kbd{libcdio}'s
 > +MMC interface or @kbd{libcdio}'s cdda interface.  For an example of
 > +one such application, see @url{https://gna.org/projects/cued/}.
 > +
 >  @node How to use
 >  @chapter How to use
 >  
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/include/cdio/track.h libcdio-0.80/include/cdio/track.h
 > --- libcdio-0.80-clean/include/cdio/track.h  2006-01-23 15:30:28.000000000 
 > -0500
 > +++ libcdio-0.80/include/cdio/track.h        2008-03-10 16:15:32.000000000 
 > -0400
 > @@ -196,6 +196,28 @@
 >      @return the starting LSN or CDIO_INVALID_LSN on error.
 >    */
 >    lsn_t cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track);
 > +
 > +  /*!  
 > +    Return the starting LBA for the pregap for track number
 > +    i_track in p_cdio.  Track numbers usually start at something 
 > +    greater than 0, usually 1.
 > +
 > +    @param p_cdio object to get information from
 > +    @param i_track  the track number we want the LBA for
 > +    @return the starting LBA or CDIO_INVALID_LBA on error.
 > +  */
 > +  lba_t cdio_get_track_pregap_lba(const CdIo_t *p_cdio, track_t i_track);
 > +
 > +  /*!  
 > +    Return the starting LSN for the pregap for track number
 > +    i_track in p_cdio.  Track numbers usually start at something 
 > +    greater than 0, usually 1.
 > +
 > +    @param p_cdio object to get information from
 > +    @param i_track  the track number we want the LSN for
 > +    @return the starting LSN or CDIO_INVALID_LSN on error.
 > +  */
 > +  lsn_t cdio_get_track_pregap_lsn(const CdIo_t *p_cdio, track_t i_track);
 >    
 >    /*!  
 >      Return the starting MSF (minutes/secs/frames) for track number
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/Makefile.am libcdio-0.80/lib/driver/Makefile.am
 > --- libcdio-0.80-clean/lib/driver/Makefile.am        2007-10-15 
 > 00:53:59.000000000 -0400
 > +++ libcdio-0.80/lib/driver/Makefile.am      2008-03-11 22:20:26.000000000 
 > -0400
 > @@ -43,9 +43,9 @@
 >  #     public release, then set AGE to 0. A changed interface means an
 >  #     incompatibility with previous versions.
 >  
 > -libcdio_la_CURRENT = 8
 > -libcdio_la_REVISION = 1
 > -libcdio_la_AGE = 1
 > +libcdio_la_CURRENT = 9
 > +libcdio_la_REVISION = 0
 > +libcdio_la_AGE = 2
 >  
 >  EXTRA_DIST = image/Makefile FreeBSD/Makefile MSWindows/Makefile \
 >           libcdio.sym
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/cdio_private.h 
 > libcdio-0.80/lib/driver/cdio_private.h
 > --- libcdio-0.80-clean/lib/driver/cdio_private.h     2006-01-23 
 > 15:48:11.000000000 -0500
 > +++ libcdio-0.80/lib/driver/cdio_private.h   2008-03-09 21:23:04.000000000 
 > -0400
 > @@ -260,6 +260,13 @@
 >        CDIO_INVALID_LBA is returned on error.
 >      */
 >      lba_t (*get_track_lba) ( void *p_env, track_t i_track );
 > +
 > +    /*!  
 > +      Return the starting LBA for the pregap for track number
 > +      i_track in p_env.  Tracks numbers start at 1.
 > +      CDIO_INVALID_LBA is returned on error.
 > +    */
 > +    lba_t (*get_track_pregap_lba) ( const void *p_env, track_t i_track );
 >      
 >      /*!  
 >        Get format of track. 
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image/bincue.c 
 > libcdio-0.80/lib/driver/image/bincue.c
 > --- libcdio-0.80-clean/lib/driver/image/bincue.c     2006-02-13 
 > 06:00:53.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image/bincue.c   2008-03-10 17:28:43.000000000 
 > -0400
 > @@ -632,7 +632,7 @@
 >            goto err_exit;
 >          }
 >          if (cd) {
 > -          cd->tocent[i].pregap = lba;
 > +          cd->tocent[i].silence = lba;
 >          }
 >        } else {
 >          goto format_error;
 > @@ -672,7 +672,14 @@
 >            track_info_t  *this_track=
 >              &(cd->tocent[cd->gen.i_tracks - cd->gen.i_first_track]);
 >  
 > -          if (start_index != 0) {
 > +          switch (start_index) {
 > +
 > +          case 0:
 > +            lba += CDIO_PREGAP_SECTORS;
 > +            this_track->pregap = lba;
 > +            break;
 > +
 > +          case 1:
 >              if (!b_first_index_for_track) {
 >                lba += CDIO_PREGAP_SECTORS;
 >                cdio_lba_to_msf(lba, &(this_track->start_msf));
 > @@ -709,6 +716,10 @@
 >                }
 >              }
 >              this_track->num_indices++;
 > +            break;
 > +
 > +          default:
 > +            break;
 >            }
 >          }
 >  #endif  
 > @@ -1163,6 +1174,7 @@
 >    _funcs.get_track_lba         = _get_lba_track_bincue;
 >    _funcs.get_track_msf         = _get_track_msf_image;
 >    _funcs.get_track_preemphasis = get_track_preemphasis_image,
 > +  _funcs.get_track_pregap_lba  = get_track_pregap_lba_image;
 >    _funcs.lseek                 = _lseek_bincue;
 >    _funcs.read                  = _read_bincue;
 >    _funcs.read_audio_sectors    = _read_audio_sectors_bincue;
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image/cdrdao.c 
 > libcdio-0.80/lib/driver/image/cdrdao.c
 > --- libcdio-0.80-clean/lib/driver/image/cdrdao.c     2007-03-05 
 > 06:49:24.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image/cdrdao.c   2008-03-13 13:24:34.000000000 
 > -0400
 > @@ -825,6 +825,7 @@
 >        if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
 >          /* todo: line is too long! */
 >          if (NULL != cd) {
 > +          cd->tocent[i].pregap = cd->tocent[i].start_lba;
 >            cd->tocent[i].start_lba += cdio_mmssff_to_lba (psz_field);
 >            cdio_lba_to_msf(cd->tocent[i].start_lba, 
 >                            &(cd->tocent[i].start_msf));
 > @@ -843,7 +844,7 @@
 >      if (0 <= i) {
 >        if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
 >          if (NULL != cd) 
 > -          cd->tocent[i].pregap = cdio_mmssff_to_lba (psz_field);
 > +          cd->tocent[i].silence = cdio_mmssff_to_lba (psz_field);
 >        } else {
 >          goto format_error;
 >        }
 > @@ -1295,6 +1296,7 @@
 >    _funcs.get_track_lba         = _get_lba_track_cdrdao;
 >    _funcs.get_track_msf         = _get_track_msf_image;
 >    _funcs.get_track_preemphasis = get_track_preemphasis_image,
 > +  _funcs.get_track_pregap_lba  = get_track_pregap_lba_image;
 >    _funcs.lseek                 = _lseek_cdrdao;
 >    _funcs.read                  = _read_cdrdao;
 >    _funcs.read_audio_sectors    = _read_audio_sectors_cdrdao;
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image/nrg.c libcdio-0.80/lib/driver/image/nrg.c
 > --- libcdio-0.80-clean/lib/driver/image/nrg.c        2008-03-03 
 > 07:04:34.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image/nrg.c      2008-03-13 13:36:30.000000000 
 > -0400
 > @@ -371,24 +371,24 @@
 >        case DAOX_ID: /* "DAOX" */ 
 >        case DAOI_ID: /* "DAOI" */
 >      {
 > +      _daox_t *_xentries = NULL;
 > +      _daoi_t *_ientries = NULL;
 > +      _dao_common_t  *_dao_common = (void *) chunk->data;
 > +      int disc_mode = _dao_common->unknown[1];
 >        track_format_t track_format;
 > -      int disc_mode;
 > +      int i;
 >  
 >        /* We include an extra 0 byte so these can be used as C strings.*/
 > -      p_env->psz_mcn    = calloc(1, CDIO_MCN_SIZE+1);
 > +      p_env->psz_mcn = calloc(1, CDIO_MCN_SIZE+1);
 > +      memcpy(p_env->psz_mcn, &(_dao_common->psz_mcn), CDIO_MCN_SIZE);
 > +      p_env->psz_mcn[CDIO_MCN_SIZE] = '\0';
 >  
 >        if (DAOX_ID == opcode) {
 > -        _daox_array_t *_entries = (void *) chunk->data;
 > -        disc_mode    = _entries->_unknown[1];
 > -        p_env->dtyp  = _entries->_unknown[19];
 > -        memcpy(p_env->psz_mcn, &(_entries->psz_mcn), CDIO_MCN_SIZE);
 > -        p_env->psz_mcn[CDIO_MCN_SIZE] = '\0';
 > +        _xentries = (void *) chunk->data;
 > +        p_env->dtyp = _xentries->track_info[0].common.unknown[0];
 >        } else {
 > -        _daoi_array_t *_entries = (void *) chunk->data;
 > -        disc_mode    = _entries->_unknown[1];
 > -        p_env->dtyp  = _entries->_unknown[19];
 > -        memcpy(p_env->psz_mcn, &(_entries->psz_mcn), CDIO_MCN_SIZE);
 > -        p_env->psz_mcn[CDIO_MCN_SIZE] = '\0';
 > +        _ientries = (void *) chunk->data;
 > +        p_env->dtyp = _ientries->track_info[0].common.unknown[0];
 >        }
 >  
 >        p_env->is_dao = true;
 > @@ -430,7 +430,6 @@
 >          track_format = TRACK_FORMAT_AUDIO;
 >        }
 >        if (0 == disc_mode) {
 > -        int i;
 >          for (i=0; i<p_env->gen.i_tracks; i++) {
 >            cdtext_init (&(p_env->gen.cdtext_track[i]));
 >            p_env->tocent[i].track_format= track_format;
 > @@ -446,7 +445,6 @@
 >            }
 >          }
 >        } else if (2 == disc_mode) {
 > -        int i;
 >          for (i=0; i<p_env->gen.i_tracks; i++) {
 >            cdtext_init (&(p_env->gen.cdtext_track[i]));
 >            p_env->tocent[i].track_green = true;
 > @@ -473,6 +471,20 @@
 >                    "Don't know if mode 1, mode 2 or mixed: %x\n", 
 >                    disc_mode);
 >        }
 > +
 > +      for (i=0; i<p_env->gen.i_tracks; i++) {
 > +        if (!p_env->tocent[i].datasize) {
 > +          continue;
 > +        }
 > +        if (DAOX_ID == opcode) {
 > +           p_env->tocent[i].pregap = (uint64_from_be
 > +            (_xentries->track_info[i].index0)) / 
 > (p_env->tocent[i].datasize);
 > +        } else {
 > +           p_env->tocent[i].pregap = (uint32_from_be
 > +            (_ientries->track_info[i].index0)) / 
 > (p_env->tocent[i].datasize);
 > +        }
 > +      }
 > +
 >        break;
 >      }
 >        case NERO_ID: 
 > @@ -1243,13 +1255,14 @@
 >    _funcs.get_media_changed     = get_media_changed_image;
 >    _funcs.get_mcn               = _get_mcn_image;
 >    _funcs.get_num_tracks        = _get_num_tracks_image;
 > -  _funcs.get_track_channels    = get_track_channels_generic,
 > -  _funcs.get_track_copy_permit = get_track_copy_permit_image,
 > +  _funcs.get_track_channels    = get_track_channels_generic;
 > +  _funcs.get_track_copy_permit = get_track_copy_permit_image;
 >    _funcs.get_track_format      = get_track_format_nrg;
 >    _funcs.get_track_green       = _get_track_green_nrg;
 >    _funcs.get_track_lba         = NULL; /* Will use generic routine via msf 
 > */
 >    _funcs.get_track_msf         = _get_track_msf_image;
 > -  _funcs.get_track_preemphasis = get_track_preemphasis_generic,
 > +  _funcs.get_track_preemphasis = get_track_preemphasis_generic;
 > +  _funcs.get_track_pregap_lba  = get_track_pregap_lba_image;
 >    _funcs.lseek                 = _lseek_nrg;
 >    _funcs.read                  = _read_nrg;
 >    _funcs.read_audio_sectors    = _read_audio_sectors_nrg;
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image/nrg.h libcdio-0.80/lib/driver/image/nrg.h
 > --- libcdio-0.80-clean/lib/driver/image/nrg.h        2006-01-14 
 > 04:45:44.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image/nrg.h      2008-03-08 23:16:21.000000000 
 > -0500
 > @@ -71,19 +71,48 @@
 >    uint32_t lsn        GNUC_PACKED; 
 >  } _cuex_array_t;
 >  
 > +/* New DAO[XI] Information from 
 > http://en.wikipedia.org/wiki/NRG_(file_format)
 > +*/
 > +
 >  typedef struct {
 > -  uint32_t _unknown1  GNUC_PACKED;
 > -  char      psz_mcn[CDIO_MCN_SIZE];             
 > -  uint8_t  _unknown[64-CDIO_MCN_SIZE-sizeof(uint32_t)];
 > +  uint8_t  zero[10];
 > +  uint32_t sector_size         GNUC_PACKED;
 > +  uint8_t  unknown[4];
 > +} _dao_array_common_t;
 > +
 > +typedef struct {
 > +  _dao_array_common_t common;
 > +  uint64_t index0              GNUC_PACKED;
 > +  uint64_t index1              GNUC_PACKED;
 > +  uint64_t end_of_track        GNUC_PACKED;
 >  } _daox_array_t;
 >  
 >  typedef struct {
 > -  uint32_t _unknown1  GNUC_PACKED;
 > -  char      psz_mcn[CDIO_MCN_SIZE];
 > -  uint8_t  _unknown[64-CDIO_MCN_SIZE-sizeof(uint32_t)];
 > +  _dao_array_common_t common;
 > +  uint32_t index0              GNUC_PACKED;
 > +  uint32_t index1              GNUC_PACKED;
 > +  uint32_t end_of_track        GNUC_PACKED;
 >  } _daoi_array_t;
 >  
 >  typedef struct {
 > +  uint32_t chunk_size_le       GNUC_PACKED;
 > +  char     psz_mcn[CDIO_MCN_SIZE];
 > +  uint8_t  unknown[3];
 > +  uint8_t  first_track;
 > +  uint8_t  last_track;
 > +} _dao_common_t;
 > +
 > +typedef struct {
 > +  _dao_common_t common;
 > +  _daox_array_t track_info[EMPTY_ARRAY_SIZE];
 > +} _daox_t;
 > +
 > +typedef struct {
 > +  _dao_common_t common;
 > +  _daoi_array_t track_info[EMPTY_ARRAY_SIZE];
 > +} _daoi_t;
 > +
 > +typedef struct {
 >    uint32_t id                    GNUC_PACKED;
 >    uint32_t len                   GNUC_PACKED;
 >    char data[EMPTY_ARRAY_SIZE];
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image.h libcdio-0.80/lib/driver/image.h
 > --- libcdio-0.80-clean/lib/driver/image.h    2005-02-16 23:57:21.000000000 
 > -0500
 > +++ libcdio-0.80/lib/driver/image.h  2008-03-10 14:50:01.000000000 -0400
 > @@ -48,7 +48,8 @@
 >    msf_t          start_msf;
 >    lba_t          start_lba;
 >    int            start_index;
 > -  lba_t          pregap;    /**< pre-gap with zero audio data */
 > +  lba_t          pregap;    /**< pre-gap */
 > +  lba_t          silence;   /**< pre-gap with zero audio data */
 >    int            sec_count;     /**< Number of sectors in this track. Does 
 > not
 >                                   include pregap */
 >    int            num_indices;
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image_common.c 
 > libcdio-0.80/lib/driver/image_common.c
 > --- libcdio-0.80-clean/lib/driver/image_common.c     2005-02-17 
 > 02:03:37.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image_common.c   2008-03-10 15:34:08.000000000 
 > -0400
 > @@ -246,6 +246,30 @@
 >         & PRE_EMPHASIS ) ? CDIO_TRACK_FLAG_TRUE : CDIO_TRACK_FLAG_FALSE;
 >  }
 >  
 > +/*! Return the starting LBA for the pregap for track number i_track.
 > +  Track numbers start at 1.
 > +  CDIO_INVALID_LBA is returned on error.
 > +*/
 > +lba_t
 > +get_track_pregap_lba_image(const void *p_user_data, track_t i_track)
 > +{
 > +  const _img_private_t *p_env = p_user_data;
 > +  lba_t pregap, start_lba;
 > +
 > +  pregap    = p_env->tocent[i_track-p_env->gen.i_first_track].pregap;
 > +  start_lba = p_env->tocent[i_track-p_env->gen.i_first_track].start_lba;
 > +
 > +  /* avoid initializing pregap to CDIO_INVALID_LBA by letting calloc
 > +     do the work.  also, nero files have the pregap set equal
 > +     to the start of the track when there is no pregap
 > +  */
 > +  if (!pregap || pregap == start_lba) {
 > +    pregap = CDIO_INVALID_LBA;
 > +  }
 > +
 > +  return pregap;
 > +}
 > +
 >  /*!
 >    Read a data sector
 >    
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/image_common.h 
 > libcdio-0.80/lib/driver/image_common.h
 > --- libcdio-0.80-clean/lib/driver/image_common.h     2005-02-17 
 > 02:03:37.000000000 -0500
 > +++ libcdio-0.80/lib/driver/image_common.h   2008-03-09 21:03:31.000000000 
 > -0400
 > @@ -150,6 +150,13 @@
 >  */
 >  track_flag_t get_track_preemphasis_image(const void *p_user_data, 
 >                                       track_t i_track);
 > +
 > +/*! Return the starting LBA for the pregap for track number i_track.
 > +  Track numbers start at 1.
 > +  CDIO_INVALID_LBA is returned on error.
 > +*/
 > +lba_t get_track_pregap_lba_image(const void *p_user_data, track_t i_track);
 > +
 >  /*!
 >    Read a data sector
 >    
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/libcdio.sym libcdio-0.80/lib/driver/libcdio.sym
 > --- libcdio-0.80-clean/lib/driver/libcdio.sym        2007-12-15 
 > 17:35:53.000000000 -0500
 > +++ libcdio-0.80/lib/driver/libcdio.sym      2008-03-10 16:17:27.000000000 
 > -0400
 > @@ -80,6 +80,8 @@
 >  cdio_get_track_green
 >  cdio_get_track_last_lsn
 >  cdio_get_track_lba
 > +cdio_get_track_pregap_lba
 > +cdio_get_track_pregap_lsn
 >  cdio_get_track_lsn
 >  cdio_get_track_msf
 >  cdio_get_track_preemphasis
 > diff -ur -x libcdio.info -x version.h -x 'libiso9660*pc' -x 'libcdio*pc' 
 > libcdio-0.80-clean/lib/driver/track.c libcdio-0.80/lib/driver/track.c
 > --- libcdio-0.80-clean/lib/driver/track.c    2005-02-05 23:20:25.000000000 
 > -0500
 > +++ libcdio-0.80/lib/driver/track.c  2008-03-10 16:16:54.000000000 -0400
 > @@ -229,7 +229,7 @@
 >    i_track in cdio.  Tracks numbers start at 1.
 >    The "leadout" track is specified either by
 >    using i_track LEADOUT_TRACK or the total tracks+1.
 > -  CDIO_INVALID_LBA is returned on error.
 > +  CDIO_INVALID_LSN is returned on error.
 >  */
 >  lsn_t
 >  cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track)
 > @@ -247,6 +247,34 @@
 >  }
 >  
 >  /*!  
 > +  Return the starting LBA for the pregap for track number
 > +  i_track in cdio.  Track numbers start at 1.
 > +  CDIO_INVALID_LBA is returned on error.
 > +*/
 > +lba_t
 > +cdio_get_track_pregap_lba(const CdIo_t *p_cdio, track_t i_track)
 > +{
 > +  if (p_cdio == NULL) return CDIO_INVALID_LBA;
 > +
 > +  if (p_cdio->op.get_track_pregap_lba) {
 > +    return p_cdio->op.get_track_pregap_lba (p_cdio->env, i_track);
 > +  } else {
 > +    return CDIO_INVALID_LBA;
 > +  }
 > +}
 > +
 > +/*!  
 > +  Return the starting LSN for the pregap for track number
 > +  i_track in cdio.  Track numbers start at 1.
 > +  CDIO_INVALID_LSN is returned on error.
 > +*/
 > +lsn_t
 > +cdio_get_track_pregap_lsn(const CdIo_t *p_cdio, track_t i_track)
 > +{
 > +  return cdio_lba_to_lsn(cdio_get_track_pregap_lba(p_cdio, i_track));
 > +}
 > +
 > +/*!  
 >    Return the ending LSN for track number
 >    i_track in cdio.  CDIO_INVALID_LSN is returned on error.
 >  */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]