From 42bdf3ee6dedbee844f06666aaa1a8069bf1dac8 Mon Sep 17 00:00:00 2001
From: Julian Bouzas <julian.bouzas@collabora.com>
Date: Tue, 18 Jun 2019 10:10:20 -0400
Subject: [PATCH] modules: unregister the endpoints when their proxy is
 destroyed

---
 modules/module-pipewire.c     | 14 ++++++++++++++
 modules/module-pw-alsa-udev.c | 14 ++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/modules/module-pipewire.c b/modules/module-pipewire.c
index f47d85c2..97c6bc74 100644
--- a/modules/module-pipewire.c
+++ b/modules/module-pipewire.c
@@ -76,6 +76,16 @@ proxy_info_destroy(gpointer p)
   g_slice_free (struct proxy_info, p);
 }
 
+static void
+unregister_endpoint (WpProxy* wp_proxy, WpEndpoint *endpoint)
+{
+  g_return_if_fail(WP_IS_PROXY(wp_proxy));
+  g_return_if_fail(WP_IS_ENDPOINT(endpoint));
+
+  /* Unregister the endpoint */
+  wp_endpoint_unregister(endpoint);
+}
+
 static void
 proxy_node_created(GObject *initable, GAsyncResult *res, gpointer d)
 {
@@ -123,6 +133,10 @@ proxy_node_created(GObject *initable, GAsyncResult *res, gpointer d)
   /* Register the endpoint */
   wp_endpoint_register (endpoint);
 
+  /* Set destroy handler to unregister endpoint when the proxy is detroyed */
+  g_signal_connect (proxy_node, "destroyed", G_CALLBACK(unregister_endpoint),
+      endpoint);
+
   /* Clean up */
   proxy_info_destroy (pi);
 }
diff --git a/modules/module-pw-alsa-udev.c b/modules/module-pw-alsa-udev.c
index bf02d106..6b26132b 100644
--- a/modules/module-pw-alsa-udev.c
+++ b/modules/module-pw-alsa-udev.c
@@ -70,6 +70,16 @@ proxy_info_destroy(gpointer p)
   g_slice_free (struct proxy_info, p);
 }
 
+static void
+unregister_endpoint (WpProxy* wp_proxy, WpEndpoint *endpoint)
+{
+  g_return_if_fail(WP_IS_PROXY(wp_proxy));
+  g_return_if_fail(WP_IS_ENDPOINT(endpoint));
+
+  /* Unregister the endpoint */
+  wp_endpoint_unregister(endpoint);
+}
+
 static void
 proxy_node_created(GObject *initable, GAsyncResult *res, gpointer data)
 {
@@ -114,6 +124,10 @@ proxy_node_created(GObject *initable, GAsyncResult *res, gpointer data)
   /* Register the endpoint */
   wp_endpoint_register (endpoint);
 
+  /* Set destroy handler to unregister endpoint when the proxy is detroyed */
+  g_signal_connect (proxy_node, "destroyed", G_CALLBACK(unregister_endpoint),
+      endpoint);
+
   /* Clean up */
   proxy_info_destroy (pi);
 }
-- 
GitLab