[Top][All Lists]
[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.
> */
- [Libcdio-devel] Re: here's a patch that changes nothing..., (continued)
Re: [Libcdio-devel] libcdio freeze for 0.80 next weekend, Robert William Fuller, 2008/03/10
[Libcdio-devel] proposed pre-gap patch, Robert William Fuller, 2008/03/13
[Libcdio-devel] unexpected offset in bincue.c for audio sectors, Robert William Fuller, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, Eric Shattow, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, Robert William Fuller, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, Robert William Fuller, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, R. Bernstein, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, Robert William Fuller, 2008/03/17
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, R. Bernstein, 2008/03/17
- Message not available
- Message not available
- Message not available
- Message not available
- Message not available
- Re: [Libcdio-devel] unexpected offset in bincue.c for audio sectors, Robert William Fuller, 2008/03/19