diff options
author | Wim Taymans <wtaymans@redhat.com> | 2020-09-30 10:16:20 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2020-09-30 10:16:20 +0200 |
commit | ac4d4582a42e5996f0523015386d83f5bddea1f6 (patch) | |
tree | 0d474f1bc956e93942e38885b5f7fdc88961de01 | |
parent | 19c9a550503843d9f8917ddbf0efa289455a0663 (diff) |
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.
-rw-r--r-- | pipewire-pulseaudio/src/context.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index 78184278..227cf376 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; |