119 lines
3.8 KiB
Diff
119 lines
3.8 KiB
Diff
From c66d393e5980aa36e6f2d53cacec6887476bc5e4 Mon Sep 17 00:00:00 2001
|
|
From: Philippe Normand <philn@igalia.com>
|
|
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
|
|
---
|
|
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 43752e15d..fae2f61f5 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 4d159fe6c..547b7a174 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 56ad6209a..cafe37e1c 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 70e186ac3..8d4723608 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.28.0
|
|
|