diff options
author | 2009-10-01 21:14:39 +0200 | |
---|---|---|
committer | 2009-10-01 21:14:39 +0200 | |
commit | 00e09ae4c805345f4dacdfabb9a03ed04311944c (patch) | |
tree | f89d1e6ccd6e21a5df5285a920df5adc2f57f4c0 /plugins | |
parent | 6303b539693d1c3aa58c0164e5a9799953abef41 (diff) |
fixed playback of http mp3 streams with unknown length
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mpgmad/mpgmad.c | 36 | ||||
-rw-r--r-- | plugins/vfs_curl/vfs_curl.c | 2 |
2 files changed, 24 insertions, 14 deletions
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c index 99feeb07..fe73b17f 100644 --- a/plugins/mpgmad/mpgmad.c +++ b/plugins/mpgmad/mpgmad.c @@ -519,13 +519,24 @@ cmp3_init (DB_playItem_t *it) { } int res = cmp3_scan_stream (&buffer, 0); if (res < 0) { + trace ("mpgmad: cmp3_init: initial cmp3_scan_stream failed\n"); plugin.free (); return -1; } it->duration = buffer.duration; - buffer.endsample = buffer.totalsamples - 1; + if (buffer.duration >= 0) { + buffer.endsample = buffer.totalsamples - 1; + } + else { +// buffer.duration = 200; +// buffer.totalsamples = 10000000; +// buffer.endsample = buffer.totalsamples-1; + buffer.endsample = -1; + buffer.totalsamples = -1; + } buffer.skipsamples = 0; buffer.currentsample = 0; + trace ("duration=%d, endsample=%d, totalsamples=%d\n", buffer.duration, buffer.endsample, buffer.totalsamples); } if (buffer.samplerate == 0) { trace ("bad mpeg file: %f\n", it->fname); @@ -590,11 +601,13 @@ MadFixedToFloat (mad_fixed_t Fixed) { static int cmp3_decode (void) { - if (buffer.currentsample + buffer.readsize / (4 * buffer.channels) > buffer.endsample) { - buffer.readsize = (buffer.endsample - buffer.currentsample + 1) * 4 * buffer.channels; - trace ("size truncated to %d bytes, cursample=%d, endsample=%d, totalsamples=%d\n", buffer.readsize, buffer.currentsample, buffer.endsample, buffer.totalsamples); - if (buffer.readsize <= 0) { - return 0; + if (buffer.duration >= 0) { + if (buffer.currentsample + buffer.readsize / (4 * buffer.channels) > buffer.endsample) { + buffer.readsize = (buffer.endsample - buffer.currentsample + 1) * 4 * buffer.channels; + trace ("size truncated to %d bytes, cursample=%d, endsample=%d, totalsamples=%d\n", buffer.readsize, buffer.currentsample, buffer.endsample, buffer.totalsamples); + if (buffer.readsize <= 0) { + return 0; + } } } int eof = 0; @@ -664,7 +677,7 @@ cmp3_decode (void) { int cachepos = (buffer.cachefill + buffer.cachepos) & CACHE_MASK; int len = synth.pcm.length; - if (buffer.currentsample + len > buffer.endsample) { + if (buffer.duration >= 0 && buffer.currentsample + len > buffer.endsample) { len = buffer.endsample - buffer.currentsample + 1; } int i = min (synth.pcm.length, buffer.skipsamples); @@ -699,12 +712,9 @@ cmp3_decode (void) { buffer.readsize -= sizeof (mad_fixed_t); } } - if (buffer.currentsample > buffer.totalsamples) { - trace ("mpgmad: warning: extra samples were read after end of stream\n"); - } - if (buffer.readsize <= 0 || eof || buffer.currentsample > buffer.endsample) { - if (buffer.currentsample > buffer.endsample) { - trace ("finished at sample %d (%d)\n", buffer.currentsample, buffer.totalsamples); + if (buffer.readsize <= 0 || eof || (buffer.duration >= 0 && buffer.currentsample > buffer.endsample)) { + if (buffer.duration >= 0 && buffer.currentsample > buffer.endsample) { + trace ("finished at sample %d (%dsamples/%fsec), eof=%d, buffer.readsize=%d\n", buffer.currentsample, buffer.totalsamples, buffer.duration, eof, buffer.readsize); } break; } diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c index 8029ae6c..c4f527b6 100644 --- a/plugins/vfs_curl/vfs_curl.c +++ b/plugins/vfs_curl/vfs_curl.c @@ -59,7 +59,7 @@ static char http_err[CURL_ERROR_SIZE]; static size_t http_curl_write (void *ptr, size_t size, size_t nmemb, void *stream) { - trace ("http_curl_write %d bytes\n", size * nmemb); +// trace ("http_curl_write %d bytes\n", size * nmemb); HTTP_FILE *fp = (HTTP_FILE *)stream; int avail = size * nmemb; while (avail > 0) { |