[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Libcdio-devel] proposed pre-gap patch
From: |
Robert William Fuller |
Subject: |
[Libcdio-devel] proposed pre-gap patch |
Date: |
Thu, 13 Mar 2008 14:44:10 -0400 |
User-agent: |
Thunderbird 2.0.0.6 (X11/20071013) |
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)
- [Libcdio-devel] Re: here's a patch that changes nothing..., Robert William Fuller, 2008/03/08
- [Libcdio-devel] Re: here's a patch that changes nothing..., Robert William Fuller, 2008/03/08
- [Libcdio-devel] Re: here's a patch that changes nothing..., Robert William Fuller, 2008/03/08
- [Libcdio-devel] Re: here's a patch that changes nothing..., Robert William Fuller, 2008/03/08
- [Libcdio-devel] Re: here's a patch that changes nothing..., R. Bernstein, 2008/03/09
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 <=
[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