mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
audioconvert: SSE optimize delay and convolver
This commit is contained in:
parent
33fb2f04c7
commit
2c0ce6afc2
5 changed files with 115 additions and 69 deletions
|
|
@ -102,6 +102,36 @@ static void lr4_process_c(struct lr4 *lr4, float *dst, const float *src, const f
|
|||
#undef F
|
||||
}
|
||||
|
||||
static inline void delay_convolve_run_c(float *buffer, uint32_t *pos,
|
||||
uint32_t n_buffer, uint32_t delay,
|
||||
const float *taps, uint32_t n_taps,
|
||||
float *dst, const float *src, const float vol, uint32_t n_samples)
|
||||
{
|
||||
uint32_t i, j;
|
||||
uint32_t w = *pos;
|
||||
uint32_t o = n_buffer - delay - n_taps-1;
|
||||
|
||||
if (n_taps == 1) {
|
||||
for (i = 0; i < n_samples; i++) {
|
||||
buffer[w] = buffer[w + n_buffer] = src[i];
|
||||
dst[i] = buffer[w + o] * vol;
|
||||
w = w + 1 >= n_buffer ? 0 : w + 1;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < n_samples; i++) {
|
||||
float sum = 0.0f;
|
||||
|
||||
buffer[w] = buffer[w + n_buffer] = src[i];
|
||||
for (j = 0; j < n_taps; j++)
|
||||
sum += taps[j] * buffer[w+o+j];
|
||||
dst[i] = sum * vol;
|
||||
|
||||
w = w + 1 >= n_buffer ? 0 : w + 1;
|
||||
}
|
||||
}
|
||||
*pos = w;
|
||||
}
|
||||
|
||||
#define _M(ch) (1UL << SPA_AUDIO_CHANNEL_ ## ch)
|
||||
|
||||
void
|
||||
|
|
@ -239,9 +269,9 @@ channelmix_f32_2_4_c(struct channelmix *mix, void * SPA_RESTRICT dst[],
|
|||
} else {
|
||||
sub_c(d[2], s[0], s[1], n_samples);
|
||||
|
||||
delay_convolve_run(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[3], d[2], -v3, n_samples);
|
||||
delay_convolve_run(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[2], d[2], v2, n_samples);
|
||||
}
|
||||
}
|
||||
|
|
@ -307,9 +337,9 @@ channelmix_f32_2_5p1_c(struct channelmix *mix, void * SPA_RESTRICT dst[],
|
|||
} else {
|
||||
sub_c(d[4], s[0], s[1], n_samples);
|
||||
|
||||
delay_convolve_run(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[5], d[4], -v5, n_samples);
|
||||
delay_convolve_run(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[4], d[4], v4, n_samples);
|
||||
}
|
||||
}
|
||||
|
|
@ -343,9 +373,9 @@ channelmix_f32_2_7p1_c(struct channelmix *mix, void * SPA_RESTRICT dst[],
|
|||
} else {
|
||||
sub_c(d[6], s[0], s[1], n_samples);
|
||||
|
||||
delay_convolve_run(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[1], &mix->pos[1], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[7], d[6], -v7, n_samples);
|
||||
delay_convolve_run(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
delay_convolve_run_c(mix->buffer[0], &mix->pos[0], BUFFER_SIZE, mix->delay,
|
||||
mix->taps, mix->n_taps, d[6], d[6], v6, n_samples);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue