Adding support for seeking HTTP streams.
git-svn-id: https://svn.musicpd.org/mpd/trunk@5159 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
202ae2270d
commit
9bdb0b0df2
@ -285,7 +285,6 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
|
||||
return;
|
||||
}
|
||||
|
||||
dc->seekable = inStream.seekable;
|
||||
dc->state = DECODE_STATE_START;
|
||||
dc->start = 0;
|
||||
|
||||
@ -295,6 +294,9 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
|
||||
my_usleep(1000);
|
||||
}
|
||||
|
||||
/* for http streams, seekable is determined in bufferInputStream */
|
||||
dc->seekable = inStream.seekable;
|
||||
|
||||
if (dc->stop) {
|
||||
dc->state = DECODE_STATE_STOP;
|
||||
dc->stop = 0;
|
||||
|
@ -480,11 +480,11 @@ static int finishHTTPInit(InputStream * inStream)
|
||||
snprintf(request, 2048, "GET %s HTTP/1.0\r\n" "Host: %s\r\n"
|
||||
/*"Connection: close\r\n" */
|
||||
"User-Agent: %s/%s\r\n"
|
||||
/*"Range: bytes=%ld-\r\n" */
|
||||
"Range: bytes=%ld-\r\n"
|
||||
"%s" /* authorization */
|
||||
"Icy-Metadata:1\r\n"
|
||||
"\r\n", data->path, data->host, PACKAGE_NAME, PACKAGE_VERSION,
|
||||
/*inStream->offset, */
|
||||
inStream->offset,
|
||||
data->proxyAuth ? data->proxyAuth :
|
||||
(data->httpAuth ? data->httpAuth : "")
|
||||
);
|
||||
@ -681,9 +681,6 @@ static int getHTTPHello(InputStream * inStream)
|
||||
|
||||
data->prebuffer = 1;
|
||||
|
||||
/*mark as unseekable till we actually implement seeking */
|
||||
inStream->seekable = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -714,21 +711,31 @@ int inputStream_httpOpen(InputStream * inStream, char *url)
|
||||
|
||||
int inputStream_httpSeek(InputStream * inStream, long offset, int whence)
|
||||
{
|
||||
/* hack to reopen an HTTP stream if we're trying to seek to
|
||||
* the beginning */
|
||||
if ((whence == SEEK_SET) && (offset == 0)) {
|
||||
InputStreamHTTPData *data;
|
||||
if (!inStream->seekable)
|
||||
return -1;
|
||||
|
||||
data = (InputStreamHTTPData *) inStream->data;
|
||||
close(data->sock);
|
||||
data->connState = HTTP_CONN_STATE_REOPEN;
|
||||
data->buflen = 0;
|
||||
inStream->offset = 0;
|
||||
return 0;
|
||||
switch (whence) {
|
||||
case SEEK_SET:
|
||||
inStream->offset = offset;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
inStream->offset += offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
inStream->offset = inStream->size + offset;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* otherwise, we don't know how to seek in HTTP yet */
|
||||
return -1;
|
||||
InputStreamHTTPData *data = (InputStreamHTTPData *)inStream->data;
|
||||
close(data->sock);
|
||||
data->connState = HTTP_CONN_STATE_REOPEN;
|
||||
data->buflen = 0;
|
||||
|
||||
inputStream_httpBuffer(inStream);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void parseIcyMetadata(InputStream * inStream, char *metadata, int size)
|
||||
|
Loading…
Reference in New Issue
Block a user