From e678beaf14fcba69bc679e3c8bcf406dff1f7242 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Mon, 9 May 2011 13:40:24 +0530 Subject: 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. --- src/modules/echo-cancel/adrian-aec.c | 12 +++++++++--- src/modules/echo-cancel/adrian-aec.h | 3 ++- 2 files changed, 11 insertions(+), 4 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 #include +#include #include @@ -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; } diff --git a/src/modules/echo-cancel/adrian-aec.h b/src/modules/echo-cancel/adrian-aec.h index 9c722b9d..efb9e274 100644 --- a/src/modules/echo-cancel/adrian-aec.h +++ b/src/modules/echo-cancel/adrian-aec.h @@ -306,7 +306,8 @@ struct AEC { // NLMS-pw REAL x[NLMS_LEN + NLMS_EXT]; // tap delayed loudspeaker signal REAL xf[NLMS_LEN + NLMS_EXT]; // pre-whitening tap delayed signal - PA_DECLARE_ALIGNED(16, REAL, w[NLMS_LEN]); // tap weights + REAL w_arr[NLMS_LEN+16]; // tap weights + REAL *w; // this will be a 16-byte aligned pointer into w_arr int j; // optimize: less memory copies double dotp_xf_xf; // double to avoid loss of precision float delta; // noise floor to stabilize NLMS -- cgit