From ac4d4582a42e5996f0523015386d83f5bddea1f6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 30 Sep 2020 10:16:20 +0200 Subject: [PATCH] pulse: set mask after completing the operation This ensures we first finish all pending operations and then get notifications of the new events. Brings pactl subscribe in line with what it does on real PulseAudio. --- pipewire-pulseaudio/src/context.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index 78184278b..227cf376d 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1543,7 +1543,7 @@ static void on_success(pa_operation *o, void *userdata) { struct success_data *d = userdata; pa_context *c = o->context; - pw_log_debug("context %p: error %d", c, d->error); + pw_log_debug("context %p: operation:%p error %d", c, o, d->error); if (d->error != 0) pa_context_set_error(c, d->error); if (d->cb) @@ -1551,23 +1551,37 @@ static void on_success(pa_operation *o, void *userdata) pa_operation_done(o); } +struct subscribe_data { + struct success_data success; + pa_subscription_mask_t mask; +}; + +static void on_subscribe(pa_operation *o, void *userdata) +{ + struct subscribe_data *d = userdata; + pa_context *c = o->context; + c->subscribe_mask = d->mask; + on_success(o, &d->success); +} + SPA_EXPORT pa_operation* pa_context_subscribe(pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata) { pa_operation *o; - struct success_data *d; + struct subscribe_data *d; pa_assert(c); pa_assert(c->refcount >= 1); PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); - c->subscribe_mask = m; + pw_log_debug("context %p: subscribe %08x", c, m); - o = pa_operation_new(c, NULL, on_success, sizeof(struct success_data)); + o = pa_operation_new(c, NULL, on_subscribe, sizeof(struct subscribe_data)); d = o->userdata; - d->cb = cb; - d->userdata = userdata; + d->success.cb = cb; + d->success.userdata = userdata; + d->mask = m; pa_operation_sync(o); return o;