summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/svolume_mmx.c
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2010-10-08 18:47:00 +0200
committerColin Guthrie <cguthrie@mandriva.org>2010-10-13 14:52:03 +0100
commit4d84a00b495c44a9e348534bf754ace823c9abe8 (patch)
treeaa84e0c55c9e2959e11ead3ec158943399c7f468 /src/pulsecore/svolume_mmx.c
parent489f50e2f4160f1368df38657bb91e77fd52c861 (diff)
SSE/MMX/ARM: Fix high frequency noise with unusual number of channels
In the assembly optimized versions of SSE, a noise could occur when the number of channels were 3,5,6 or 7. For MMX and ARM, this could occur when the number of channels were 3. Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Diffstat (limited to 'src/pulsecore/svolume_mmx.c')
-rw-r--r--src/pulsecore/svolume_mmx.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index 0e222cdc..3e2992a2 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -100,9 +100,10 @@ pa_volume_s16ne_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
{
pa_reg_x86 channel, temp;
- /* the max number of samples we process at a time, this is also the max amount
- * we overread the volume array, which should have enough padding. */
- channels = PA_MAX (4U, channels);
+ /* Channels must be at least 4, and always a multiple of the original number.
+ * This is also the max amount we overread the volume array, which should
+ * have enough padding. */
+ channels = channels == 3 ? 6 : PA_MAX (4U, channels);
__asm__ __volatile__ (
" xor %3, %3 \n\t"
@@ -166,9 +167,10 @@ pa_volume_s16re_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
{
pa_reg_x86 channel, temp;
- /* the max number of samples we process at a time, this is also the max amount
- * we overread the volume array, which should have enough padding. */
- channels = PA_MAX (4U, channels);
+ /* Channels must be at least 4, and always a multiple of the original number.
+ * This is also the max amount we overread the volume array, which should
+ * have enough padding. */
+ channels = channels == 3 ? 6 : PA_MAX (4U, channels);
__asm__ __volatile__ (
" xor %3, %3 \n\t"