pipewire-alsa: fix drain for capture

Since pw_stream doesn't call the drained callback after flush for
capture it has to be called explicitly from process.
This commit is contained in:
Jonas Holmberg 2021-03-03 12:06:10 +01:00 committed by Wim Taymans
parent 1b370f2cad
commit 29be757598

View file

@ -368,6 +368,15 @@ static void on_stream_io_changed(void *data, uint32_t id, void *area, uint32_t s
}
}
static void on_stream_drained(void *data)
{
snd_pcm_pipewire_t *pw = data;
pw->drained = true;
pw->draining = false;
pw_log_debug(NAME" %p: drained", pw);
pw_thread_loop_signal(pw->main_loop, false);
}
static void on_stream_process(void *data)
{
snd_pcm_pipewire_t *pw = data;
@ -396,22 +405,17 @@ static void on_stream_process(void *data)
pw_stream_queue_buffer(pw->stream, b);
if (io->state == SND_PCM_STATE_DRAINING && !pw->draining && hw_avail == 0) {
pw_stream_flush(pw->stream, true);
pw->draining = true;
pw->drained = false;
if (io->stream == SND_PCM_STREAM_CAPTURE) {
on_stream_drained (pw); /* since pw_stream does not call drained() for capture */
} else {
pw_stream_flush(pw->stream, true);
pw->draining = true;
pw->drained = false;
}
}
pcm_poll_unblock_check(io); /* unblock socket for polling if needed */
}
static void on_stream_drained(void *data)
{
snd_pcm_pipewire_t *pw = data;
pw->drained = true;
pw->draining = false;
pw_log_debug(NAME" %p: drained", pw);
pw_thread_loop_signal(pw->main_loop, false);
}
static const struct pw_stream_events stream_events = {
PW_VERSION_STREAM_EVENTS,
.param_changed = on_stream_param_changed,