From 1e9a557c06b36aa21dbd7b30129071e071f7f488 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 ba777e93e..5656f3227 100644 --- a/src/modules/module-ffado-driver.c +++ b/src/modules/module-ffado-driver.c @@ -192,6 +192,7 @@ struct stream { unsigned int ready:1; unsigned int running:1; + unsigned int transfered:1; }; struct impl { @@ -598,6 +599,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); @@ -617,6 +619,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) @@ -630,6 +633,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; } @@ -637,6 +642,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]; @@ -975,8 +981,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);