From af1b012a70c4225747fd67a009dd1bbe771880a3 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 17 Jul 2019 15:31:01 +0200 Subject: [PATCH] adapter: free slave in the module --- src/modules/module-adapter.c | 12 +++++++++++- src/modules/module-adapter/adapter.c | 5 ++--- src/modules/spa/spa-node.c | 3 +-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index 285d7f672..ce68aef71 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -62,6 +62,7 @@ struct node_data { struct factory_data *data; struct spa_list link; struct pw_node *adapter; + struct pw_node *slave; struct spa_hook adapter_listener; struct spa_hook resource_listener; }; @@ -69,6 +70,7 @@ struct node_data { static void resource_destroy(void *data) { struct node_data *nd = data; + spa_hook_remove(&nd->resource_listener); if (nd->adapter) pw_node_destroy(nd->adapter); @@ -86,9 +88,16 @@ static void node_destroy(void *data) 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 = { PW_VERSION_NODE_EVENTS, - .destroy = node_destroy + .destroy = node_destroy, + .free = node_free, }; static void *create_object(void *_data, @@ -149,6 +158,7 @@ static void *create_object(void *_data, nd = pw_adapter_get_user_data(adapter); nd->data = d; nd->adapter = adapter; + nd->slave = slave; spa_list_append(&d->node_list, &nd->link); pw_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd); diff --git a/src/modules/module-adapter/adapter.c b/src/modules/module-adapter/adapter.c index c339293dc..0810c57a7 100644 --- a/src/modules/module-adapter/adapter.c +++ b/src/modules/module-adapter/adapter.c @@ -160,15 +160,14 @@ static const struct pw_port_implementation port_implementation = { static void node_destroy(void *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); spa_list_remove(&p->link); spa_handle_clear(p->spa_handle); free(p); } - pw_node_destroy(n->slave); pw_properties_free(n->props); } diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index 49a4f24c0..7256abfef 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -71,9 +71,8 @@ static void spa_node_free(void *data) pw_log_debug("spa-node %p: free", node); spa_hook_remove(&impl->node_listener); - if (impl->handle) { + if (impl->handle) pw_unload_spa_handle(impl->handle); - } free(impl->factory_name); }