moved check to outputBufferAbsolute()
decoderParent() uses a lot of OutputBuffer internals to see whether cross-fading should be started. Move these checks to outputBuffer.c, which also simplifies decoderParent(). git-svn-id: https://svn.musicpd.org/mpd/trunk@7262 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:

committed by
Eric Wong

parent
a546428263
commit
e626028b41
21
src/decode.c
21
src/decode.c
@@ -503,7 +503,6 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
|
|||||||
(fadePosition = next - cb->begin +
|
(fadePosition = next - cb->begin +
|
||||||
buffered_chunks) <= crossFadeChunks))) {
|
buffered_chunks) <= crossFadeChunks))) {
|
||||||
/* perform cross fade */
|
/* perform cross fade */
|
||||||
unsigned int test = end;
|
|
||||||
if (nextChunk < 0) {
|
if (nextChunk < 0) {
|
||||||
/* beginning of the cross fade
|
/* beginning of the cross fade
|
||||||
- adjust crossFadeChunks
|
- adjust crossFadeChunks
|
||||||
@@ -512,13 +511,8 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
|
|||||||
chunks in the old song */
|
chunks in the old song */
|
||||||
crossFadeChunks = fadePosition;
|
crossFadeChunks = fadePosition;
|
||||||
}
|
}
|
||||||
if (end < cb->begin)
|
nextChunk = outputBufferAbsolute(cb, crossFadeChunks);
|
||||||
test += buffered_chunks;
|
if (nextChunk >= 0) {
|
||||||
nextChunk = cb->begin + crossFadeChunks;
|
|
||||||
if ((unsigned)nextChunk < test) {
|
|
||||||
if ((unsigned)nextChunk >= buffered_chunks) {
|
|
||||||
nextChunk -= buffered_chunks;
|
|
||||||
}
|
|
||||||
pcm_mix(cb->chunks +
|
pcm_mix(cb->chunks +
|
||||||
cb->begin * CHUNK_SIZE,
|
cb->begin * CHUNK_SIZE,
|
||||||
cb->chunks +
|
cb->chunks +
|
||||||
@@ -575,17 +569,10 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
|
|||||||
/* the cross-fade is finished; skip
|
/* the cross-fade is finished; skip
|
||||||
the section which was cross-faded
|
the section which was cross-faded
|
||||||
(and thus already played) */
|
(and thus already played) */
|
||||||
unsigned int test = end;
|
nextChunk = outputBufferAbsolute(cb, crossFadeChunks);
|
||||||
nextChunk = cb->begin + crossFadeChunks;
|
if (nextChunk >= 0)
|
||||||
if (end < cb->begin)
|
|
||||||
test += buffered_chunks;
|
|
||||||
if ((unsigned)nextChunk < test) {
|
|
||||||
if ((unsigned)nextChunk >= buffered_chunks) {
|
|
||||||
nextChunk -= buffered_chunks;
|
|
||||||
}
|
|
||||||
advanceOutputBufferTo(cb, nextChunk);
|
advanceOutputBufferTo(cb, nextChunk);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* wait for the decoder to work on the new song */
|
/* wait for the decoder to work on the new song */
|
||||||
while (pc->queueState == PLAYER_QUEUE_DECODE ||
|
while (pc->queueState == PLAYER_QUEUE_DECODE ||
|
||||||
|
@@ -65,6 +65,23 @@ unsigned availableOutputBuffer(const OutputBuffer * cb)
|
|||||||
return cb->end + buffered_chunks - cb->begin;
|
return cb->end + buffered_chunks - cb->begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int outputBufferAbsolute(const OutputBuffer * cb, unsigned relative)
|
||||||
|
{
|
||||||
|
unsigned i, max;
|
||||||
|
|
||||||
|
max = cb->end;
|
||||||
|
if (max < cb->begin)
|
||||||
|
max += buffered_chunks;
|
||||||
|
i = (unsigned)cb->begin + relative;
|
||||||
|
if (i >= max)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (i >= buffered_chunks)
|
||||||
|
i -= buffered_chunks;
|
||||||
|
|
||||||
|
return (int)i;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the tail chunk has room for additional data. If there is no
|
* Return the tail chunk has room for additional data. If there is no
|
||||||
* room in the queue, this function blocks until the player thread has
|
* room in the queue, this function blocks until the player thread has
|
||||||
|
@@ -58,6 +58,12 @@ void flushOutputBuffer(OutputBuffer * cb);
|
|||||||
/** determine the number of decoded chunks */
|
/** determine the number of decoded chunks */
|
||||||
unsigned availableOutputBuffer(const OutputBuffer * cb);
|
unsigned availableOutputBuffer(const OutputBuffer * cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the absolute index of the nth used chunk after the first one.
|
||||||
|
* Returns -1 if there is no such chunk.
|
||||||
|
*/
|
||||||
|
int outputBufferAbsolute(const OutputBuffer * cb, unsigned relative);
|
||||||
|
|
||||||
/* we send inStream for buffering the inputStream while waiting to
|
/* we send inStream for buffering the inputStream while waiting to
|
||||||
send the next chunk */
|
send the next chunk */
|
||||||
int sendDataToOutputBuffer(OutputBuffer * cb,
|
int sendDataToOutputBuffer(OutputBuffer * cb,
|
||||||
|
Reference in New Issue
Block a user