aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
10 files changed, 43 insertions, 25 deletions
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: */