equalizer: fix filter history usage. Fixes #597397

The process functions where overwriting the history for each channel. Also pull
some static things out of the inner loop.
This commit is contained in:
Stefan Kost 2009-10-05 22:43:11 +03:00
parent 0040d01265
commit 7b6e594b69

View file

@ -577,17 +577,16 @@ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \
guint size, guint channels) \ guint size, guint channels) \
{ \ { \
guint frames = size / channels / sizeof (TYPE); \ guint frames = size / channels / sizeof (TYPE); \
guint i, c, f; \ guint i, c, f, nf = equ->freq_band_count; \
BIG_TYPE cur; \ BIG_TYPE cur; \
GstIirEqualizerBand **filters = equ->bands; \
\ \
for (i = 0; i < frames; i++) { \ for (i = 0; i < frames; i++) { \
SecondOrderHistory ## TYPE *history = equ->history; \
for (c = 0; c < channels; c++) { \ for (c = 0; c < channels; c++) { \
SecondOrderHistory ## TYPE *history = equ->history; \
cur = *((TYPE *) data); \ cur = *((TYPE *) data); \
for (f = 0; f < equ->freq_band_count; f++) { \ for (f = 0; f < nf; f++) { \
GstIirEqualizerBand *filter = equ->bands[f]; \ cur = one_step_ ## TYPE (filters[f], history, cur); \
\
cur = one_step_ ## TYPE (filter, history, cur); \
history++; \ history++; \
} \ } \
cur = CLAMP (cur, MIN_VAL, MAX_VAL); \ cur = CLAMP (cur, MIN_VAL, MAX_VAL); \
@ -597,18 +596,18 @@ guint size, guint channels) \
} \ } \
} }
#define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \ #define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \
typedef struct { \ typedef struct { \
TYPE x1, x2; /* history of input values for a filter */ \ TYPE x1, x2; /* history of input values for a filter */ \
TYPE y1, y2; /* history of output values for a filter */ \ TYPE y1, y2; /* history of output values for a filter */ \
} SecondOrderHistory ## TYPE; \ } SecondOrderHistory ## TYPE; \
\ \
static inline TYPE \ static inline TYPE \
one_step_ ## TYPE (GstIirEqualizerBand *filter, \ one_step_ ## TYPE (GstIirEqualizerBand *filter, \
SecondOrderHistory ## TYPE *history, TYPE input) \ SecondOrderHistory ## TYPE *history, TYPE input) \
{ \ { \
/* calculate output */ \ /* calculate output */ \
TYPE output = filter->a0 * input + filter->a1 * history->x1 + \ TYPE output = filter->a0 * input + filter->a1 * history->x1 + \
filter->a2 * history->x2 + filter->b1 * history->y1 + \ filter->a2 * history->x2 + filter->b1 * history->y1 + \
filter->b2 * history->y2; \ filter->b2 * history->y2; \
/* update history */ \ /* update history */ \
@ -628,17 +627,16 @@ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \
guint size, guint channels) \ guint size, guint channels) \
{ \ { \
guint frames = size / channels / sizeof (TYPE); \ guint frames = size / channels / sizeof (TYPE); \
guint i, c, f; \ guint i, c, f, nf = equ->freq_band_count; \
TYPE cur; \ TYPE cur; \
GstIirEqualizerBand **filters = equ->bands; \
\ \
for (i = 0; i < frames; i++) { \ for (i = 0; i < frames; i++) { \
SecondOrderHistory ## TYPE *history = equ->history; \
for (c = 0; c < channels; c++) { \ for (c = 0; c < channels; c++) { \
SecondOrderHistory ## TYPE *history = equ->history; \
cur = *((TYPE *) data); \ cur = *((TYPE *) data); \
for (f = 0; f < equ->freq_band_count; f++) { \ for (f = 0; f < nf; f++) { \
GstIirEqualizerBand *filter = equ->bands[f]; \ cur = one_step_ ## TYPE (filters[f], history, cur); \
\
cur = one_step_ ## TYPE (filter, history, cur); \
history++; \ history++; \
} \ } \
*((TYPE *) data) = (TYPE) cur; \ *((TYPE *) data) = (TYPE) cur; \