From 96a84d09dffd97b88ce22a7b17e41ebe1915e34d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 17 Sep 2018 17:17:08 +0200 Subject: [PATCH] media-session: remove session when the driver node is removed --- src/examples/media-session.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/examples/media-session.c b/src/examples/media-session.c index fd4191105..d9b1e4345 100644 --- a/src/examples/media-session.c +++ b/src/examples/media-session.c @@ -426,12 +426,36 @@ registry_global_remove(void *data, uint32_t id) { struct impl *impl = data; struct object *obj; + struct session *sess; pw_log_debug(NAME " %p: remove global '%d'", impl, id); if ((obj = find_object(impl, id)) == NULL) return; + spa_list_for_each(sess, &impl->session_list, l) { + struct node *node = (struct node *)obj, *n, *t; + + if (sess->node != node) + continue; + + pw_log_debug(NAME " %p: remove session '%d'", impl, sess->id); + + spa_list_for_each_safe(n, t, &sess->node_list, session_link) { + n->session = NULL; + spa_list_remove(&n->session_link); + } + + if (sess->dsp) { + uint32_t id = ((struct object *)sess->dsp)->id; + pw_log_debug(NAME " %p: destroy dsp '%d'", impl, id); + pw_core_proxy_destroy(impl->core_proxy, id); + } + spa_list_remove(&sess->l); + free(sess); + break; + } + remove_object(impl, obj); schedule_rescan(impl); }