diff --git a/lib/driver/image/cdrdao.c b/lib/driver/image/cdrdao.c index 5d3bd2af..c341b5a9 100644 --- a/lib/driver/image/cdrdao.c +++ b/lib/driver/image/cdrdao.c @@ -229,6 +229,9 @@ _read_cdrdao (void *user_data, void *data, size_t size) /*! Return the size of the CD in logical block address (LBA) units. + + FIXME: this assumes there is only one source for data or + one track of silence. */ static lsn_t get_disc_last_lsn_cdrdao (void *p_user_data) @@ -241,15 +244,22 @@ get_disc_last_lsn_cdrdao (void *p_user_data) if (p_env->tocent[i_leadout-1].sec_count) { i_size = p_env->tocent[i_leadout-1].sec_count; } else { - if (NULL == p_env->tocent[i_leadout-1].data_source) { - cdio_warn ("Data source for image %s is null", - p_env->gen.source_name); - return -1; - } - i_size = cdio_stream_stat(p_env->tocent[i_leadout-1].data_source) - - p_env->tocent[i_leadout-1].offset; + if (NULL == p_env->tocent[i_leadout-1].data_source) { + if (!p_env->tocent[i_leadout-1].silence) { + cdio_warn ("Data source for image %s is null", + p_env->gen.source_name); + return -1; + } + /* FIXME: this is only correct if there is one + track of silence. */ + i_size = p_env->tocent[i_leadout-1].silence; + } else { + /* FIXME: this is only correct if there is one data source. */ + i_size = cdio_stream_stat(p_env->tocent[i_leadout-1].data_source) + - p_env->tocent[i_leadout-1].offset; + } if (i_size < 0) { - cdio_error ("Can't get file information for data souce for image %s", + cdio_error ("Disc data size too small for track specification in image %s", p_env->gen.source_name); return i_size; } @@ -650,7 +660,14 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name) /* SILENCE */ } else if (0 == strcmp ("SILENCE", psz_keyword)) { - UNIMPLIMENTED_MSG; + if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { + if (NULL != cd) + cd->tocent[i].silence = cdio_mmssff_to_lba (psz_field); + } else { + goto format_error; + } + cdio_log(log_level, "%s line %d: SILENCE not fully implimented", + psz_cue_name, i_line); /* ZERO */ } else if (0 == strcmp ("ZERO", psz_keyword)) { @@ -847,7 +864,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name) if (0 <= i) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { if (NULL != cd) - cd->tocent[i].silence = cdio_mmssff_to_lba (psz_field); + cd->tocent[i].pregap = cdio_mmssff_to_lba (psz_field); } else { goto format_error; } diff --git a/test/data/cdda.cue b/test/data/cdda.cue index e48e1a93..4ed1bd82 100644 --- a/test/data/cdda.cue +++ b/test/data/cdda.cue @@ -1,7 +1,7 @@ TITLE "Join us now we have the software" CATALOG 0000010271955 PERFORMER "Richard Stallman" -FILE "BOING.BIN" BINARY +FILE "CDDA.BIN" BINARY TRACK 01 AUDIO FLAGS DCP INDEX 01 00:00:00 diff --git a/test/data/vcd2.toc b/test/data/vcd2.toc index 1dce90b2..c5816ca2 100644 --- a/test/data/vcd2.toc +++ b/test/data/vcd2.toc @@ -1,23 +1,22 @@ -// $Id: vcd2.toc,v 1.1 2005/01/16 04:34:20 rocky Exp $ // Taken from one of Steve Schultz's VCD collection. -// The .bin has been changed and is wrong. +// The .bin and offsets have been changed and are wrong. CD_ROM_XA // Track 1 TRACK MODE2_FORM_MIX COPY -DATAFILE "cdda.bin" 00:05:00 // length in bytes: 1051200 +DATAFILE "../cdda.bin" 00:00:00 // comment // Track 2 TRACK MODE2_FORM_MIX COPY -DATAFILE "cdda.bin" #1051200 34:31:23 // length in bytes: 362892928 +DATAFILE "cdda.bin" #100 00:00:03 // Track 3 TRACK MODE2_FORM_MIX COPY -DATAFILE "cdda.bin" #363944128 39:04:26 // length in bytes: 410729536 +DATAFILE "cdda.bin" #200 00:00:25