diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2007-02-11 20:36:26 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2007-02-11 20:36:26 +0000 |
commit | b54c7c64c00dca82a5a1699140ec828343be0cbf (patch) | |
tree | 9cd41b36d785998fcc019596b289498e6cf49f61 | |
parent | c5933a164a2b25352becda8b0f103b42bc646348 (diff) | |
download | mpd-b54c7c64c00dca82a5a1699140ec828343be0cbf.tar.gz mpd-b54c7c64c00dca82a5a1699140ec828343be0cbf.tar.xz mpd-b54c7c64c00dca82a5a1699140ec828343be0cbf.zip |
#1) fix a few potential deadlock conditons in decode.c when crossfading is enabled
#2) fix a deadlock condition when attempting to seek if the decoder quit and returned to playerInit()
git-svn-id: https://svn.musicpd.org/mpd/trunk@5325 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r-- | src/decode.c | 11 | ||||
-rw-r--r-- | src/outputBuffer.c | 7 | ||||
-rw-r--r-- | src/player.c | 2 |
3 files changed, 11 insertions, 9 deletions
diff --git a/src/decode.c b/src/decode.c index 2d4b137f5..656b7313a 100644 --- a/src/decode.c +++ b/src/decode.c @@ -481,10 +481,10 @@ static void advanceOutputBufferTo(OutputBuffer * cb, PlayerControl * pc, while (cb->begin != to) { handleMetadata(cb, pc, previous, currentChunkSent, currentChunk); - cb->begin++; - if (cb->begin >= buffered_chunks) { + if (cb->begin + 1 >= buffered_chunks) { cb->begin = 0; } + else cb->begin++; } } @@ -517,7 +517,8 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * pc->play = 0; kill(getppid(), SIGUSR1); - while (decode_pid > 0 && 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(); @@ -618,10 +619,10 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb->begin = 0; } else cb->begin++; - } else if (next == cb->begin) { + } else if (cb->begin != end && cb->begin == next) { if (doCrossFade == 1 && nextChunk >= 0) { nextChunk = cb->begin + crossFadeChunks; - test = cb->end; + test = end; if (end < cb->begin) test += buffered_chunks; if (nextChunk < test) { diff --git a/src/outputBuffer.c b/src/outputBuffer.c index c27a8e671..3011505bf 100644 --- a/src/outputBuffer.c +++ b/src/outputBuffer.c @@ -58,11 +58,10 @@ void clearOutputBuffer(OutputBuffer * cb) void flushOutputBuffer(OutputBuffer * cb) { if (currentChunk == cb->end) { - int next = cb->end + 1; - if (next >= buffered_chunks) { - next = 0; + if ((cb->end + 1) >= buffered_chunks) { + cb->end = 0; } - cb->end = next; + else cb->end++; currentChunk = -1; } } diff --git a/src/player.c b/src/player.c index b976dce7f..57ed1f2ef 100644 --- a/src/player.c +++ b/src/player.c @@ -138,6 +138,8 @@ int playerInit(void) decode(); else if (pc->stop) pc->stop = 0; + else if (pc->seek) + pc->seek = 0; else if (pc->pause) pc->pause = 0; else if (pc->closeAudio) { |