pipewire/spa/plugins/audioconvert/delay.h
Barnabás Pőcze 934ab3036e treewide: use SPDX tags to specify copyright information
SPDX tags make the licensing information easy to understand and clear,
and they are machine parseable.

See https://spdx.dev for more information.
2023-02-16 10:54:48 +00:00

52 lines
1.1 KiB
C

/* Spa */
/* SPDX-FileCopyrightText: Copyright © 2022 Wim Taymans */
/* SPDX-License-Identifier: MIT */
#ifndef DELAY_H
#define DELAY_H
#ifdef __cplusplus
extern "C" {
#endif
static inline void delay_run(float *buffer, uint32_t *pos,
uint32_t n_buffer, uint32_t delay,
float *dst, const float *src, const float vol, uint32_t n_samples)
{
uint32_t i;
uint32_t p = *pos;
for (i = 0; i < n_samples; i++) {
buffer[p] = src[i];
dst[i] = buffer[(p - delay) & (n_buffer-1)] * vol;
p = (p + 1) & (n_buffer-1);
}
*pos = p;
}
static inline void delay_convolve_run(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 p = *pos;
for (i = 0; i < n_samples; i++) {
float sum = 0.0f;
buffer[p] = src[i];
for (j = 0; j < n_taps; j++)
sum += (taps[j] * buffer[((p - delay) - j) & (n_buffer-1)]);
dst[i] = sum * vol;
p = (p + 1) & (n_buffer-1);
}
*pos = p;
}
#ifdef __cplusplus
}
#endif
#endif /* DELAY_H */