node-factory: destroy node when resource is destroyed

This commit is contained in:
Wim Taymans 2019-07-12 09:54:32 +02:00
parent 6655e09502
commit 01e56c45ac

View file

@ -54,9 +54,24 @@ struct factory_data {
}; };
struct node_data { struct node_data {
struct factory_data *data;
struct spa_list link; struct spa_list link;
struct pw_node *node; struct pw_node *node;
struct spa_hook node_listener; struct spa_hook node_listener;
struct spa_hook resource_listener;
};
static void resource_destroy(void *data)
{
struct node_data *nd = data;
spa_hook_remove(&nd->resource_listener);
if (nd->node)
pw_node_destroy(nd->node);
}
static const struct pw_resource_events resource_events = {
PW_VERSION_RESOURCE_EVENTS,
.destroy = resource_destroy
}; };
static void node_destroy(void *data) static void node_destroy(void *data)
@ -64,6 +79,7 @@ static void node_destroy(void *data)
struct node_data *nd = data; struct node_data *nd = data;
spa_list_remove(&nd->link); spa_list_remove(&nd->link);
spa_hook_remove(&nd->node_listener); spa_hook_remove(&nd->node_listener);
nd->node = NULL;
} }
static const struct pw_node_events node_events = { static const struct pw_node_events node_events = {
@ -108,17 +124,28 @@ static void *create_object(void *_data,
goto error_create_node; goto error_create_node;
nd = pw_spa_node_get_user_data(node); nd = pw_spa_node_get_user_data(node);
nd->data = data;
nd->node = node; nd->node = node;
spa_list_append(&data->node_list, &nd->link); spa_list_append(&data->node_list, &nd->link);
pw_node_add_listener(node, &nd->node_listener, &node_events, nd); pw_node_add_listener(node, &nd->node_listener, &node_events, nd);
if (resource) if (resource) {
pw_global_bind(pw_node_get_global(node), struct pw_resource *bound_resource;
pw_resource_get_client(resource), struct pw_client *client = pw_resource_get_client(resource);
res = pw_global_bind(pw_node_get_global(node),
client,
PW_PERM_RWX, PW_PERM_RWX,
version, new_id); version, new_id);
if (res < 0)
goto error_bind;
if ((bound_resource = pw_client_find_resource(client, new_id)) == NULL)
goto error_bind;
pw_resource_add_listener(bound_resource, &nd->resource_listener, &resource_events, nd);
}
return node; return node;
error_properties: error_properties:
@ -133,6 +160,9 @@ error_create_node:
if (resource) if (resource)
pw_resource_error(resource, res, "can't create node: %s", spa_strerror(res)); pw_resource_error(resource, res, "can't create node: %s", spa_strerror(res));
goto error_exit; goto error_exit;
error_bind:
pw_resource_error(resource, res, "can't bind node");
goto error_exit;
error_exit_cleanup: error_exit_cleanup:
if (properties) if (properties)