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.
This commit is contained in:
Arun Raghavan 2011-05-09 13:40:24 +05:30 committed by Colin Guthrie
parent 8eed569614
commit e678beaf14
2 changed files with 11 additions and 4 deletions

View file

@ -12,6 +12,7 @@
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include <stdint.h>
#include <pulse/xmalloc.h> #include <pulse/xmalloc.h>
@ -70,7 +71,7 @@ AEC* AEC_init(int RATE, int have_vector)
a->hangover = 0; a->hangover = 0;
memset(a->x, 0, sizeof(a->x)); memset(a->x, 0, sizeof(a->x));
memset(a->xf, 0, sizeof(a->xf)); 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->j = NLMS_EXT;
a->delta = 0.0f; a->delta = 0.0f;
AEC_setambient(a, NoiseFloor); AEC_setambient(a, NoiseFloor);
@ -89,10 +90,15 @@ AEC* AEC_init(int RATE, int have_vector)
a->dumpcnt = 0; a->dumpcnt = 0;
memset(a->ws, 0, sizeof(a->ws)); 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; 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; a->dotp = dotp;
}
return a; return a;
} }

View file

@ -306,7 +306,8 @@ struct AEC {
// NLMS-pw // NLMS-pw
REAL x[NLMS_LEN + NLMS_EXT]; // tap delayed loudspeaker signal REAL x[NLMS_LEN + NLMS_EXT]; // tap delayed loudspeaker signal
REAL xf[NLMS_LEN + NLMS_EXT]; // pre-whitening tap delayed 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 int j; // optimize: less memory copies
double dotp_xf_xf; // double to avoid loss of precision double dotp_xf_xf; // double to avoid loss of precision
float delta; // noise floor to stabilize NLMS float delta; // noise floor to stabilize NLMS