diff options
Diffstat (limited to '')
-rw-r--r-- | TODO | 19 | ||||
-rw-r--r-- | src/decode.c | 17 | ||||
-rw-r--r-- | src/outputBuffer.c | 9 | ||||
-rw-r--r-- | src/outputBuffer.h | 1 |
4 files changed, 18 insertions, 28 deletions
@@ -1,21 +1,16 @@ -1) remove wrap from ring buffer code, its not 100% safe - a) player, just ensure that begin != end - b) decoder: compute what the next chunk needs to be - and wait till begin is no longer that +1) put some sort of error reporting for streaming/inputStream! -2) put some sort of error reporting for streaming/inputStream! +2) Fix charset errors so they don't goto stderr/out -3) Fix charset errors so they don't goto stderr/out +3) Add a timeout for streams (how long? 1 minutes?) -4) Add a timeout for streams (how long? 1 minutes?) +4) compute time of vorbis from actual number of samples played -5) compute time of vorbis from actual number of samples played +5) remove previous hack for streams -6) remove previous hack for streams +6) add "plversion" and "currentsong" commands -7) add "plversion" and "currentsong" commands - -8) in libmpdclient, buffer all stuff going out for playlist command, +7) in libmpdclient, buffer all stuff going out for playlist command, should make it much faster diff --git a/src/decode.c b/src/decode.c index 267616f91..88208670d 100644 --- a/src/decode.c +++ b/src/decode.c @@ -173,7 +173,6 @@ int decodeSeek(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb, stopDecode(dc); cb->begin = 0; cb->end = 0; - cb->wrap = 0; dc->error = 0; dc->start = 1; waitOnDecode(pc,dc,cb,decodeWaitedOn); @@ -391,7 +390,7 @@ int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { void handleMetadata(OutputBuffer * cb, PlayerControl * pc, int * previous, int * currentChunkSent, MetadataChunk * currentChunk) { - if(cb->begin!=cb->end || cb->wrap) { + if(cb->begin!=cb->end) { int meta = cb->metaChunk[cb->begin]; if( meta != *previous ) { if( meta >= 0 && cb->metaChunkSet[meta]) { @@ -425,7 +424,6 @@ void advanceOutputBufferTo(OutputBuffer * cb, PlayerControl * pc, cb->begin++; if(cb->begin>=buffered_chunks) { cb->begin = 0; - cb->wrap = 0; } } } @@ -454,7 +452,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { pc->play = 0; kill(getppid(),SIGUSR1); - while(*decode_pid>0 && !cb->wrap && cb->end-cb->begin<bbp && + while(*decode_pid>0 && cb->end-cb->begin<bbp && + cb->end!=buffered_chunks-1 && dc->state!=DECODE_STATE_STOP) { processDecodeInput(); @@ -492,9 +491,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { else doCrossFade = -1; } if(pause) my_usleep(10000); - else if((cb->begin!=cb->end || cb->wrap) && - cb->begin!=cb->next) - { + else if(cb->begin!=cb->end && cb->begin!=cb->next) { if(doCrossFade==1 && cb->next>=0 && ((cb->next>cb->begin && (fadePosition=cb->next-cb->begin) @@ -507,7 +504,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { crossFadeChunks = fadePosition; } test = cb->end; - if(cb->wrap) test+=buffered_chunks; + if(cb->end < cb->begin) test+=buffered_chunks; nextChunk = cb->begin+crossFadeChunks; if(nextChunk<test) { if(nextChunk>=buffered_chunks) @@ -557,14 +554,13 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { cb->begin++; if(cb->begin>=buffered_chunks) { cb->begin = 0; - cb->wrap = 0; } } else if(cb->next==cb->begin) { if(doCrossFade==1 && nextChunk>=0) { nextChunk = cb->begin+crossFadeChunks; test = cb->end; - if(cb->wrap) test+=buffered_chunks; + if(cb->end < cb->begin) test+=buffered_chunks; if(nextChunk<test) { if(nextChunk>=buffered_chunks) { @@ -631,7 +627,6 @@ void decode() { cb->begin = 0; cb->end = 0; - cb->wrap = 0; pc = &(getPlayerData()->playerControl); dc = &(getPlayerData()->decoderControl); dc->error = 0; diff --git a/src/outputBuffer.c b/src/outputBuffer.c index 40777db3b..39d9b66af 100644 --- a/src/outputBuffer.c +++ b/src/outputBuffer.c @@ -42,7 +42,6 @@ void clearOutputBuffer(OutputBuffer * cb) { currentChunk = -1; cb->end = cb->begin; - cb->wrap = 0; /* be sure to reset metaChunkSets cause we are skipping over audio * audio chunks, and thus skipping over metadata */ @@ -60,7 +59,6 @@ void flushOutputBuffer(OutputBuffer * cb) { cb->end++; if(cb->end>=buffered_chunks) { cb->end = 0; - cb->wrap = 1; } currentChunk = -1; } @@ -97,8 +95,11 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream, while(datalen) { if(currentChunk != cb->end) { - while(cb->begin==cb->end && cb->wrap && !dc->stop) - { + int next = cb->end+1; + if(next>=buffered_chunks) { + next = 0; + } + while(cb->begin==next && !dc->stop) { if(dc->seek) { if(seekable) { return OUTPUT_BUFFER_DC_SEEK; diff --git a/src/outputBuffer.h b/src/outputBuffer.h index 225ca54ca..57ba33739 100644 --- a/src/outputBuffer.h +++ b/src/outputBuffer.h @@ -38,7 +38,6 @@ typedef struct _OutputBuffer { mpd_sint16 volatile begin; mpd_sint16 volatile end; mpd_sint16 volatile next; - mpd_sint8 volatile wrap; AudioFormat audioFormat; MetadataChunk metadataChunks[BUFFERED_METACHUNKS]; mpd_sint8 metaChunkSet[BUFFERED_METACHUNKS]; |