From 19dc1506434fd9303a824cdc6f47bc0c58bf15d3 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 1 Dec 2020 12:03:28 +0100 Subject: [PATCH] media-session: don't emit metadata remove in shutdown When in shutdown we destroy all objects but don't remove all the metadata associated with them, like route settings. --- src/examples/media-session/media-session.c | 2 ++ src/examples/media-session/media-session.h | 1 + src/examples/media-session/metadata.c | 11 ++++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c index 19c67e2fb..c44f1087f 100644 --- a/src/examples/media-session/media-session.c +++ b/src/examples/media-session/media-session.c @@ -72,6 +72,7 @@ #define sm_media_session_emit_create(s,obj) sm_media_session_emit(s, create, 0, obj) #define sm_media_session_emit_remove(s,obj) sm_media_session_emit(s, remove, 0, obj) #define sm_media_session_emit_rescan(s,seq) sm_media_session_emit(s, rescan, 0, seq) +#define sm_media_session_emit_shutdown(s) sm_media_session_emit(s, shutdown, 0) #define sm_media_session_emit_destroy(s) sm_media_session_emit(s, destroy, 0) int sm_access_flatpak_start(struct sm_media_session *sess); @@ -2047,6 +2048,7 @@ static void session_shutdown(struct impl *impl) struct sm_object *obj; pw_log_info(NAME" %p", impl); + sm_media_session_emit_shutdown(impl); spa_list_consume(obj, &impl->global_list, link) sm_object_destroy(obj); diff --git a/src/examples/media-session/media-session.h b/src/examples/media-session/media-session.h index d8db66fd7..d28bfdd55 100644 --- a/src/examples/media-session/media-session.h +++ b/src/examples/media-session/media-session.h @@ -228,6 +228,7 @@ struct sm_media_session_events { void (*remove) (void *data, struct sm_object *object); void (*rescan) (void *data, int seq); + void (*shutdown) (void *data); void (*destroy) (void *data); }; diff --git a/src/examples/media-session/metadata.c b/src/examples/media-session/metadata.c index d5f774521..23c949fc2 100644 --- a/src/examples/media-session/metadata.c +++ b/src/examples/media-session/metadata.c @@ -94,6 +94,8 @@ struct metadata { struct sm_media_session *session; struct spa_hook session_listener; struct pw_proxy *proxy; + + unsigned int shutdown:1; }; static void emit_properties(struct metadata *this) @@ -159,7 +161,7 @@ static int clear_subjects(struct metadata *this, uint32_t subject) pw_array_remove(&this->metadata, item); removed++; } - if (removed > 0) + if (removed > 0 && !this->shutdown) pw_metadata_emit_property(&this->hooks, subject, NULL, NULL, NULL); return 0; } @@ -240,6 +242,12 @@ static void session_remove(void *data, struct sm_object *object) clear_subjects(this, object->id); } +static void session_shutdown(void *data) +{ + struct metadata *this = data; + this->shutdown = true; +} + static void session_destroy(void *data) { struct metadata *this = data; @@ -254,6 +262,7 @@ static void session_destroy(void *data) static const struct sm_media_session_events session_events = { SM_VERSION_MEDIA_SESSION_EVENTS, + .shutdown = session_shutdown, .destroy = session_destroy, .remove = session_remove, };