forked from len0rd/rockbox
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
This commit is contained in:
parent
63acf3eb16
commit
21870cfd9b
1 changed files with 17 additions and 4 deletions
|
|
@ -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);
|
||||
length -= 2;
|
||||
|
||||
sample = *input_buf++ + *output_buf;
|
||||
*output_buf++ = clip_sample_16(sample);
|
||||
|
||||
length -= 4; /* 2 samples, each 16 bit -> 4 bytes */
|
||||
|
||||
if (output_buf >= chunk_end)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue