diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c index a328eb1ad..05511e7a4 100644 --- a/src/examples/media-session/media-session.c +++ b/src/examples/media-session/media-session.c @@ -1581,6 +1581,39 @@ int sm_media_session_create_links(struct sm_media_session *sess, return res; } +int sm_media_session_remove_links(struct sm_media_session *sess, + const struct spa_dict *dict) +{ + struct impl *impl = SPA_CONTAINER_OF(sess, struct impl, this); + struct sm_object *obj; + struct sm_node *outnode = NULL, *innode = NULL; + const char *str; + struct link *l, *t; + + /* find output node */ + if ((str = spa_dict_lookup(dict, PW_KEY_LINK_OUTPUT_NODE)) != NULL && + (obj = find_object(impl, atoi(str))) != NULL && + strcmp(obj->type, PW_TYPE_INTERFACE_Node) == 0) { + outnode = (struct sm_node*)obj; + } + + /* find input node */ + if ((str = spa_dict_lookup(dict, PW_KEY_LINK_INPUT_NODE)) != NULL && + (obj = find_object(impl, atoi(str))) != NULL && + strcmp(obj->type, PW_TYPE_INTERFACE_Node) == 0) { + innode = (struct sm_node*)obj; + } + if (innode == NULL || outnode == NULL) + return -EINVAL; + + spa_list_for_each_safe(l, t, &impl->link_list, link) { + if (l->output_node == outnode->obj.id && l->input_node == innode->obj.id) { + pw_proxy_destroy(l->proxy); + } + } + return 0; +} + static void monitor_core_done(void *data, uint32_t id, int seq) { struct impl *impl = data; diff --git a/src/examples/media-session/media-session.h b/src/examples/media-session/media-session.h index f619e4693..18b91f040 100644 --- a/src/examples/media-session/media-session.h +++ b/src/examples/media-session/media-session.h @@ -271,6 +271,8 @@ struct sm_node *sm_media_session_create_node(struct sm_media_session *sess, int sm_media_session_create_links(struct sm_media_session *sess, const struct spa_dict *dict); +int sm_media_session_remove_links(struct sm_media_session *sess, + const struct spa_dict *dict); #ifdef __cplusplus }