From 42a1a76efe43392f37abdac1259b392fee49c3e8 Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Sat, 29 May 2004 12:05:49 +0000 Subject: fix TIcho's seeking while paused bug git-svn-id: https://svn.musicpd.org/mpd/trunk@1225 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/aac_decode.c | 2 +- src/audiofile_decode.c | 1 + src/flac_decode.c | 2 +- src/mp3_decode.c | 3 ++- src/mp4_decode.c | 3 ++- src/ogg_decode.c | 7 ++++--- src/outputBuffer.c | 10 ++++++++-- src/outputBuffer.h | 4 ++-- 8 files changed, 21 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/aac_decode.c b/src/aac_decode.c index 22a1db51d..25af3f345 100644 --- a/src/aac_decode.c +++ b/src/aac_decode.c @@ -362,7 +362,7 @@ int aac_decode(OutputBuffer * cb, DecoderControl * dc) { sampleBufferLen = sampleCount*2; - sendDataToOutputBuffer(cb, NULL, dc, sampleBuffer, + sendDataToOutputBuffer(cb, NULL, dc, 0, sampleBuffer, sampleBufferLen, time, bitRate); if(dc->seek) dc->seek = 0; else if(dc->stop) { diff --git a/src/audiofile_decode.c b/src/audiofile_decode.c index c62fb816d..855f628f0 100644 --- a/src/audiofile_decode.c +++ b/src/audiofile_decode.c @@ -112,6 +112,7 @@ int audiofile_decode(OutputBuffer * cb, DecoderControl * dc) { sendDataToOutputBuffer(cb, NULL, dc, + 1, chunk, ret*fs, (float)current / diff --git a/src/flac_decode.c b/src/flac_decode.c index 6ef56d22e..7c5b5238b 100644 --- a/src/flac_decode.c +++ b/src/flac_decode.c @@ -376,7 +376,7 @@ int flacSendChunk(FlacData * data) { doReplayGain(data->chunk,data->chunk_length,&(data->dc->audioFormat), data->replayGainScale); - switch(sendDataToOutputBuffer(data->cb, NULL, data->dc, data->chunk, + switch(sendDataToOutputBuffer(data->cb, NULL, data->dc, 1, data->chunk, data->chunk_length, data->time, data->bitRate)) { case OUTPUT_BUFFER_DC_STOP: diff --git a/src/mp3_decode.c b/src/mp3_decode.c index c1eea2f0a..1e309bd79 100644 --- a/src/mp3_decode.c +++ b/src/mp3_decode.c @@ -498,6 +498,7 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { ret = sendDataToOutputBuffer(cb, data->inStream, dc, + data->inStream->seekable, data->outputBuffer, MP3_DATA_OUTPUT_BUFFER_SIZE, data->elapsedTime, @@ -589,7 +590,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,NULL,dc,data.outputBuffer, + if(sendDataToOutputBuffer(cb,NULL,dc,0,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 71ae21d5e..e83200451 100644 --- a/src/mp4_decode.c +++ b/src/mp4_decode.c @@ -26,6 +26,7 @@ #include "log.h" #include "pcm_utils.h" #include "inputStream.h" +#include "outputBuffer.h" #include "mp4ff/mp4ff.h" @@ -279,7 +280,7 @@ int mp4_decode(OutputBuffer * cb, DecoderControl * dc) { sampleBuffer+=offset*channels*2; - sendDataToOutputBuffer(cb, NULL, dc, sampleBuffer, + sendDataToOutputBuffer(cb, NULL, dc, 1, sampleBuffer, sampleBufferLen, time, bitRate); if(dc->stop) { eof = 1; diff --git a/src/ogg_decode.c b/src/ogg_decode.c index 409e2868e..60f310fba 100644 --- a/src/ogg_decode.c +++ b/src/ogg_decode.c @@ -242,15 +242,16 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) } doReplayGain(chunk,ret,&(dc->audioFormat), replayGainScale); - sendDataToOutputBuffer(cb, inStream, dc, chunk, - chunkpos, ov_time_tell(&vf), bitRate); + sendDataToOutputBuffer(cb, inStream, dc, + inStream->seekable, chunk, chunkpos, + ov_time_tell(&vf), bitRate); if(dc->stop) break; chunkpos = 0; } } if(!dc->stop && chunkpos > 0) { - sendDataToOutputBuffer(cb, NULL, dc, chunk, chunkpos, + sendDataToOutputBuffer(cb, NULL, dc, 0, chunk, chunkpos, ov_time_tell(&vf), bitRate); } diff --git a/src/outputBuffer.c b/src/outputBuffer.c index f1ea86925..fb6bfe899 100644 --- a/src/outputBuffer.c +++ b/src/outputBuffer.c @@ -44,8 +44,8 @@ void flushOutputBuffer(OutputBuffer * cb) { } int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream, - DecoderControl * dc, char * dataIn, long dataInLen, float time, - mpd_uint16 bitRate) + DecoderControl * dc, int seekable, char * dataIn, + long dataInLen, float time, mpd_uint16 bitRate) { mpd_uint16 dataToSend; mpd_uint16 chunkLeft; @@ -76,6 +76,12 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream, if(currentChunk != cb->end) { while(cb->begin==cb->end && cb->wrap && !dc->stop) { + if(dc->seek) { + if(seekable) { + return OUTPUT_BUFFER_DC_SEEK; + } + else dc->seek = 0; + } if(!inStream || bufferInputStream(inStream) <= 0) { diff --git a/src/outputBuffer.h b/src/outputBuffer.h index 0ebc8ad1d..cea8d00d5 100644 --- a/src/outputBuffer.h +++ b/src/outputBuffer.h @@ -46,8 +46,8 @@ void flushOutputBuffer(OutputBuffer * cb); /* 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); + DecoderControl * dc, int seekable, char * data, long datalen, + float time, mpd_uint16 bitRate); #endif /* vim:set shiftwidth=4 tabstop=8 expandtab: */ -- cgit v1.2.3