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.
This commit is contained in:
Wim Taymans 2020-09-30 10:16:20 +02:00
parent 19c9a55050
commit ac4d4582a4

View file

@ -1543,7 +1543,7 @@ static void on_success(pa_operation *o, void *userdata)
{ {
struct success_data *d = userdata; struct success_data *d = userdata;
pa_context *c = o->context; 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) if (d->error != 0)
pa_context_set_error(c, d->error); pa_context_set_error(c, d->error);
if (d->cb) if (d->cb)
@ -1551,23 +1551,37 @@ static void on_success(pa_operation *o, void *userdata)
pa_operation_done(o); 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 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* pa_context_subscribe(pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata)
{ {
pa_operation *o; pa_operation *o;
struct success_data *d; struct subscribe_data *d;
pa_assert(c); pa_assert(c);
pa_assert(c->refcount >= 1); pa_assert(c->refcount >= 1);
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE); 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 = o->userdata;
d->cb = cb; d->success.cb = cb;
d->userdata = userdata; d->success.userdata = userdata;
d->mask = m;
pa_operation_sync(o); pa_operation_sync(o);
return o; return o;