mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-07 13:30:03 -05:00
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:
parent
8eed569614
commit
e678beaf14
2 changed files with 11 additions and 4 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue