summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-04-25 21:49:56 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-04-25 21:49:56 +0200
commit9811ff6346902dde48fc8e52916448a302e721f9 (patch)
treec6902575cf4db388605fe4fc343e7c9850566310
parente68f2a2a47c4d24932a6b5cef3ee29f50e35ef1d (diff)
added couple of tweaks to improve syability of vfs_curl
-rw-r--r--plugins/vfs_curl/vfs_curl.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c
index 0080e68c..168bbb8a 100644
--- a/plugins/vfs_curl/vfs_curl.c
+++ b/plugins/vfs_curl/vfs_curl.c
@@ -22,6 +22,7 @@
#include <unistd.h>
#include <assert.h>
#include <curl/curlver.h>
+#include <time.h>
#include "../../deadbeef.h"
#define trace(...) { fprintf(stderr, __VA_ARGS__); }
@@ -190,10 +191,25 @@ http_parse_shoutcast_meta (HTTP_FILE *fp, const char *meta, int size) {
return -1;
}
+static void
+http_stream_reset (HTTP_FILE *fp) {
+ fp->gotheader = 0;
+ fp->icyheader = 0;
+ fp->gotsomeheader = 0;
+ fp->remaining = 0;
+ fp->metadata_size = 0;
+ fp->metadata_have_size = 0;
+ fp->skipbytes = 0;
+ fp->nheaderpackets = 0;
+ fp->icy_metaint = 0;
+ fp->wait_meta = 0;
+}
+
static size_t
http_curl_write (void *ptr, size_t size, size_t nmemb, void *stream) {
int avail = size * nmemb;
HTTP_FILE *fp = (HTTP_FILE *)stream;
+
// trace ("http_curl_write %d bytes, wait_meta=%d\n", size * nmemb, fp->wait_meta);
gettimeofday (&fp->last_read_time, NULL);
if (fp->status == STATUS_ABORTED) {
@@ -263,7 +279,7 @@ http_curl_write (void *ptr, size_t size, size_t nmemb, void *stream) {
fp->metadata_size = fp->metadata_have_size = 0;
if (http_parse_shoutcast_meta (fp, fp->metadata, sz) < 0) {
trace ("vfs_curl: got invalid icy metadata block\n");
- fp->remaining = 0;
+ http_stream_reset (fp);
fp->status = STATUS_SEEK;
return 0;
}
@@ -426,7 +442,7 @@ http_curl_control (void *stream, double dltotal, double dlnow, double ultotal, d
if (fp->status == STATUS_READING && sec > TIMEOUT) {
trace ("http_curl_control: timed out, restarting read\n");
memcpy (&fp->last_read_time, &tm, sizeof (struct timeval));
- fp->remaining = 0;
+ http_stream_reset (fp);
fp->status = STATUS_SEEK;
}
assert (stream);