From 22bb2666c4b70d46f9f8607bb1ca32d0f16c4660 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 16 Jun 2021 09:52:49 +0200 Subject: [PATCH] metadata: remove metadata when the global is removed So that we can ensure the metadata only contains valid subject ids. --- src/modules/module-metadata/metadata.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/modules/module-metadata/metadata.c b/src/modules/module-metadata/metadata.c index e04954a70..3146d90fd 100644 --- a/src/modules/module-metadata/metadata.c +++ b/src/modules/module-metadata/metadata.c @@ -31,6 +31,8 @@ #define NAME "metadata" struct impl { + struct spa_hook context_listener; + struct pw_global *global; struct spa_hook global_listener; @@ -222,9 +224,23 @@ static const struct pw_global_events global_events = { .destroy = global_destroy, }; + +static void context_global_removed(void *data, struct pw_global *global) +{ + struct impl *impl = data; + pw_metadata_set_property(impl->metadata, + pw_global_get_id(global), NULL, NULL, NULL); +} + +static const struct pw_context_events context_events = { + PW_VERSION_CONTEXT_EVENTS, + .global_removed = context_global_removed, +}; + static void global_resource_destroy(void *data) { struct impl *impl = data; + spa_hook_remove(&impl->context_listener); spa_hook_remove(&impl->resource_listener); impl->resource = NULL; impl->metadata = NULL; @@ -272,11 +288,14 @@ pw_metadata_new(struct pw_context *context, struct pw_resource *resource, impl->resource = resource; impl->metadata = (struct pw_metadata*)resource; + pw_context_add_listener(context, &impl->context_listener, + &context_events, impl); + pw_global_add_listener(impl->global, &impl->global_listener, &global_events, impl); - pw_resource_set_bound_id(resource, pw_global_get_id (impl->global)); + pw_resource_set_bound_id(resource, pw_global_get_id(impl->global)); pw_global_register(impl->global); pw_resource_add_listener(resource,