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.
This commit is contained in:
Wim Taymans 2024-06-03 12:53:02 +02:00
parent fed908694a
commit 458d2e7e02

View file

@ -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);