aboutsummaryrefslogtreecommitdiffstats
path: root/src/decode.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/decode.c59
1 files changed, 10 insertions, 49 deletions
diff --git a/src/decode.c b/src/decode.c
index f0c13f70c..8d929d0fb 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -27,6 +27,7 @@
#include "ls.h"
#include "main_notify.h"
#include "audio.h"
+#include "crossfade.h"
enum xfade_state {
XFADE_DISABLED = -1,
@@ -64,29 +65,6 @@ static void quitDecode(void)
wakeup_main_task();
}
-static unsigned calculateCrossFadeChunks(AudioFormat * af,
- float totalTime, unsigned max_chunks)
-{
- unsigned int chunks;
-
- if (pc.crossFade == 0 || pc.crossFade >= totalTime ||
- !isCurrentAudioFormat(af))
- return 0;
-
- assert(pc.crossFade > 0);
- assert(af->bits > 0);
- assert(af->channels > 0);
- assert(af->sampleRate > 0);
-
- chunks = audio_format_time_to_size(af) / CHUNK_SIZE;
- chunks = (chunks * pc.crossFade + 0.5);
-
- if (chunks > max_chunks)
- chunks = max_chunks;
-
- return chunks;
-}
-
static int waitOnDecode(int *decodeWaitedOn)
{
while (dc.command == DECODE_COMMAND_START) {
@@ -360,23 +338,6 @@ void decoderInit(void)
FATAL("Failed to spawn decoder task: %s\n", strerror(errno));
}
-static void crossFade(ob_chunk * a, ob_chunk * b,
- AudioFormat * format,
- unsigned int fadePosition, unsigned int crossFadeChunks)
-{
- assert(fadePosition <= 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 int playChunk(ob_chunk * chunk,
const AudioFormat * format, double sizeToTime)
{
@@ -498,10 +459,10 @@ static void decodeParent(void)
calculate how many chunks will be required
for it */
crossFadeChunks =
- calculateCrossFadeChunks(&(ob.audioFormat),
- dc.totalTime,
- ob.size -
- buffered_before_play);
+ cross_fade_calc(pc.crossFade, dc.totalTime,
+ &(ob.audioFormat),
+ ob.size -
+ buffered_before_play);
if (crossFadeChunks > 0) {
do_xfade = XFADE_ENABLED;
nextChunk = -1;
@@ -531,11 +492,11 @@ static void decodeParent(void)
nextChunk = ob_absolute(crossFadeChunks);
if (nextChunk >= 0) {
ob_set_lazy(1);
- crossFade(beginChunk,
- ob_get_chunk(nextChunk),
- &(ob.audioFormat),
- fadePosition,
- crossFadeChunks);
+ cross_fade_apply(beginChunk,
+ ob_get_chunk(nextChunk),
+ &(ob.audioFormat),
+ fadePosition,
+ crossFadeChunks);
} else {
/* there are not enough
decoded chunks yet */