summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-10-01 21:14:39 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-10-01 21:14:39 +0200
commit00e09ae4c805345f4dacdfabb9a03ed04311944c (patch)
treef89d1e6ccd6e21a5df5285a920df5adc2f57f4c0 /plugins
parent6303b539693d1c3aa58c0164e5a9799953abef41 (diff)
fixed playback of http mp3 streams with unknown length
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mpgmad/mpgmad.c36
-rw-r--r--plugins/vfs_curl/vfs_curl.c2
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) {