diff options
author | Max Kellermann <max@duempel.org> | 2008-04-12 04:13:36 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2008-04-12 04:13:36 +0000 |
commit | 9760325ee6a716a526f1adde9b6f1d861f3f9101 (patch) | |
tree | eeeca0a0391e479d0be16894a6363ec127594a90 | |
parent | bc20b6430218b62da9e9146fc07940eb3191d6fd (diff) | |
download | mpd-9760325ee6a716a526f1adde9b6f1d861f3f9101.tar.gz mpd-9760325ee6a716a526f1adde9b6f1d861f3f9101.tar.xz mpd-9760325ee6a716a526f1adde9b6f1d861f3f9101.zip |
moved code to crossFade()
Calling crossFade() with the chunk objects is easier than unrolling
all the chunk properties manually, and decodeParent() can really use
more of these simplifications.
git-svn-id: https://svn.musicpd.org/mpd/trunk@7271 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-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 */ |