mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
node-factory: destroy node when resource is destroyed
This commit is contained in:
parent
6655e09502
commit
01e56c45ac
1 changed files with 33 additions and 3 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue