From f2b537bb65e07479d5d1c1c077cd503e9ace27ef Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 16 Mar 2021 15:48:55 +0100 Subject: [PATCH] context: fix passive node check A node starts out as passive but becomes non-passive when there is a non-passive link to an active node. If there is a link to an inactive node, the node remains passive. This fixes suspend of drivers in all cases. Fixes #898 --- src/pipewire/context.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 2d03b6af5..f5922410c 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -874,10 +874,12 @@ static int collect_nodes(struct pw_context *context, struct pw_impl_node *driver spa_list_for_each(p, &n->input_ports, link) { spa_list_for_each(l, &p->links, input_link) { t = l->output->node; - if (!l->passive) - driver->passive = n->passive = false; - else + + if (l->passive) pw_impl_link_prepare(l); + else if (t->active) + driver->passive = n->passive = false; + if (t->visited || !t->active) continue; if (l->prepared) { @@ -889,10 +891,12 @@ static int collect_nodes(struct pw_context *context, struct pw_impl_node *driver spa_list_for_each(p, &n->output_ports, link) { spa_list_for_each(l, &p->links, output_link) { t = l->input->node; - if (!l->passive) - driver->passive = n->passive = false; - else + + if (l->passive) pw_impl_link_prepare(l); + else if (t->active) + driver->passive = n->passive = false; + if (t->visited || !t->active) continue; if (l->prepared) {