summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2020-09-30 10:16:20 +0200
committerWim Taymans <wtaymans@redhat.com>2020-09-30 10:16:20 +0200
commitac4d4582a42e5996f0523015386d83f5bddea1f6 (patch)
tree0d474f1bc956e93942e38885b5f7fdc88961de01
parent19c9a550503843d9f8917ddbf0efa289455a0663 (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.c26
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;