module-loopback: keep separate info for the delay rate/channels

This commit is contained in:
Wim Taymans 2023-06-14 15:52:21 +02:00
parent 3be07c7de2
commit 0e516dec44

View file

@ -180,6 +180,7 @@ struct impl {
unsigned int do_disconnect:1; unsigned int do_disconnect:1;
unsigned int recalc_delay:1; unsigned int recalc_delay:1;
struct spa_audio_info_raw delay_info;
float target_delay; float target_delay;
struct spa_ringbuffer buffer; struct spa_ringbuffer buffer;
uint8_t *buffer_data; uint8_t *buffer_data;
@ -195,7 +196,7 @@ static void capture_destroy(void *d)
static void recalculate_delay(struct impl *impl) static void recalculate_delay(struct impl *impl)
{ {
uint32_t target = impl->capture_info.rate * impl->target_delay, cdelay, pdelay; uint32_t target = impl->delay_info.rate * impl->target_delay, cdelay, pdelay;
uint32_t delay, w; uint32_t delay, w;
struct pw_time pwt; struct pw_time pwt;
@ -347,11 +348,11 @@ static void stream_state_changed(void *data, enum pw_stream_state old,
static void recalculate_buffer(struct impl *impl) static void recalculate_buffer(struct impl *impl)
{ {
if (impl->target_delay > 0.0f) { if (impl->target_delay > 0.0f) {
uint32_t delay = impl->capture_info.rate * impl->target_delay; uint32_t delay = impl->delay_info.rate * impl->target_delay;
void *data; void *data;
impl->buffer_size = (delay + (1u<<15)) * 4; impl->buffer_size = (delay + (1u<<15)) * 4;
data = realloc(impl->buffer_data, impl->buffer_size * impl->capture_info.channels); data = realloc(impl->buffer_data, impl->buffer_size * impl->delay_info.channels);
if (data == NULL) { if (data == NULL) {
pw_log_warn("can't allocate delay buffer, delay disabled: %m"); pw_log_warn("can't allocate delay buffer, delay disabled: %m");
impl->buffer_size = 0; impl->buffer_size = 0;
@ -385,7 +386,7 @@ static void capture_param_changed(void *data, uint32_t id, const struct spa_pod
info.channels > SPA_AUDIO_MAX_CHANNELS) info.channels > SPA_AUDIO_MAX_CHANNELS)
return; return;
impl->capture_info = info; impl->delay_info = info;
recalculate_buffer(impl); recalculate_buffer(impl);
break; break;
} }