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