summaryrefslogtreecommitdiffstats
path: root/src/modules/echo-cancel/adrian-aec.c
diff options
context:
space:
mode:
authorArun Raghavan <arun.raghavan@collabora.co.uk>2011-05-09 13:40:24 +0530
committerColin Guthrie <colin@mageia.org>2011-05-11 10:30:38 +0100
commite678beaf14fcba69bc679e3c8bcf406dff1f7242 (patch)
treeb64c4262f9171705ff1325d5c3dfe13f9ec43d00 /src/modules/echo-cancel/adrian-aec.c
parent8eed56961481bded395005cfd1729c045c23b289 (diff)
echo-cancel: Handle alignment requirement manually
PA_ALIGNED can't always guarantee that the alignment we want (the GCC man page suggests that the linker might not be able to meet the alignment requirements we desire). Instead, we now allocate some extra memory and guaratee that the alignment we require is met.
Diffstat (limited to 'src/modules/echo-cancel/adrian-aec.c')
-rw-r--r--src/modules/echo-cancel/adrian-aec.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/modules/echo-cancel/adrian-aec.c b/src/modules/echo-cancel/adrian-aec.c
index 04b31e91..dfe8ada9 100644
--- a/src/modules/echo-cancel/adrian-aec.c
+++ b/src/modules/echo-cancel/adrian-aec.c
@@ -12,6 +12,7 @@
#include <math.h>
#include <string.h>
+#include <stdint.h>
#include <pulse/xmalloc.h>
@@ -70,7 +71,7 @@ AEC* AEC_init(int RATE, int have_vector)
a->hangover = 0;
memset(a->x, 0, sizeof(a->x));
memset(a->xf, 0, sizeof(a->xf));
- memset(a->w, 0, sizeof(a->w));
+ memset(a->w_arr, 0, sizeof(a->w_arr));
a->j = NLMS_EXT;
a->delta = 0.0f;
AEC_setambient(a, NoiseFloor);
@@ -89,10 +90,15 @@ AEC* AEC_init(int RATE, int have_vector)
a->dumpcnt = 0;
memset(a->ws, 0, sizeof(a->ws));
- if (have_vector)
+ if (have_vector) {
+ /* Get a 16-byte aligned location */
+ a->w = (REAL *) (((uintptr_t) a->w_arr) + (((uintptr_t) a->w_arr) % 16));
a->dotp = dotp_sse;
- else
+ } else {
+ /* We don't care about alignment, just use the array as-is */
+ a->w = a->w_arr;
a->dotp = dotp;
+ }
return a;
}