diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index defc93666..1edad039e 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -1298,7 +1298,8 @@ static const struct pw_resource_events resource_events = { * \memberof pw_client_node */ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, - struct pw_properties *properties) + struct pw_properties *properties, + bool do_register) { struct impl *impl; struct pw_client_node *this; @@ -1335,7 +1336,8 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, pw_resource_get_client(this->resource), NULL, name, - PW_SPA_NODE_FLAG_ASYNC, + PW_SPA_NODE_FLAG_ASYNC | + (do_register ? 0 : PW_SPA_NODE_FLAG_NO_REGISTER), &impl->node.node, NULL, properties, 0); diff --git a/src/modules/module-client-node/client-node.h b/src/modules/module-client-node/client-node.h index e51f475e1..2f484392f 100644 --- a/src/modules/module-client-node/client-node.h +++ b/src/modules/module-client-node/client-node.h @@ -39,7 +39,8 @@ struct pw_client_node { struct pw_client_node * pw_client_node_new(struct pw_resource *resource, - struct pw_properties *properties); + struct pw_properties *properties, + bool do_register); void pw_client_node_destroy(struct pw_client_node *node); diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index 38120fa3f..bd8cfd59c 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -75,10 +75,16 @@ static void pw_spa_node_destroy(void *data) static void complete_init(struct impl *impl) { struct pw_node *this = impl->this; - if (impl->flags & PW_SPA_NODE_FLAG_DISABLE) + + if (SPA_FLAG_CHECK(impl->flags, PW_SPA_NODE_FLAG_DISABLE)) pw_node_set_enabled(this, false); - pw_node_register(this, impl->owner, impl->parent, NULL); - if (impl->flags & PW_SPA_NODE_FLAG_ACTIVATE) + + if (!SPA_FLAG_CHECK(impl->flags, PW_SPA_NODE_FLAG_NO_REGISTER)) + pw_node_register(this, impl->owner, impl->parent, NULL); + else + pw_node_initialized(this); + + if (SPA_FLAG_CHECK(impl->flags, PW_SPA_NODE_FLAG_ACTIVATE)) pw_node_set_active(this, true); } diff --git a/src/modules/spa/spa-node.h b/src/modules/spa/spa-node.h index 61bdcd5d0..476c71085 100644 --- a/src/modules/spa/spa-node.h +++ b/src/modules/spa/spa-node.h @@ -34,6 +34,7 @@ enum pw_spa_node_flags { PW_SPA_NODE_FLAG_ASYNC = (1 << 0), PW_SPA_NODE_FLAG_DISABLE = (1 << 1), PW_SPA_NODE_FLAG_ACTIVATE = (1 << 2), + PW_SPA_NODE_FLAG_NO_REGISTER = (1 << 3), }; struct pw_node * diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 40afc814d..8f456d5c2 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -383,10 +383,13 @@ int pw_node_register(struct pw_node *this, pw_port_register(port, owner, this->global, pw_properties_copy(port->properties)); + return pw_node_initialized(this); +} + +int pw_node_initialized(struct pw_node *this) +{ spa_hook_list_call(&this->listener_list, struct pw_node_events, initialized); - pw_node_update_state(this, PW_NODE_STATE_SUSPENDED, NULL); - return 0; } diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 69976595c..18665250d 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -599,6 +599,8 @@ void pw_node_update_state(struct pw_node *node, enum pw_node_state state, char * int pw_node_update_ports(struct pw_node *node); +int pw_node_initialized(struct pw_node *node); + /** Activate a link \memberof pw_link * Starts the negotiation of formats and buffers on \a link and then * starts data streaming */