From 21870cfd9bd4778ea3b69ff0090292df14c49641 Mon Sep 17 00:00:00 2001 From: Andree Buschmann Date: Sun, 30 Mar 2008 10:11:31 +0000 Subject: Fixes FS#8651 (noise and/or crash while crossfading). Latest ARM-asm submit for dsp showed we had a possible alignment issue with pcm-buffer when using crossfade. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16890 a1c6a512-1295-4272-9138-f99709370657 --- apps/pcmbuf.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index 8f16c90523..99a440ad6b 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c @@ -687,13 +687,20 @@ static size_t crossfade_fade_mix(int factor, const char *buf, size_t fade_rem) int16_t *output_buf = (int16_t *)(crossfade_chunk->addr); int16_t *chunk_end = SKIPBYTES(output_buf, crossfade_chunk->size); output_buf = &output_buf[crossfade_sample]; + int32_t sample; while (fade_rem) { - int32_t sample = *input_buf++; + /* fade left and right channel at once to keep buffer alignment */ + sample = *input_buf++; sample = ((sample * factor) >> 8) + *output_buf; *output_buf++ = clip_sample_16(sample); - fade_rem -= 2; + + sample = *input_buf++; + sample = ((sample * factor) >> 8) + *output_buf; + *output_buf++ = clip_sample_16(sample); + + fade_rem -= 4; /* 2 samples, each 16 bit -> 4 bytes */ if (output_buf >= chunk_end) { @@ -715,12 +722,18 @@ static size_t crossfade_mix(const char *buf, size_t length) int16_t *output_buf = (int16_t *)crossfade_chunk->addr; int16_t *chunk_end = SKIPBYTES(output_buf, crossfade_chunk->size); output_buf = &output_buf[crossfade_sample]; + int32_t sample; while (length) { - int32_t sample = *input_buf++ + *output_buf; + /* fade left and right channel at once to keep buffer alignment */ + sample = *input_buf++ + *output_buf; + *output_buf++ = clip_sample_16(sample); + + sample = *input_buf++ + *output_buf; *output_buf++ = clip_sample_16(sample); - length -= 2; + + length -= 4; /* 2 samples, each 16 bit -> 4 bytes */ if (output_buf >= chunk_end) { -- cgit v1.2.3