From 688041b0833a968eeae729fc5d5007e23d39bccd Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 17 Sep 2020 11:48:21 +0200 Subject: [PATCH] pulse: fix drain The drain operation does not complete with a sync from the server but with an event from the stream. Set a flag in the operation that it completes with a sync. Keep all operations without a sync around in the list. --- pipewire-pulseaudio/src/context.c | 9 ++++++++- pipewire-pulseaudio/src/internal.h | 1 + pipewire-pulseaudio/src/operation.c | 1 + pipewire-pulseaudio/src/stream.c | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index d7ab5885b..1f625d568 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1473,13 +1473,20 @@ static void core_done(void *data, uint32_t id, int seq) } } spa_list_for_each_safe(o, t, &ops, link) { + if (!o->sync) + continue; pa_operation_ref(o); - pw_log_debug("operation %p complete", o); + pw_log_debug("sync operation %p complete", o); if (o->callback) o->callback(o, o->userdata); pa_operation_unref(o); } spa_list_consume(o, &ops, link) { + if (!o->sync) { + spa_list_remove(&o->link); + spa_list_append(&c->operations, &o->link); + continue; + } pw_log_warn("operation %p canceled", o); pa_operation_cancel(o); } diff --git a/pipewire-pulseaudio/src/internal.h b/pipewire-pulseaudio/src/internal.h index 66e0e4cf3..4d1d4d053 100644 --- a/pipewire-pulseaudio/src/internal.h +++ b/pipewire-pulseaudio/src/internal.h @@ -491,6 +491,7 @@ struct pa_operation int refcount; pa_context *context; pa_stream *stream; + unsigned int sync:1; pa_operation_state_t state; diff --git a/pipewire-pulseaudio/src/operation.c b/pipewire-pulseaudio/src/operation.c index dd14a6c4f..1cadaacbc 100644 --- a/pipewire-pulseaudio/src/operation.c +++ b/pipewire-pulseaudio/src/operation.c @@ -52,6 +52,7 @@ int pa_operation_sync(pa_operation *o) { pa_context *c = o->context; c->pending_seq = pw_core_sync(c->core, PW_ID_CORE, 0); + o->sync = true; pw_log_debug("operation %p: sync seq:%d", o, c->pending_seq); return 0; } diff --git a/pipewire-pulseaudio/src/stream.c b/pipewire-pulseaudio/src/stream.c index b6d8baaf7..3c2ea0204 100644 --- a/pipewire-pulseaudio/src/stream.c +++ b/pipewire-pulseaudio/src/stream.c @@ -461,6 +461,8 @@ static void stream_drained(void *data) { pa_stream *s = data; + pw_log_debug("drained"); + if (s->drain) { pa_operation *o = s->drain; pa_operation_ref(o);