summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-02-27 19:14:21 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-02-27 19:14:21 +0000
commitb5b4a16b6dc2c5afb34f83b0395c5806ac20ff7c (patch)
tree22fd53c73473991e193e786ee93e7822b397cbd7
parent92e6bcbe17d56d9acb50c52edc8f55233156ae8f (diff)
downloadrockbox-b5b4a16b6dc2c5afb34f83b0395c5806ac20ff7c.zip
rockbox-b5b4a16b6dc2c5afb34f83b0395c5806ac20ff7c.tar.gz
rockbox-b5b4a16b6dc2c5afb34f83b0395c5806ac20ff7c.tar.bz2
rockbox-b5b4a16b6dc2c5afb34f83b0395c5806ac20ff7c.tar.xz
Fix a problem when dithering mono audio. Left samples weren't being duplicated into right channel in pcm buffer.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12509 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/dsp.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/apps/dsp.c b/apps/dsp.c
index 70f1ff4..199e24e 100644
--- a/apps/dsp.c
+++ b/apps/dsp.c
@@ -476,17 +476,16 @@ static void sample_output_dithered(int count, struct dsp_data *data,
const int32_t min = data->clip_min;
const int32_t max = data->clip_max;
const int32_t range = max - min;
- const int dinc = dsp->data.num_channels;
-
int ch;
- for (ch = 0; ch < dinc; ch++)
+ int16_t *d;
+
+ for (ch = 0; ch < dsp->data.num_channels; ch++)
{
struct dither_data * const dither = &dither_data[ch];
int32_t *s = src[ch];
- int16_t *d = &dst[ch];
int i;
- for (i = 0; i < count; i++, s++, d += dinc)
+ for (i = 0, d = &dst[ch]; i < count; i++, s++, d += 2)
{
int32_t output, sample;
int32_t random;
@@ -530,6 +529,20 @@ static void sample_output_dithered(int count, struct dsp_data *data,
*d = output >> scale;
}
}
+
+ if (dsp->data.num_channels == 2)
+ return;
+
+ /* Have to duplicate left samples into the right channel since
+ pcm buffer and hardware is interleaved stereo */
+ d = &dst[0];
+
+ do
+ {
+ int16_t s = *d++;
+ *d++ = s;
+ }
+ while (--count > 0);
}
/**