mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
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:
parent
fed908694a
commit
458d2e7e02
1 changed files with 12 additions and 1 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue