diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-10-06 22:02:39 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-10-06 22:02:39 +0200 |
commit | f7265784afff6f9c1536a5971adca0376318c156 (patch) | |
tree | ad2eaaf35c0ebd0b1dd936b15e237347eb070a94 | |
parent | d8b86fa8bce3a4258bd3ae83c91a057b9ff62440 (diff) |
added workaround for some of malformed cuesheet files
-rw-r--r-- | playlist.c | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -174,7 +174,7 @@ pl_process_cue_track (playItem_t *after, const char *fname, playItem_t **prev, c // PREGAP command prevtime = f_index01 - f_pregap; } - else if (index00[0]) { + else if (index00[0] && index01[0]) { // pregap in index 00 prevtime = f_index00; } @@ -186,8 +186,22 @@ pl_process_cue_track (playItem_t *after, const char *fname, playItem_t **prev, c return after; } (*prev)->endsample = (prevtime * samplerate) - 1; - trace ("calc endsample=%d, prevtime=%f, samplerate=%d\n", (*prev)->endsample, prevtime, samplerate); (*prev)->duration = (float)((*prev)->endsample - (*prev)->startsample + 1) / samplerate; + if ((*prev)->duration < 0) { + // might be bad cuesheet file, try to fix + trace ("cuesheet seems to be corrupted, trying workaround\n"); + trace ("[bad:] calc endsample=%d, prevtime=%f, samplerate=%d, prev track duration=%f\n", (*prev)->endsample, prevtime, samplerate, (*prev)->duration); + prevtime = f_index01; + (*prev)->endsample = (prevtime * samplerate) - 1; + (*prev)->duration = (float)((*prev)->endsample - (*prev)->startsample + 1) / samplerate; + if ((*prev)->duration > 0) { + trace ("success :-D\n"); + } + else { + trace ("fail :-(\n"); + } + } + trace ("calc endsample=%d, prevtime=%f, samplerate=%d, prev track duration=%f\n", (*prev)->endsample, prevtime, samplerate, (*prev)->duration); } // non-compliant hack to handle tracks which only store pregap info if (!index01[0]) { @@ -203,9 +217,6 @@ pl_process_cue_track (playItem_t *after, const char *fname, playItem_t **prev, c if (index01[0]) { t = f_index01; } - else { - t = f_index00; - } it->startsample = t * samplerate; it->endsample = -1; // will be filled by next read, or by decoder |