From 458d2e7e023aef4e7e9e72d2b73899353e6f6eb1 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 3 Jun 2024 12:53:02 +0200 Subject: [PATCH] module-ffado: keep track of transfered data When for some reason we don't manage to transfer data from the source or to the sink (timeout, scheduling problems..), try to do it when we get a timeout to avoid xruns. --- src/modules/module-ffado-driver.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/modules/module-ffado-driver.c b/src/modules/module-ffado-driver.c index 846eda7ff..682533e20 100644 --- a/src/modules/module-ffado-driver.c +++ b/src/modules/module-ffado-driver.c @@ -183,6 +183,7 @@ struct stream { unsigned int ready:1; unsigned int running:1; + unsigned int transfered:1; }; struct impl { @@ -586,6 +587,7 @@ static void sink_process(void *d, struct spa_io_position *position) p->cleared = false; } ffado_streaming_transfer_playback_buffers(impl->dev); + s->transfered = true; if (impl->mode == MODE_SINK) { pw_log_trace_fp("done %u", impl->frame_time); @@ -605,6 +607,7 @@ static void silence_playback(struct impl *impl) clear_port_buffer(p, impl->period_size); } ffado_streaming_transfer_playback_buffers(impl->dev); + s->transfered = true; } static void source_process(void *d, struct spa_io_position *position) @@ -618,6 +621,8 @@ static void source_process(void *d, struct spa_io_position *position) if (!impl->triggered) { pw_log_trace_fp("done %u", impl->frame_time); impl->done = true; + if (!impl->sink.transfered) + silence_playback(impl); set_timeout(impl, position->clock.nsec); return; } @@ -625,6 +630,7 @@ static void source_process(void *d, struct spa_io_position *position) impl->triggered = false; ffado_streaming_transfer_capture_buffers(impl->dev); + s->transfered = true; for (i = 0; i < s->n_ports; i++) { struct port *p = s->ports[i]; @@ -963,8 +969,13 @@ again: source_running = impl->source.running && impl->sink.ready; sink_running = impl->sink.running && impl->source.ready; - if (!source_running) + impl->source.transfered = false; + impl->sink.transfered = false; + + if (!source_running) { ffado_streaming_transfer_capture_buffers(impl->dev); + impl->source.transfered = true; + } if (!sink_running) silence_playback(impl);