diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c index 8daa3b11c..d54df2758 100644 --- a/src/modules/module-link-factory.c +++ b/src/modules/module-link-factory.c @@ -279,28 +279,12 @@ static const struct pw_impl_link_events link_events = { static struct pw_impl_port *get_port(struct pw_impl_node *node, enum spa_direction direction) { struct pw_impl_port *p; - struct pw_context *context = pw_impl_node_get_context(node); - int res; p = pw_impl_node_find_port(node, direction, PW_ID_ANY); - if (p == NULL || pw_impl_port_is_linked(p)) { - uint32_t port_id; + if (p == NULL || pw_impl_port_is_linked(p)) + p = pw_impl_node_get_free_port(node, direction); - port_id = pw_impl_node_get_free_port_id(node, direction); - if (port_id == SPA_ID_INVALID) - return NULL; - - p = pw_context_create_port(context, direction, port_id, NULL, 0); - if (p == NULL) - return NULL; - - if ((res = pw_impl_port_add(p, node)) < 0) { - pw_log_warn("can't add port: %s", spa_strerror(res)); - errno = -res; - return NULL; - } - } return p; } diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index 822c86b21..2c1db3e2a 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -2709,6 +2709,19 @@ error: return SPA_ID_INVALID; } +SPA_EXPORT +struct pw_impl_port *pw_impl_node_get_free_port(struct pw_impl_node *node, enum pw_direction direction) +{ + uint32_t port_id = pw_impl_node_get_free_port_id(node, direction); + if (port_id == SPA_ID_INVALID) + return NULL; + + spa_node_add_port(node->node, direction, port_id, NULL); + + return pw_impl_node_find_port(node, direction, port_id); +} + + static void on_state_complete(void *obj, void *data, int res, uint32_t seq) { struct pw_impl_node *node = obj; diff --git a/src/pipewire/impl-node.h b/src/pipewire/impl-node.h index 908b92f88..7f7edb37a 100644 --- a/src/pipewire/impl-node.h +++ b/src/pipewire/impl-node.h @@ -168,6 +168,8 @@ pw_impl_node_find_port(struct pw_impl_node *node, enum pw_direction direction, u /** Get a free unused port_id from the node */ uint32_t pw_impl_node_get_free_port_id(struct pw_impl_node *node, enum pw_direction direction); +/** Get a free unused port from the node */ +struct pw_impl_port *pw_impl_node_get_free_port(struct pw_impl_node *node, enum pw_direction direction); int pw_impl_node_initialized(struct pw_impl_node *node);