On 2010-10-13 09:53, Colin Guthrie wrote:
'Twas brillig, and David Henningsson at 13/10/10 07:27 did gyre and gimble:
We have got three confirmations that the patch is working in the bug
below, so I believe it can be safely applied to both master and
stable-queue.
Great!
Would you mind respinning the patch with a couple more inline comments?
I'm a little concerned about the lines such as "channels = channels == 3
? 6 : PA_MAX(....)"
It will be a bit disconcerting to read this in code without really
reading the relevant commit message, so I think a small hint towards why
this is done would be good here.
Thanks for reviewing the patch, I agree that a little clearer comment
wouldn't hurt, so here's a revised version.
--
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic
>From 0bde1e26fd9b2b6c1cf3d914ad11347b0d852539 Mon Sep 17 00:00:00 2001
From: David Henningsson <[email protected]>
Date: Fri, 8 Oct 2010 18:47:00 +0200
Subject: [PATCH] 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 <[email protected]>
---
src/pulsecore/svolume_arm.c | 5 ++++-
src/pulsecore/svolume_mmx.c | 14 ++++++++------
src/pulsecore/svolume_sse.c | 19 +++++++++++++------
3 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/src/pulsecore/svolume_arm.c b/src/pulsecore/svolume_arm.c
index 5bd1448..fdd8f09 100644
--- a/src/pulsecore/svolume_arm.c
+++ b/src/pulsecore/svolume_arm.c
@@ -47,7 +47,10 @@ pa_volume_s16ne_arm (int16_t *samples, int32_t *volumes, unsigned channels, unsi
{
int32_t *ve;
- 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);
ve = volumes + channels;
__asm__ __volatile__ (
diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index e50ebee..a71a39b 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -98,9 +98,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"
@@ -164,9 +165,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"
diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c
index 1cc4e0a..5983164 100644
--- a/src/pulsecore/svolume_sse.c
+++ b/src/pulsecore/svolume_sse.c
@@ -74,14 +74,19 @@
" por %%xmm4, "#s1" \n\t" /* .. | l h | */ \
" por %%xmm5, "#s2" \n\t"
+
+static int channel_overread_table[8] = {8,8,8,12,8,10,12,14};
+
static void
pa_volume_s16ne_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, unsigned length)
{
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 (8U, channels);
+ /* Channels must be at least 8 and always a multiple of the original number.
+ * This is also the max amount we overread the volume array, which should
+ * have enough padding. */
+ if (channels < 8)
+ channels = channel_overread_table[channels];
__asm__ __volatile__ (
" xor %3, %3 \n\t"
@@ -159,9 +164,11 @@ pa_volume_s16re_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, uns
{
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 (8U, channels);
+ /* Channels must be at least 8 and always a multiple of the original number.
+ * This is also the max amount we overread the volume array, which should
+ * have enough padding. */
+ if (channels < 8)
+ channels = channel_overread_table[channels];
__asm__ __volatile__ (
" xor %3, %3 \n\t"
--
1.7.1
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss