node: only add listener once

This commit is contained in:
Wim Taymans 2019-07-16 18:48:20 +02:00
parent 24d4eb585f
commit 7bb27344ba
2 changed files with 12 additions and 6 deletions

View file

@ -235,6 +235,7 @@ static void result_device_params_async(void *data, int seq, int res, uint32_t ty
if (seq == d->end) { if (seq == d->end) {
spa_hook_remove(&d->listener); spa_hook_remove(&d->listener);
d->end = -1;
pw_client_set_busy(d->resource->client, false); pw_client_set_busy(d->resource->client, false);
} }
} }
@ -259,13 +260,14 @@ static int device_enum_params(void *object, int seq, uint32_t id, uint32_t start
pw_core_resource_error(client->core_resource, pw_core_resource_error(client->core_resource,
resource->id, seq, res, spa_strerror(res)); resource->id, seq, res, spa_strerror(res));
} else if (SPA_RESULT_IS_ASYNC(res)) { } else if (SPA_RESULT_IS_ASYNC(res)) {
pw_client_set_busy(client, true);
data->data.data = data; data->data.data = data;
data->data.callback = reply_param; data->data.callback = reply_param;
spa_device_add_listener(device->device, &data->listener, if (data->end == -1)
&device_events, data); spa_device_add_listener(device->device, &data->listener,
&device_events, data);
data->seq = res; data->seq = res;
data->end = spa_device_sync(device->device, res); data->end = spa_device_sync(device->device, res);
pw_client_set_busy(client, true);
} }
return res; return res;
@ -306,6 +308,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions,
data = pw_resource_get_user_data(resource); data = pw_resource_get_user_data(resource);
data->device = this; data->device = this;
data->resource = resource; data->resource = resource;
data->end = -1;
pw_resource_add_listener(resource, pw_resource_add_listener(resource,
&data->resource_listener, &data->resource_listener,

View file

@ -396,6 +396,7 @@ static void result_node_sync(void *data, int seq, int res, uint32_t type, const
pw_log_debug("sync result %d %d (%d/%d)", res, seq, d->seq, d->end); pw_log_debug("sync result %d %d (%d/%d)", res, seq, d->seq, d->end);
if (seq == d->end) { if (seq == d->end) {
spa_hook_remove(&d->listener); spa_hook_remove(&d->listener);
d->end = -1;
pw_client_set_busy(d->resource->client, false); pw_client_set_busy(d->resource->client, false);
} }
} }
@ -423,11 +424,12 @@ static int node_set_param(void *object, uint32_t id, uint32_t flags,
resource->id, res, spa_strerror(res)); resource->id, res, spa_strerror(res));
pw_resource_error(resource, res, spa_strerror(res)); pw_resource_error(resource, res, spa_strerror(res));
} else if (SPA_RESULT_IS_ASYNC(res)) { } else if (SPA_RESULT_IS_ASYNC(res)) {
spa_node_add_listener(node->node, &data->listener, pw_client_set_busy(client, true);
&node_events, data); if (data->end == -1)
spa_node_add_listener(node->node, &data->listener,
&node_events, data);
data->seq = res; data->seq = res;
data->end = spa_node_sync(node->node, res); data->end = spa_node_sync(node->node, res);
pw_client_set_busy(client, true);
} }
return 0; return 0;
} }
@ -473,6 +475,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions,
data = pw_resource_get_user_data(resource); data = pw_resource_get_user_data(resource);
data->node = this; data->node = this;
data->resource = resource; data->resource = resource;
data->end = -1;
pw_resource_add_listener(resource, pw_resource_add_listener(resource,
&data->resource_listener, &data->resource_listener,