module-ffado: separate rt booleans from non-rt

This commit is contained in:
Wim Taymans 2024-08-01 17:16:37 +02:00
parent 3da8c324be
commit 6a64442b73

View file

@ -183,7 +183,10 @@ struct stream {
unsigned int ready:1; unsigned int ready:1;
unsigned int running:1; unsigned int running:1;
unsigned int transfered:1;
struct {
unsigned int transfered:1;
} rt;
}; };
struct impl { struct impl {
@ -233,8 +236,6 @@ struct impl {
uint32_t output_latency; uint32_t output_latency;
uint32_t quantum_limit; uint32_t quantum_limit;
uint32_t pw_xrun;
uint32_t ffado_xrun;
uint32_t frame_time; uint32_t frame_time;
unsigned int do_disconnect:1; unsigned int do_disconnect:1;
@ -243,9 +244,13 @@ struct impl {
pthread_t thread; pthread_t thread;
unsigned int done:1; struct {
unsigned int triggered:1; unsigned int done:1;
unsigned int new_xrun:1; unsigned int triggered:1;
unsigned int new_xrun:1;
uint32_t pw_xrun;
uint32_t ffado_xrun;
} rt;
}; };
static int stop_ffado_device(struct impl *impl); static int stop_ffado_device(struct impl *impl);
@ -561,9 +566,9 @@ static void sink_process(void *d, struct spa_io_position *position)
struct impl *impl = s->impl; struct impl *impl = s->impl;
uint32_t i, n_samples = position->clock.duration; uint32_t i, n_samples = position->clock.duration;
pw_log_trace_fp("process %d", impl->triggered); pw_log_trace_fp("process %d", impl->rt.triggered);
if (impl->mode == MODE_SINK && impl->triggered) { if (impl->mode == MODE_SINK && impl->rt.triggered) {
impl->triggered = false; impl->rt.triggered = false;
return; return;
} }
@ -587,11 +592,11 @@ static void sink_process(void *d, struct spa_io_position *position)
p->cleared = false; p->cleared = false;
} }
ffado_streaming_transfer_playback_buffers(impl->dev); ffado_streaming_transfer_playback_buffers(impl->dev);
s->transfered = true; s->rt.transfered = true;
if (impl->mode == MODE_SINK) { if (impl->mode == MODE_SINK) {
pw_log_trace_fp("done %u", impl->frame_time); pw_log_trace_fp("done %u", impl->frame_time);
impl->done = true; impl->rt.done = true;
set_timeout(impl, position->clock.nsec); set_timeout(impl, position->clock.nsec);
} }
} }
@ -607,7 +612,7 @@ static void silence_playback(struct impl *impl)
clear_port_buffer(p, impl->device_options.period_size); clear_port_buffer(p, impl->device_options.period_size);
} }
ffado_streaming_transfer_playback_buffers(impl->dev); ffado_streaming_transfer_playback_buffers(impl->dev);
s->transfered = true; s->rt.transfered = true;
} }
static void source_process(void *d, struct spa_io_position *position) static void source_process(void *d, struct spa_io_position *position)
@ -616,21 +621,21 @@ static void source_process(void *d, struct spa_io_position *position)
struct impl *impl = s->impl; struct impl *impl = s->impl;
uint32_t i, n_samples = position->clock.duration; uint32_t i, n_samples = position->clock.duration;
pw_log_trace_fp("process %d", impl->triggered); pw_log_trace_fp("process %d", impl->rt.triggered);
if (!impl->triggered) { if (!impl->rt.triggered) {
pw_log_trace_fp("done %u", impl->frame_time); pw_log_trace_fp("done %u", impl->frame_time);
impl->done = true; impl->rt.done = true;
if (!impl->sink.transfered) if (!impl->sink.rt.transfered)
silence_playback(impl); silence_playback(impl);
set_timeout(impl, position->clock.nsec); set_timeout(impl, position->clock.nsec);
return; return;
} }
impl->triggered = false; impl->rt.triggered = false;
ffado_streaming_transfer_capture_buffers(impl->dev); ffado_streaming_transfer_capture_buffers(impl->dev);
s->transfered = true; s->rt.transfered = true;
for (i = 0; i < s->n_ports; i++) { for (i = 0; i < s->n_ports; i++) {
struct port *p = s->ports[i]; struct port *p = s->ports[i];
@ -960,11 +965,11 @@ static void on_ffado_timeout(void *data, uint64_t expirations)
uint64_t nsec; uint64_t nsec;
ffado_wait_response response; ffado_wait_response response;
pw_log_trace_fp("wakeup %d", impl->done); pw_log_trace_fp("wakeup %d", impl->rt.done);
if (!impl->done) { if (!impl->rt.done) {
impl->pw_xrun++; impl->rt.pw_xrun++;
impl->new_xrun = true; impl->rt.new_xrun = true;
ffado_streaming_reset(impl->dev); ffado_streaming_reset(impl->dev);
} }
again: again:
@ -977,8 +982,8 @@ again:
break; break;
case ffado_wait_xrun: case ffado_wait_xrun:
pw_log_debug("FFADO xrun"); pw_log_debug("FFADO xrun");
impl->ffado_xrun++; impl->rt.ffado_xrun++;
impl->new_xrun = true; impl->rt.new_xrun = true;
goto again; goto again;
case ffado_wait_shutdown: case ffado_wait_shutdown:
pw_log_info("FFADO shutdown"); pw_log_info("FFADO shutdown");
@ -991,12 +996,12 @@ again:
source_running = impl->source.running && impl->sink.ready; source_running = impl->source.running && impl->sink.ready;
sink_running = impl->sink.running && impl->source.ready; sink_running = impl->sink.running && impl->source.ready;
impl->source.transfered = false; impl->source.rt.transfered = false;
impl->sink.transfered = false; impl->sink.rt.transfered = false;
if (!source_running) { if (!source_running) {
ffado_streaming_transfer_capture_buffers(impl->dev); ffado_streaming_transfer_capture_buffers(impl->dev);
impl->source.transfered = true; impl->source.rt.transfered = true;
} }
if (!sink_running) if (!sink_running)
silence_playback(impl); silence_playback(impl);
@ -1005,10 +1010,10 @@ again:
impl->device_options.period_size, source_running, impl->device_options.period_size, source_running,
sink_running, impl->position, impl->frame_time, nsec); sink_running, impl->position, impl->frame_time, nsec);
if (impl->new_xrun) { if (impl->rt.new_xrun) {
pw_log_warn("Xrun FFADO:%u PipeWire:%u source:%d sink:%d", pw_log_warn("Xrun FFADO:%u PipeWire:%u source:%d sink:%d",
impl->ffado_xrun, impl->pw_xrun, source_running, sink_running); impl->rt.ffado_xrun, impl->rt.pw_xrun, source_running, sink_running);
impl->new_xrun = false; impl->rt.new_xrun = false;
} }
if (impl->position) { if (impl->position) {
@ -1041,17 +1046,17 @@ again:
c->target_duration = c->duration; c->target_duration = c->duration;
} }
if (impl->mode & MODE_SOURCE && source_running) { if (impl->mode & MODE_SOURCE && source_running) {
impl->done = false; impl->rt.done = false;
impl->triggered = true; impl->rt.triggered = true;
set_timeout(impl, nsec + SPA_NSEC_PER_SEC); set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
pw_filter_trigger_process(impl->source.filter); pw_filter_trigger_process(impl->source.filter);
} else if (impl->mode == MODE_SINK && sink_running) { } else if (impl->mode == MODE_SINK && sink_running) {
impl->done = false; impl->rt.done = false;
impl->triggered = true; impl->rt.triggered = true;
set_timeout(impl, nsec + SPA_NSEC_PER_SEC); set_timeout(impl, nsec + SPA_NSEC_PER_SEC);
pw_filter_trigger_process(impl->sink.filter); pw_filter_trigger_process(impl->sink.filter);
} else { } else {
impl->done = true; impl->rt.done = true;
set_timeout(impl, nsec); set_timeout(impl, nsec);
} }
} }
@ -1242,7 +1247,7 @@ static int start_ffado_device(struct impl *impl)
pw_log_info("FFADO started streaming"); pw_log_info("FFADO started streaming");
impl->started = true; impl->started = true;
impl->done = true; impl->rt.done = true;
set_timeout(impl, get_time_ns(impl)); set_timeout(impl, get_time_ns(impl));
return 0; return 0;
} }