From fb49759d1fdf54ddab7c725f723318c57e8fd49a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 17 Oct 2025 14:51:14 +0200 Subject: [PATCH] module-echo-cancel: drop samples when source not ready When we can't dequeue a buffer from the source stream, drop the samples instead of leaving them queued in the ringbuffer. --- src/modules/module-echo-cancel.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/modules/module-echo-cancel.c b/src/modules/module-echo-cancel.c index 113a89cea..d241369c7 100644 --- a/src/modules/module-echo-cancel.c +++ b/src/modules/module-echo-cancel.c @@ -431,23 +431,22 @@ static void process(struct impl *impl) avail = spa_ringbuffer_get_read_index(&impl->out_ring, &oindex); while (avail >= size) { - if ((cout = pw_stream_dequeue_buffer(impl->source)) == NULL) { + if ((cout = pw_stream_dequeue_buffer(impl->source)) != NULL) { + for (i = 0; i < impl->out_info.channels; i++) { + dd = &cout->buffer->datas[i]; + spa_ringbuffer_read_data(&impl->out_ring, impl->out_buffer[i], + impl->out_ringsize, oindex % impl->out_ringsize, + (void *)dd->data, size); + dd->chunk->offset = 0; + dd->chunk->size = size; + dd->chunk->stride = sizeof(float); + } + pw_stream_queue_buffer(impl->source, cout); + } else { + /* drop data as to not cause delay */ pw_log_debug("out of source buffers: %m"); - break; } - for (i = 0; i < impl->out_info.channels; i++) { - dd = &cout->buffer->datas[i]; - spa_ringbuffer_read_data(&impl->out_ring, impl->out_buffer[i], - impl->out_ringsize, oindex % impl->out_ringsize, - (void *)dd->data, size); - dd->chunk->offset = 0; - dd->chunk->size = size; - dd->chunk->stride = sizeof(float); - } - - pw_stream_queue_buffer(impl->source, cout); - oindex += size; spa_ringbuffer_read_update(&impl->out_ring, oindex); avail -= size;