#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
This commit is contained in:
Warren Dukes 2007-02-11 20:36:26 +00:00
parent c5933a164a
commit b54c7c64c0
3 changed files with 11 additions and 9 deletions

View File

@ -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) {

View File

@ -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;
}
}

View File

@ -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) {