diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decode.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/decode.c b/src/decode.c index af0173fa5..84eeada3f 100644 --- a/src/decode.c +++ b/src/decode.c @@ -359,6 +359,21 @@ static void advanceOutputBufferTo(OutputBuffer * cb, int to) cb->begin = to; } +static void crossFade(OutputBufferChunk * a, OutputBufferChunk * b, + AudioFormat * format, + int fadePosition, int crossFadeChunks) +{ + pcm_mix(a->data, + b->data, + a->chunkSize, + b->chunkSize, + format, + ((float)fadePosition) / + crossFadeChunks); + if (b->chunkSize > a->chunkSize) + a->chunkSize = b->chunkSize; +} + static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { int pause = 0; @@ -508,21 +523,11 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * } nextChunk = outputBufferAbsolute(cb, crossFadeChunks); if (nextChunk >= 0) { - OutputBufferChunk *fadeChunk = - outputBufferGetChunk(cb, nextChunk); - pcm_mix(beginChunk->data, - fadeChunk->data, - beginChunk->chunkSize, - fadeChunk->chunkSize, - &(cb->audioFormat), - ((float)fadePosition) / - crossFadeChunks); - if (fadeChunk->chunkSize > - beginChunk->chunkSize - ) { - beginChunk->chunkSize - = fadeChunk->chunkSize; - } + crossFade(beginChunk, + outputBufferGetChunk(cb, nextChunk), + &(cb->audioFormat), + fadePosition, + crossFadeChunks); } else { /* there are not enough decoded chunks yet */ |