adapter: free slave in the module

This commit is contained in:
Wim Taymans 2019-07-17 15:31:01 +02:00
parent 53d3d5cb0c
commit af1b012a70
3 changed files with 14 additions and 6 deletions

View file

@ -62,6 +62,7 @@ struct node_data {
struct factory_data *data; struct factory_data *data;
struct spa_list link; struct spa_list link;
struct pw_node *adapter; struct pw_node *adapter;
struct pw_node *slave;
struct spa_hook adapter_listener; struct spa_hook adapter_listener;
struct spa_hook resource_listener; struct spa_hook resource_listener;
}; };
@ -69,6 +70,7 @@ struct node_data {
static void resource_destroy(void *data) static void resource_destroy(void *data)
{ {
struct node_data *nd = data; struct node_data *nd = data;
spa_hook_remove(&nd->resource_listener); spa_hook_remove(&nd->resource_listener);
if (nd->adapter) if (nd->adapter)
pw_node_destroy(nd->adapter); pw_node_destroy(nd->adapter);
@ -86,9 +88,16 @@ static void node_destroy(void *data)
nd->adapter = NULL; nd->adapter = NULL;
} }
static void node_free(void *data)
{
struct node_data *nd = data;
pw_node_destroy(nd->slave);
}
static const struct pw_node_events node_events = { static const struct pw_node_events node_events = {
PW_VERSION_NODE_EVENTS, PW_VERSION_NODE_EVENTS,
.destroy = node_destroy .destroy = node_destroy,
.free = node_free,
}; };
static void *create_object(void *_data, static void *create_object(void *_data,
@ -149,6 +158,7 @@ static void *create_object(void *_data,
nd = pw_adapter_get_user_data(adapter); nd = pw_adapter_get_user_data(adapter);
nd->data = d; nd->data = d;
nd->adapter = adapter; nd->adapter = adapter;
nd->slave = slave;
spa_list_append(&d->node_list, &nd->link); spa_list_append(&d->node_list, &nd->link);
pw_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd); pw_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd);

View file

@ -160,15 +160,14 @@ static const struct pw_port_implementation port_implementation = {
static void node_destroy(void *data) static void node_destroy(void *data)
{ {
struct node *n = data; struct node *n = data;
struct port *p, *tmp; struct port *p;
spa_list_for_each_safe(p, tmp, &n->ports, link) { spa_list_consume(p, &n->ports, link) {
pw_port_set_mix(p->port, NULL, 0); pw_port_set_mix(p->port, NULL, 0);
spa_list_remove(&p->link); spa_list_remove(&p->link);
spa_handle_clear(p->spa_handle); spa_handle_clear(p->spa_handle);
free(p); free(p);
} }
pw_node_destroy(n->slave);
pw_properties_free(n->props); pw_properties_free(n->props);
} }

View file

@ -71,9 +71,8 @@ static void spa_node_free(void *data)
pw_log_debug("spa-node %p: free", node); pw_log_debug("spa-node %p: free", node);
spa_hook_remove(&impl->node_listener); spa_hook_remove(&impl->node_listener);
if (impl->handle) { if (impl->handle)
pw_unload_spa_handle(impl->handle); pw_unload_spa_handle(impl->handle);
}
free(impl->factory_name); free(impl->factory_name);
} }