From 41677a526b83bb2493087af1d93b50c297cf97cd Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Wed, 21 Oct 2020 09:43:43 +0100 Subject: [PATCH] devicemonitor: Stop only the already started providers If a device provider fails to start (for instance the pulseaudio provider unable to connect to the PulseAudio daemon) then the monitor should not keep track of it in its `started` providers list. Otherwise a false positive critical warning would be raised. This patch also switches the started_count type from bool to int, for consistency. This is a counter, after all. API: gst_device_provider_is_started Part-of: --- gst/gstdevicemonitor.c | 3 ++- gst/gstdeviceprovider.c | 25 ++++++++++++++++++++++++- gst/gstdeviceprovider.h | 3 +++ tests/check/gst/gstdevice.c | 2 ++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/gst/gstdevicemonitor.c b/gst/gstdevicemonitor.c index 43752e1..fae2f61 100644 --- a/gst/gstdevicemonitor.c +++ b/gst/gstdevicemonitor.c @@ -571,7 +571,8 @@ gst_device_monitor_stop (GstDeviceMonitor * monitor) GstDeviceProvider *provider = g_ptr_array_index (monitor->priv->providers, i); - started = g_list_prepend (started, gst_object_ref (provider)); + if (gst_device_provider_is_started (provider)) + started = g_list_prepend (started, gst_object_ref (provider)); } GST_OBJECT_UNLOCK (monitor); diff --git a/gst/gstdeviceprovider.c b/gst/gstdeviceprovider.c index 4d159fe..547b7a1 100644 --- a/gst/gstdeviceprovider.c +++ b/gst/gstdeviceprovider.c @@ -55,7 +55,7 @@ struct _GstDeviceProviderPrivate GMutex start_lock; - gboolean started_count; + gint started_count; GList *hidden_providers; }; @@ -165,6 +165,8 @@ gst_device_provider_init (GstDeviceProvider * provider) g_mutex_init (&provider->priv->start_lock); + provider->priv->started_count = 0; + provider->priv->bus = gst_bus_new (); gst_bus_set_flushing (provider->priv->bus, TRUE); } @@ -854,3 +856,24 @@ gst_device_provider_device_changed (GstDeviceProvider * provider, gst_bus_post (provider->priv->bus, message); gst_object_unparent (GST_OBJECT (changed_device)); } + +/** + * gst_device_provider_is_started: + * @provider: a #GstDeviceProvider + * + * This function can be used to know if the @provider was successfully started. + * + * Since: 1.20 + */ +gboolean +gst_device_provider_is_started (GstDeviceProvider * provider) +{ + gboolean started = FALSE; + + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), FALSE); + + g_mutex_lock (&provider->priv->start_lock); + started = provider->priv->started_count > 0; + g_mutex_unlock (&provider->priv->start_lock); + return started; +} diff --git a/gst/gstdeviceprovider.h b/gst/gstdeviceprovider.h index 56ad620..cafe37e 100644 --- a/gst/gstdeviceprovider.h +++ b/gst/gstdeviceprovider.h @@ -139,6 +139,9 @@ GST_API const gchar * gst_device_provider_get_metadata (GstDeviceProvider * provider, const gchar * key); +GST_API +gboolean gst_device_provider_is_started (GstDeviceProvider * provider); + /* device provider class meta data */ GST_API diff --git a/tests/check/gst/gstdevice.c b/tests/check/gst/gstdevice.c index 70e186a..8d47236 100644 --- a/tests/check/gst/gstdevice.c +++ b/tests/check/gst/gstdevice.c @@ -244,12 +244,14 @@ GST_START_TEST (test_device_provider) g_list_free_full (devs, (GDestroyNotify) gst_object_unref); fail_if (gst_device_provider_can_monitor (dp)); + fail_if (gst_device_provider_is_started (dp)); fail_unless (gst_device_provider_start (dp)); bus = gst_device_provider_get_bus (dp); fail_unless (GST_IS_BUS (bus)); gst_object_unref (bus); + fail_unless (gst_device_provider_is_started (dp)); gst_device_provider_stop (dp); gst_object_unref (dp); -- 2.7.4