summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO13
-rw-r--r--src/aac_decode.c4
-rw-r--r--src/audiofile_decode.c6
-rw-r--r--src/flac_decode.c4
-rw-r--r--src/inputStream.h3
-rw-r--r--src/inputStream_http.c14
-rw-r--r--src/mp3_decode.c6
-rw-r--r--src/mp4_decode.c4
-rw-r--r--src/ogg_decode.c8
-rw-r--r--src/outputBuffer.c11
-rw-r--r--src/outputBuffer.h8
11 files changed, 47 insertions, 34 deletions
diff --git a/TODO b/TODO
index 8712f432b..abdc773e6 100644
--- a/TODO
+++ b/TODO
@@ -1,21 +1,16 @@
1) play streams
- a) make seekings non-blocking:
- 1) player: first check that seekWhere isn't already buffered
- b) bufferInput in outputBuffer waiting!
- 1) implement some sort of callback mechanism for this
- for abstraction sake
- c) deal with pausing better
+ a) deal with pausing better
1) seekable, on resuming pause, check if we need to reconnect,
jumping to offset
2) if seekable, at some point after init, mark this!
3) if not seekable, reset buffer, and elapsedTime when
unpaused
- d) put some sort of error reporting for streaming/inputStream!
- e) fetch metadata and store in DecoderControl and pass to
+ b) put some sort of error reporting for streaming/inputStream!
+ c) fetch metadata and store in DecoderControl and pass to
PlayerControl
1) eventually deal with icy-metadata
2) parse metadata on the fly in decoders
- f) command for dealing with the changing metadata, currentsonginfo
+ d) command for dealing with the changing metadata, currentsonginfo
or something
2) how to deal with streams and the db
diff --git a/src/aac_decode.c b/src/aac_decode.c
index b0b1697b5..22a1db51d 100644
--- a/src/aac_decode.c
+++ b/src/aac_decode.c
@@ -362,8 +362,8 @@ int aac_decode(OutputBuffer * cb, DecoderControl * dc) {
sampleBufferLen = sampleCount*2;
- sendDataToOutputBuffer(cb,dc,sampleBuffer,sampleBufferLen,
- time,bitRate);
+ sendDataToOutputBuffer(cb, NULL, dc, sampleBuffer,
+ sampleBufferLen, time, bitRate);
if(dc->seek) dc->seek = 0;
else if(dc->stop) {
eof = 1;
diff --git a/src/audiofile_decode.c b/src/audiofile_decode.c
index b4a224d19..c62fb816d 100644
--- a/src/audiofile_decode.c
+++ b/src/audiofile_decode.c
@@ -109,7 +109,11 @@ int audiofile_decode(OutputBuffer * cb, DecoderControl * dc) {
if(ret<=0) eof = 1;
else {
current += ret;
- sendDataToOutputBuffer(cb,dc,chunk,ret*fs,
+ sendDataToOutputBuffer(cb,
+ NULL,
+ dc,
+ chunk,
+ ret*fs,
(float)current /
(float)dc->audioFormat.sampleRate,
bitRate);
diff --git a/src/flac_decode.c b/src/flac_decode.c
index a721c0a62..6ef56d22e 100644
--- a/src/flac_decode.c
+++ b/src/flac_decode.c
@@ -376,8 +376,8 @@ int flacSendChunk(FlacData * data) {
doReplayGain(data->chunk,data->chunk_length,&(data->dc->audioFormat),
data->replayGainScale);
- switch(sendDataToOutputBuffer(data->cb,data->dc,data->chunk,
- data->chunk_length,data->time,data->bitRate))
+ switch(sendDataToOutputBuffer(data->cb, NULL, data->dc, data->chunk,
+ data->chunk_length, data->time, data->bitRate))
{
case OUTPUT_BUFFER_DC_STOP:
return -1;
diff --git a/src/inputStream.h b/src/inputStream.h
index 963e3d2c9..f062feb8e 100644
--- a/src/inputStream.h
+++ b/src/inputStream.h
@@ -53,6 +53,9 @@ int openInputStream(InputStream * inStream, char * url);
int seekInputStream(InputStream * inStream, long offset, int whence);
int closeInputStream(InputStream * inStream);
int inputStreamAtEOF(InputStream * inStream);
+
+/* return value: -1 is error, 1 inidicates stuff was buffered, 0 means nothing
+ was buffered */
int bufferInputStream(InputStream * inStream);
size_t readFromInputStream(InputStream * inStream, void * ptr, size_t size,
diff --git a/src/inputStream_http.c b/src/inputStream_http.c
index 1e88db114..c9cde55f2 100644
--- a/src/inputStream_http.c
+++ b/src/inputStream_http.c
@@ -542,20 +542,20 @@ int inputStream_httpBuffer(InputStream * inStream) {
readed = read(data->sock, data->buffer+data->buflen,
(size_t)(HTTP_BUFFER_SIZE-1-data->buflen));
- if(readed < 0 && (errno == EAGAIN || errno == EINTR));
+ if(readed < 0 && (errno == EAGAIN || errno == EINTR)) {
+ readed = 0;
+ }
else if(readed <= 0) {
close(data->sock);
data->connState = HTTP_CONN_STATE_CLOSED;
+ readed = 0;
}
- else {
- /*fwrite(data->buffer+data->buflen,1,readed,stdout);*/
- data->buflen += readed;
- }
-
+ /*fwrite(data->buffer+data->buflen,1,readed,stdout);*/
+ data->buflen += readed;
}
if(data->buflen > HTTP_PREBUFFER_SIZE) data->prebuffer = 0;
- return 0;
+ return (readed ? 1 : 0);
}
/* vim:set shiftwidth=8 tabstop=8 expandtab: */
diff --git a/src/mp3_decode.c b/src/mp3_decode.c
index 716ad70a2..eab53d5ba 100644
--- a/src/mp3_decode.c
+++ b/src/mp3_decode.c
@@ -494,7 +494,9 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
if(data->outputPtr==data->outputBufferEnd) {
long ret;
- ret = sendDataToOutputBuffer(cb,dc,
+ ret = sendDataToOutputBuffer(cb,
+ data->inStream,
+ dc,
data->outputBuffer,
MP3_DATA_OUTPUT_BUFFER_SIZE,
data->elapsedTime,
@@ -584,7 +586,7 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
while(mp3Read(&data,cb,dc)!=DECODE_BREAK);
/* send last little bit if not dc->stop */
if(data.outputPtr!=data.outputBuffer && data.flush) {
- if(sendDataToOutputBuffer(cb,dc,data.outputBuffer,
+ if(sendDataToOutputBuffer(cb,NULL,dc,data.outputBuffer,
data.outputPtr-data.outputBuffer,
data.elapsedTime,data.bitRate/1000) == 0)
{
diff --git a/src/mp4_decode.c b/src/mp4_decode.c
index f837bdacd..71ae21d5e 100644
--- a/src/mp4_decode.c
+++ b/src/mp4_decode.c
@@ -279,8 +279,8 @@ int mp4_decode(OutputBuffer * cb, DecoderControl * dc) {
sampleBuffer+=offset*channels*2;
- sendDataToOutputBuffer(cb,dc,sampleBuffer,
- sampleBufferLen,time,bitRate);
+ sendDataToOutputBuffer(cb, NULL, dc, sampleBuffer,
+ sampleBufferLen, time, bitRate);
if(dc->stop) {
eof = 1;
break;
diff --git a/src/ogg_decode.c b/src/ogg_decode.c
index cdce55367..2cb70c4e1 100644
--- a/src/ogg_decode.c
+++ b/src/ogg_decode.c
@@ -241,16 +241,16 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream)
}
doReplayGain(chunk,ret,&(dc->audioFormat),
replayGainScale);
- sendDataToOutputBuffer(cb,dc,chunk,chunkpos,
- ov_time_tell(&vf),bitRate);
+ sendDataToOutputBuffer(cb, inStream, dc, chunk,
+ chunkpos, ov_time_tell(&vf), bitRate);
if(dc->stop) break;
chunkpos = 0;
}
}
if(!dc->stop && chunkpos > 0) {
- sendDataToOutputBuffer(cb,dc,chunk,chunkpos,
- ov_time_tell(&vf),bitRate);
+ sendDataToOutputBuffer(cb, NULL, dc, chunk, chunkpos,
+ ov_time_tell(&vf), bitRate);
}
ov_clear(&vf);
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index 2323ea97b..f1ea86925 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -43,8 +43,9 @@ void flushOutputBuffer(OutputBuffer * cb) {
}
}
-int sendDataToOutputBuffer(OutputBuffer * cb, DecoderControl * dc,
- char * dataIn, long dataInLen, float time, mpd_uint16 bitRate)
+int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
+ DecoderControl * dc, char * dataIn, long dataInLen, float time,
+ mpd_uint16 bitRate)
{
mpd_uint16 dataToSend;
mpd_uint16 chunkLeft;
@@ -75,7 +76,11 @@ int sendDataToOutputBuffer(OutputBuffer * cb, DecoderControl * dc,
if(currentChunk != cb->end) {
while(cb->begin==cb->end && cb->wrap && !dc->stop)
{
- my_usleep(10000);
+ if(!inStream ||
+ bufferInputStream(inStream) <= 0)
+ {
+ my_usleep(10000);
+ }
}
if(dc->stop) return OUTPUT_BUFFER_DC_STOP;
diff --git a/src/outputBuffer.h b/src/outputBuffer.h
index d5bcb78c4..0ebc8ad1d 100644
--- a/src/outputBuffer.h
+++ b/src/outputBuffer.h
@@ -22,6 +22,7 @@
#include "mpd_types.h"
#include "decode.h"
#include "audio.h"
+#include "inputStream.h"
#define OUTPUT_BUFFER_DC_STOP -1
#define OUTPUT_BUFFER_DC_SEEK -2
@@ -42,8 +43,11 @@ void clearOutputBuffer(OutputBuffer * cb);
void flushOutputBuffer(OutputBuffer * cb);
-int sendDataToOutputBuffer(OutputBuffer * cb, DecoderControl * dc,
- char * data, long datalen, float time, mpd_uint16 bitRate);
+/* we send inStream where for buffering the inputStream while waiting to
+ send the next chunk */
+int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
+ DecoderControl * dc, char * data, long datalen, float time,
+ mpd_uint16 bitRate);
#endif
/* vim:set shiftwidth=4 tabstop=8 expandtab: */