From 582b966cedabf3ed21e7fc16d100588c7eaac656 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 19 Jun 2026 08:59:15 +0200 Subject: [PATCH] impl-node: trigger a graph recalc on active node with driver When adding the freeze/thaw recalc graph calls, triggering the actual recalc of the graph (when an active node with a driver was removed) was removed. The thaw only actually recalcs the graph when something set the recalc_pending flag so we still need something to set this. Normally this would be because of some of the ports or links that got destroyed but if not, the original recalc trigger needs to remain as a fallback. --- src/pipewire/impl-node.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index 2fae3af0c..577dfa576 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -2400,7 +2400,9 @@ void pw_impl_node_destroy(struct pw_impl_node *node) struct pw_impl_port *port; struct pw_impl_node *follower; struct pw_context *context = node->context; + bool active, had_driver; + active = node->active; node->active = false; node->runnable = false; @@ -2416,6 +2418,7 @@ void pw_impl_node_destroy(struct pw_impl_node *node) pw_impl_node_emit_destroy(node); pw_log_debug("%p: driver node %p", impl, node->driver_node); + had_driver = node != node->driver_node; /* remove ourself as a follower from the driver node */ spa_list_remove(&node->follower_link); @@ -2449,6 +2452,10 @@ void pw_impl_node_destroy(struct pw_impl_node *node) spa_hook_remove(&node->global_listener); pw_global_destroy(node->global); } + if (active || had_driver) + pw_context_recalc_graph(context, + "active node destroy"); + pw_context_thaw_recalc_graph(context, "node destroy"); pw_log_debug("%p: free", node);