module-ffado: don't read/write twice

The process callbacks are called twice, once on graph start and once
on graph complete, make sure we only read in the right phase.
This commit is contained in:
Wim Taymans 2023-06-19 16:43:56 +02:00
parent 7805a454df
commit 882df500b6

View file

@ -214,6 +214,7 @@ struct impl {
unsigned int do_disconnect:1;
unsigned int done:1;
unsigned int triggered:1;
unsigned int new_xrun:1;
unsigned int fix_midi:1;
};
@ -334,6 +335,11 @@ static void sink_process(void *d, struct spa_io_position *position)
struct impl *impl = s->impl;
uint32_t i, n_samples = position->clock.duration;
if (impl->mode & MODE_SINK && impl->triggered) {
impl->triggered = false;
return;
}
for (i = 0; i < s->n_ports; i++) {
struct port *p = s->ports[i];
float *src;
@ -363,6 +369,13 @@ static void source_process(void *d, struct spa_io_position *position)
struct impl *impl = s->impl;
uint32_t i, n_samples = position->clock.duration;
if (impl->mode == MODE_SOURCE && !impl->triggered) {
pw_log_trace_fp("done %u", impl->frame_time);
impl->done = true;
return;
}
impl->triggered = false;
ffado_streaming_transfer_capture_buffers(impl->dev);
for (i = 0; i < s->n_ports; i++) {
@ -381,10 +394,6 @@ static void source_process(void *d, struct spa_io_position *position)
else
do_volume(dst, p->buffer, &s->volume, i, n_samples);
}
pw_log_trace_fp("done %u", impl->frame_time);
if (impl->mode == MODE_SOURCE) {
impl->done = true;
}
}
static void stream_io_changed(void *data, void *port_data, uint32_t id, void *area, uint32_t size)
@ -725,9 +734,11 @@ static void *ffado_process_thread(void *arg)
}
if (impl->mode & MODE_SINK && sink_running) {
impl->done = false;
impl->triggered = true;
pw_filter_trigger_process(impl->sink.filter);
} else if (impl->mode == MODE_SOURCE && source_running) {
impl->done = false;
impl->triggered = true;
pw_filter_trigger_process(impl->source.filter);
}
}