channelmix: use average for center and LFE

Stops the LFE from clipping.
This commit is contained in:
Wim Taymans 2022-04-20 16:09:39 +02:00
parent f6dbd75e61
commit e353999028

View file

@ -47,11 +47,11 @@ static inline void vol_c(float *d, const float *s, float vol, uint32_t n_samples
} }
} }
static inline void add_c(float *d, const float *s0, const float *s1, uint32_t n_samples) static inline void avg_c(float *d, const float *s0, const float *s1, uint32_t n_samples)
{ {
uint32_t n; uint32_t n;
for (n = 0; n < n_samples; n++) for (n = 0; n < n_samples; n++)
d[n] = s0[n] + s1[n]; d[n] = (s0[n] + s1[n]) * 0.5f;
} }
static inline void sub_c(float *d, const float *s0, const float *s1, uint32_t n_samples) static inline void sub_c(float *d, const float *s0, const float *s1, uint32_t n_samples)
@ -211,14 +211,14 @@ channelmix_f32_2_3p1_c(struct channelmix *mix, void * SPA_RESTRICT dst[],
if (mix->widen == 0.0f) { if (mix->widen == 0.0f) {
vol_c(d[0], s[0], v0, n_samples); vol_c(d[0], s[0], v0, n_samples);
vol_c(d[1], s[1], v1, n_samples); vol_c(d[1], s[1], v1, n_samples);
add_c(d[2], s[0], s[1], n_samples); avg_c(d[2], s[0], s[1], n_samples);
} else { } else {
for (n = 0; n < n_samples; n++) { for (n = 0; n < n_samples; n++) {
float c = s[0][n] + s[1][n]; float c = s[0][n] + s[1][n];
float w = c * mix->widen; float w = c * mix->widen;
d[0][n] = (s[0][n] - w) * v0; d[0][n] = (s[0][n] - w) * v0;
d[1][n] = (s[1][n] - w) * v1; d[1][n] = (s[1][n] - w) * v1;
d[2][n] = c; d[2][n] = c * 0.5f;
} }
} }
lr4_process(&mix->lr4[3], d[3], d[2], v3, n_samples); lr4_process(&mix->lr4[3], d[3], d[2], v3, n_samples);