blob: e0b59ec3d1bebf600c4ad6ab5cb840bd54f0dbda [file] [log] [blame]
Olivier Crête448d1802013-01-08 21:30:44 -05001/* GStreamer
2 * Copyright (C) 2013 Olivier Crete <olivier.crete@collabora.com>
3 *
Olivier Crêtec2583ca2014-06-26 15:08:46 -04004 * gstdevicemonitor.c: device monitor
Olivier Crête448d1802013-01-08 21:30:44 -05005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
Olivier Crête77db6bf2014-06-20 16:55:06 -040021
22/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -040023 * SECTION:gstdevicemonitor
Thibault Sauniera87b4552017-01-16 11:26:16 -030024 * @title: GstDeviceMonitor
Olivier Crêtec2583ca2014-06-26 15:08:46 -040025 * @short_description: A device monitor and prober
Olivier Crête79921742014-06-26 14:28:09 -040026 * @see_also: #GstDevice, #GstDeviceProvider
Olivier Crête77db6bf2014-06-20 16:55:06 -040027 *
Olivier Crêtec2583ca2014-06-26 15:08:46 -040028 * Applications should create a #GstDeviceMonitor when they want
Olivier Crête77db6bf2014-06-20 16:55:06 -040029 * to probe, list and monitor devices of a specific type. The
Olivier Crêtec2583ca2014-06-26 15:08:46 -040030 * #GstDeviceMonitor will create the appropriate
Olivier Crête79921742014-06-26 14:28:09 -040031 * #GstDeviceProvider objects and manage them. It will then post
Olivier Crête77db6bf2014-06-20 16:55:06 -040032 * messages on its #GstBus for devices that have been added and
33 * removed.
34 *
Olivier Crête6d12b332014-06-26 17:13:12 -040035 * The device monitor will monitor all devices matching the filters that
36 * the application has set.
37 *
Tim-Philipp Müller0e0e78e2014-06-27 10:44:32 +010038 * The basic use pattern of a device monitor is as follows:
Olivier Crête67440ce2014-06-26 17:22:25 -040039 * |[
40 * static gboolean
41 * my_bus_func (GstBus * bus, GstMessage * message, gpointer user_data)
42 * {
43 * GstDevice *device;
Tim-Philipp Müllerc06d9f72014-09-03 17:38:16 +010044 * gchar *name;
Olivier Crête67440ce2014-06-26 17:22:25 -040045 *
46 * switch (GST_MESSAGE_TYPE (message)) {
47 * case GST_MESSAGE_DEVICE_ADDED:
48 * gst_message_parse_device_added (message, &device);
49 * name = gst_device_get_display_name (device);
50 * g_print("Device added: %s\n", name);
51 * g_free (name);
Guillaume Desmottes514beb72016-07-13 15:43:21 +020052 * gst_object_unref (device);
Olivier Crête67440ce2014-06-26 17:22:25 -040053 * break;
54 * case GST_MESSAGE_DEVICE_REMOVED:
55 * gst_message_parse_device_removed (message, &device);
56 * name = gst_device_get_display_name (device);
57 * g_print("Device removed: %s\n", name);
58 * g_free (name);
Guillaume Desmottes514beb72016-07-13 15:43:21 +020059 * gst_object_unref (device);
Olivier Crête67440ce2014-06-26 17:22:25 -040060 * break;
61 * default:
62 * break;
63 * }
64 *
65 * return G_SOURCE_CONTINUE;
66 * }
67 *
68 * GstDeviceMonitor *
69 * setup_raw_video_source_device_monitor (void) {
70 * GstDeviceMonitor *monitor;
71 * GstBus *bus;
72 * GstCaps *caps;
73 *
74 * monitor = gst_device_monitor_new ();
75 *
76 * bus = gst_device_monitor_get_bus (monitor);
77 * gst_bus_add_watch (bus, my_bus_func, NULL);
78 * gst_object_unref (bus);
79 *
Tim-Philipp Müllerc06d9f72014-09-03 17:38:16 +010080 * caps = gst_caps_new_empty_simple ("video/x-raw");
Olivier Crête67440ce2014-06-26 17:22:25 -040081 * gst_device_monitor_add_filter (monitor, "Video/Source", caps);
82 * gst_caps_unref (caps);
83 *
84 * gst_device_monitor_start (monitor);
85 *
86 * return monitor;
87 * }
88 * ]|
89 *
Olivier Crête77db6bf2014-06-20 16:55:06 -040090 * Since: 1.4
91 */
92
93
Olivier Crête448d1802013-01-08 21:30:44 -050094#ifdef HAVE_CONFIG_H
95#include "config.h"
96#endif
97
Edward Herveyfb9ca6f2014-03-17 09:51:45 +010098#include "gst_private.h"
Olivier Crêtec2583ca2014-06-26 15:08:46 -040099#include "gstdevicemonitor.h"
Olivier Crête448d1802013-01-08 21:30:44 -0500100
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400101struct _GstDeviceMonitorPrivate
Olivier Crête448d1802013-01-08 21:30:44 -0500102{
103 gboolean started;
104
105 GstBus *bus;
106
Olivier Crête79921742014-06-26 14:28:09 -0400107 GPtrArray *providers;
Olivier Crête448d1802013-01-08 21:30:44 -0500108 guint cookie;
109
Olivier Crête6d12b332014-06-26 17:13:12 -0400110 GPtrArray *filters;
111
112 guint last_id;
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200113 GList *hidden;
114 gboolean show_all;
Olivier Crête448d1802013-01-08 21:30:44 -0500115};
116
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200117#define DEFAULT_SHOW_ALL FALSE
118
119enum
120{
121 PROP_SHOW_ALL = 1,
122};
Olivier Crête448d1802013-01-08 21:30:44 -0500123
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400124G_DEFINE_TYPE (GstDeviceMonitor, gst_device_monitor, GST_TYPE_OBJECT);
Olivier Crête448d1802013-01-08 21:30:44 -0500125
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400126static void gst_device_monitor_dispose (GObject * object);
Olivier Crête448d1802013-01-08 21:30:44 -0500127
Olivier Crête6d12b332014-06-26 17:13:12 -0400128struct DeviceFilter
129{
130 guint id;
131
132 gchar **classesv;
133 GstCaps *caps;
134};
135
136static void
137device_filter_free (struct DeviceFilter *filter)
138{
139 g_strfreev (filter->classesv);
140 gst_caps_unref (filter->caps);
141
142 g_slice_free (struct DeviceFilter, filter);
143}
144
Olivier Crête448d1802013-01-08 21:30:44 -0500145static void
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200146gst_device_monitor_get_property (GObject * object, guint prop_id,
147 GValue * value, GParamSpec * pspec)
148{
149 GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object);
150
151 switch (prop_id) {
152 case PROP_SHOW_ALL:
153 g_value_set_boolean (value,
154 gst_device_monitor_get_show_all_devices (monitor));
155 break;
156 default:
157 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
158 break;
159 }
160}
161
162static void
163gst_device_monitor_set_property (GObject * object, guint prop_id,
164 const GValue * value, GParamSpec * pspec)
165{
166 GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object);
167
168 switch (prop_id) {
169 case PROP_SHOW_ALL:
170 gst_device_monitor_set_show_all_devices (monitor,
171 g_value_get_boolean (value));
172 break;
173 default:
174 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
175 break;
176 }
177}
178
179
180static void
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400181gst_device_monitor_class_init (GstDeviceMonitorClass * klass)
Olivier Crête448d1802013-01-08 21:30:44 -0500182{
183 GObjectClass *object_class = G_OBJECT_CLASS (klass);
184
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400185 g_type_class_add_private (klass, sizeof (GstDeviceMonitorPrivate));
Olivier Crête448d1802013-01-08 21:30:44 -0500186
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200187 object_class->get_property = gst_device_monitor_get_property;
188 object_class->set_property = gst_device_monitor_set_property;
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400189 object_class->dispose = gst_device_monitor_dispose;
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200190
191 g_object_class_install_property (object_class, PROP_SHOW_ALL,
192 g_param_spec_boolean ("show-all", "Show All",
193 "Show all devices, even those from hidden providers",
194 DEFAULT_SHOW_ALL, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
195}
196
197/* must be called with monitor lock */
198static gboolean
199is_provider_hidden (GstDeviceMonitor * monitor, GList * hidden,
200 GstDeviceProvider * provider)
201{
202 GstDeviceProviderFactory *factory;
203
204 if (monitor->priv->show_all)
205 return FALSE;
206
207 factory = gst_device_provider_get_factory (provider);
208 if (g_list_find_custom (hidden, GST_OBJECT_NAME (factory),
209 (GCompareFunc) g_strcmp0))
210 return TRUE;
211
212 return FALSE;
213}
214
215/* must be called with monitor lock */
216static void
217update_hidden_providers_list (GList ** hidden, GstDeviceProvider * provider)
218{
219 gchar **obs;
220
221 obs = gst_device_provider_get_hidden_providers (provider);
222 if (obs) {
223 gint i;
224
225 for (i = 0; obs[i]; i++)
226 *hidden = g_list_prepend (*hidden, obs[i]);
227
228 g_free (obs);
229 }
Olivier Crête448d1802013-01-08 21:30:44 -0500230}
231
232static void
233bus_sync_message (GstBus * bus, GstMessage * message,
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400234 GstDeviceMonitor * monitor)
Olivier Crête448d1802013-01-08 21:30:44 -0500235{
Tim-Philipp Müller06ef8cd2014-03-16 15:19:49 +0000236 GstMessageType type = GST_MESSAGE_TYPE (message);
Olivier Crête448d1802013-01-08 21:30:44 -0500237
Tim-Philipp Müller06ef8cd2014-03-16 15:19:49 +0000238 if (type == GST_MESSAGE_DEVICE_ADDED || type == GST_MESSAGE_DEVICE_REMOVED) {
Jan Alexander Steffens (heftig)d9b20492017-11-06 20:23:12 +0100239 gboolean matches = TRUE;
Olivier Crête448d1802013-01-08 21:30:44 -0500240 GstDevice *device;
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200241 GstDeviceProvider *provider;
Olivier Crête448d1802013-01-08 21:30:44 -0500242
Tim-Philipp Müller06ef8cd2014-03-16 15:19:49 +0000243 if (type == GST_MESSAGE_DEVICE_ADDED)
Olivier Crête448d1802013-01-08 21:30:44 -0500244 gst_message_parse_device_added (message, &device);
245 else
246 gst_message_parse_device_removed (message, &device);
247
248 GST_OBJECT_LOCK (monitor);
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200249 provider =
250 GST_DEVICE_PROVIDER (gst_object_get_parent (GST_OBJECT (device)));
251 if (is_provider_hidden (monitor, monitor->priv->hidden, provider)) {
252 matches = FALSE;
Jan Alexander Steffens (heftig)d9b20492017-11-06 20:23:12 +0100253 } else {
Olivier Crête6d12b332014-06-26 17:13:12 -0400254 guint i;
255
256 for (i = 0; i < monitor->priv->filters->len; i++) {
257 struct DeviceFilter *filter =
258 g_ptr_array_index (monitor->priv->filters, i);
259 GstCaps *caps;
260
261 caps = gst_device_get_caps (device);
262 matches = gst_caps_can_intersect (filter->caps, caps) &&
263 gst_device_has_classesv (device, filter->classesv);
264 gst_caps_unref (caps);
265 if (matches)
266 break;
267 }
Olivier Crête6d12b332014-06-26 17:13:12 -0400268 }
Olivier Crête448d1802013-01-08 21:30:44 -0500269 GST_OBJECT_UNLOCK (monitor);
270
Wim Taymansffa90b22015-08-08 17:59:51 +0200271 gst_object_unref (provider);
Olivier Crête6d12b332014-06-26 17:13:12 -0400272 gst_object_unref (device);
273
Olivier Crêtee743fac2014-03-16 15:56:59 -0400274 if (matches)
Olivier Crête448d1802013-01-08 21:30:44 -0500275 gst_bus_post (monitor->priv->bus, gst_message_ref (message));
276 }
277}
278
279
280static void
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400281gst_device_monitor_init (GstDeviceMonitor * self)
Olivier Crête448d1802013-01-08 21:30:44 -0500282{
Olivier Crête448d1802013-01-08 21:30:44 -0500283 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400284 GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorPrivate);
Olivier Crête448d1802013-01-08 21:30:44 -0500285
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200286 self->priv->show_all = DEFAULT_SHOW_ALL;
287
Olivier Crête448d1802013-01-08 21:30:44 -0500288 self->priv->bus = gst_bus_new ();
289 gst_bus_set_flushing (self->priv->bus, TRUE);
290
Olivier Crête79921742014-06-26 14:28:09 -0400291 self->priv->providers = g_ptr_array_new ();
Olivier Crête6d12b332014-06-26 17:13:12 -0400292 self->priv->filters = g_ptr_array_new_with_free_func (
293 (GDestroyNotify) device_filter_free);
Olivier Crête448d1802013-01-08 21:30:44 -0500294
Olivier Crête6d12b332014-06-26 17:13:12 -0400295 self->priv->last_id = 1;
Olivier Crête448d1802013-01-08 21:30:44 -0500296}
297
298
299static void
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400300gst_device_monitor_remove (GstDeviceMonitor * self, guint i)
Olivier Crête448d1802013-01-08 21:30:44 -0500301{
Olivier Crête79921742014-06-26 14:28:09 -0400302 GstDeviceProvider *provider = g_ptr_array_index (self->priv->providers, i);
Olivier Crête448d1802013-01-08 21:30:44 -0500303 GstBus *bus;
304
Wim Taymans8caf9b72015-07-16 17:25:24 +0200305 g_ptr_array_remove_index (self->priv->providers, i);
Olivier Crête448d1802013-01-08 21:30:44 -0500306
Olivier Crête79921742014-06-26 14:28:09 -0400307 bus = gst_device_provider_get_bus (provider);
Olivier Crête448d1802013-01-08 21:30:44 -0500308 g_signal_handlers_disconnect_by_func (bus, bus_sync_message, self);
309 gst_object_unref (bus);
310
Olivier Crête79921742014-06-26 14:28:09 -0400311 gst_object_unref (provider);
Olivier Crête448d1802013-01-08 21:30:44 -0500312}
313
314static void
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400315gst_device_monitor_dispose (GObject * object)
Olivier Crête448d1802013-01-08 21:30:44 -0500316{
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400317 GstDeviceMonitor *self = GST_DEVICE_MONITOR (object);
Olivier Crête448d1802013-01-08 21:30:44 -0500318
Sebastian Dröge154eefe2014-11-28 14:17:54 +0100319 g_return_if_fail (!self->priv->started);
Olivier Crête448d1802013-01-08 21:30:44 -0500320
Olivier Crête79921742014-06-26 14:28:09 -0400321 if (self->priv->providers) {
322 while (self->priv->providers->len)
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400323 gst_device_monitor_remove (self, self->priv->providers->len - 1);
Olivier Crête79921742014-06-26 14:28:09 -0400324 g_ptr_array_unref (self->priv->providers);
325 self->priv->providers = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500326 }
327
Guillaume Desmottes68810842014-06-30 08:59:18 +0000328 if (self->priv->filters) {
329 g_ptr_array_unref (self->priv->filters);
330 self->priv->filters = NULL;
331 }
Olivier Crête6d12b332014-06-26 17:13:12 -0400332
Olivier Crête448d1802013-01-08 21:30:44 -0500333 gst_object_replace ((GstObject **) & self->priv->bus, NULL);
334
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400335 G_OBJECT_CLASS (gst_device_monitor_parent_class)->dispose (object);
Olivier Crête448d1802013-01-08 21:30:44 -0500336}
337
338/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400339 * gst_device_monitor_get_devices:
Olivier Crête79921742014-06-26 14:28:09 -0400340 * @monitor: A #GstDeviceProvider
Olivier Crête448d1802013-01-08 21:30:44 -0500341 *
342 * Gets a list of devices from all of the relevant monitors. This may actually
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400343 * probe the hardware if the monitor is not currently started.
Olivier Crête448d1802013-01-08 21:30:44 -0500344 *
Arun Raghavanb5028382017-10-22 18:05:30 +0530345 * Returns: (transfer full) (element-type GstDevice) (nullable): a #GList of
Olivier Crête448d1802013-01-08 21:30:44 -0500346 * #GstDevice
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100347 *
348 * Since: 1.4
Olivier Crête448d1802013-01-08 21:30:44 -0500349 */
350
351GList *
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400352gst_device_monitor_get_devices (GstDeviceMonitor * monitor)
Olivier Crête448d1802013-01-08 21:30:44 -0500353{
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200354 GList *devices = NULL, *hidden = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500355 guint i;
356 guint cookie;
357
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400358 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
Olivier Crête448d1802013-01-08 21:30:44 -0500359
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100360 GST_OBJECT_LOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500361
Olivier Crête6d12b332014-06-26 17:13:12 -0400362 if (monitor->priv->filters->len == 0) {
363 GST_OBJECT_UNLOCK (monitor);
364 GST_WARNING_OBJECT (monitor, "No filters have been set");
Arun Raghavan41a59cd2017-05-27 05:19:20 +0530365 return NULL;
Olivier Crête6d12b332014-06-26 17:13:12 -0400366 }
367
368 if (monitor->priv->providers->len == 0) {
369 GST_OBJECT_UNLOCK (monitor);
370 GST_WARNING_OBJECT (monitor, "No providers match the current filters");
Arun Raghavan41a59cd2017-05-27 05:19:20 +0530371 return NULL;
Olivier Crête6d12b332014-06-26 17:13:12 -0400372 }
373
Olivier Crête448d1802013-01-08 21:30:44 -0500374again:
375
376 g_list_free_full (devices, gst_object_unref);
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200377 g_list_free_full (hidden, g_free);
Olivier Crête448d1802013-01-08 21:30:44 -0500378 devices = NULL;
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200379 hidden = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500380
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100381 cookie = monitor->priv->cookie;
Olivier Crête448d1802013-01-08 21:30:44 -0500382
Olivier Crête79921742014-06-26 14:28:09 -0400383 for (i = 0; i < monitor->priv->providers->len; i++) {
Olivier Crête448d1802013-01-08 21:30:44 -0500384 GList *tmpdev;
Olivier Crête79921742014-06-26 14:28:09 -0400385 GstDeviceProvider *provider =
386 gst_object_ref (g_ptr_array_index (monitor->priv->providers, i));
Olivier Crête448d1802013-01-08 21:30:44 -0500387 GList *item;
388
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200389 if (!is_provider_hidden (monitor, hidden, provider)) {
390 GST_OBJECT_UNLOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500391
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200392 tmpdev = gst_device_provider_get_devices (provider);
Olivier Crête448d1802013-01-08 21:30:44 -0500393
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200394 GST_OBJECT_LOCK (monitor);
395 update_hidden_providers_list (&hidden, provider);
396 } else {
397 tmpdev = NULL;
398 }
399
Olivier Crête6d12b332014-06-26 17:13:12 -0400400
Olivier Crête448d1802013-01-08 21:30:44 -0500401 for (item = tmpdev; item; item = item->next) {
402 GstDevice *dev = GST_DEVICE (item->data);
403 GstCaps *caps = gst_device_get_caps (dev);
Olivier Crête6d12b332014-06-26 17:13:12 -0400404 guint j;
Olivier Crête448d1802013-01-08 21:30:44 -0500405
Olivier Crête6d12b332014-06-26 17:13:12 -0400406 for (j = 0; j < monitor->priv->filters->len; j++) {
407 struct DeviceFilter *filter =
408 g_ptr_array_index (monitor->priv->filters, j);
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200409
Olivier Crête6d12b332014-06-26 17:13:12 -0400410 if (gst_caps_can_intersect (filter->caps, caps) &&
411 gst_device_has_classesv (dev, filter->classesv)) {
412 devices = g_list_prepend (devices, gst_object_ref (dev));
413 break;
414 }
415 }
Olivier Crête448d1802013-01-08 21:30:44 -0500416 gst_caps_unref (caps);
417 }
418
419 g_list_free_full (tmpdev, gst_object_unref);
Olivier Crête79921742014-06-26 14:28:09 -0400420 gst_object_unref (provider);
Olivier Crête448d1802013-01-08 21:30:44 -0500421
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100422 if (monitor->priv->cookie != cookie)
Olivier Crête448d1802013-01-08 21:30:44 -0500423 goto again;
424 }
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200425 g_list_free_full (hidden, g_free);
Olivier Crête448d1802013-01-08 21:30:44 -0500426
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100427 GST_OBJECT_UNLOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500428
Wim Taymans8caf9b72015-07-16 17:25:24 +0200429 return g_list_reverse (devices);
Olivier Crête448d1802013-01-08 21:30:44 -0500430}
431
432/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400433 * gst_device_monitor_start:
434 * @monitor: A #GstDeviceMonitor
Olivier Crête448d1802013-01-08 21:30:44 -0500435 *
436 * Starts monitoring the devices, one this has succeeded, the
Olivier Crête77db6bf2014-06-20 16:55:06 -0400437 * %GST_MESSAGE_DEVICE_ADDED and %GST_MESSAGE_DEVICE_REMOVED messages
438 * will be emitted on the bus when the list of devices changes.
Olivier Crête448d1802013-01-08 21:30:44 -0500439 *
440 * Returns: %TRUE if the device monitoring could be started
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100441 *
442 * Since: 1.4
Olivier Crête448d1802013-01-08 21:30:44 -0500443 */
444
445gboolean
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400446gst_device_monitor_start (GstDeviceMonitor * monitor)
Olivier Crête448d1802013-01-08 21:30:44 -0500447{
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200448 guint cookie, i;
449 GList *pending = NULL, *started = NULL, *removed = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500450
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400451 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE);
Olivier Crête448d1802013-01-08 21:30:44 -0500452
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100453 GST_OBJECT_LOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500454
Olivier Crête6d12b332014-06-26 17:13:12 -0400455 if (monitor->priv->filters->len == 0) {
456 GST_OBJECT_UNLOCK (monitor);
Tim-Philipp Müller0e0e78e2014-06-27 10:44:32 +0100457 GST_WARNING_OBJECT (monitor, "No filters have been set, will expose all "
458 "devices found");
459 gst_device_monitor_add_filter (monitor, NULL, NULL);
460 GST_OBJECT_LOCK (monitor);
Olivier Crête6d12b332014-06-26 17:13:12 -0400461 }
462
Olivier Crête79921742014-06-26 14:28:09 -0400463 if (monitor->priv->providers->len == 0) {
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100464 GST_OBJECT_UNLOCK (monitor);
Olivier Crête6d12b332014-06-26 17:13:12 -0400465 GST_WARNING_OBJECT (monitor, "No providers match the current filters");
Olivier Crête448d1802013-01-08 21:30:44 -0500466 return FALSE;
467 }
468
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100469 gst_bus_set_flushing (monitor->priv->bus, FALSE);
Olivier Crête448d1802013-01-08 21:30:44 -0500470
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200471again:
472 cookie = monitor->priv->cookie;
473
474 g_list_free_full (pending, gst_object_unref);
475 pending = NULL;
476 removed = started;
477 started = NULL;
478
Olivier Crête79921742014-06-26 14:28:09 -0400479 for (i = 0; i < monitor->priv->providers->len; i++) {
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200480 GstDeviceProvider *provider;
481 GList *find;
Olivier Crête448d1802013-01-08 21:30:44 -0500482
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200483 provider = g_ptr_array_index (monitor->priv->providers, i);
Olivier Crête448d1802013-01-08 21:30:44 -0500484
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200485 find = g_list_find (removed, provider);
486 if (find) {
487 /* this was already started, move to started list */
488 removed = g_list_remove_link (removed, find);
489 started = g_list_concat (started, find);
490 } else {
491 /* not started, add to pending list */
492 pending = g_list_append (pending, gst_object_ref (provider));
Olivier Crête448d1802013-01-08 21:30:44 -0500493 }
494 }
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200495 g_list_free_full (removed, gst_object_unref);
496 removed = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500497
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200498 while (pending) {
499 GstDeviceProvider *provider = pending->data;
500
501 if (gst_device_provider_can_monitor (provider)) {
502 GST_OBJECT_UNLOCK (monitor);
503
504 if (!gst_device_provider_start (provider))
505 goto start_failed;
506
507 GST_OBJECT_LOCK (monitor);
508 }
509 started = g_list_prepend (started, provider);
510 pending = g_list_delete_link (pending, pending);
511
512 if (monitor->priv->cookie != cookie)
513 goto again;
514 }
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100515 monitor->priv->started = TRUE;
516 GST_OBJECT_UNLOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500517
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200518 g_list_free_full (started, gst_object_unref);
519
Olivier Crête448d1802013-01-08 21:30:44 -0500520 return TRUE;
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200521
522start_failed:
523 {
524 GST_OBJECT_LOCK (monitor);
525 gst_bus_set_flushing (monitor->priv->bus, TRUE);
526 GST_OBJECT_UNLOCK (monitor);
527
528 while (started) {
529 GstDeviceProvider *provider = started->data;
530
531 gst_device_provider_stop (provider);
532 gst_object_unref (provider);
533
534 started = g_list_delete_link (started, started);
535 }
536 return FALSE;
537 }
Olivier Crête448d1802013-01-08 21:30:44 -0500538}
539
540/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400541 * gst_device_monitor_stop:
Olivier Crête79921742014-06-26 14:28:09 -0400542 * @monitor: A #GstDeviceProvider
Olivier Crête448d1802013-01-08 21:30:44 -0500543 *
544 * Stops monitoring the devices.
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100545 *
546 * Since: 1.4
Olivier Crête448d1802013-01-08 21:30:44 -0500547 */
Olivier Crête448d1802013-01-08 21:30:44 -0500548void
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400549gst_device_monitor_stop (GstDeviceMonitor * monitor)
Olivier Crête448d1802013-01-08 21:30:44 -0500550{
551 guint i;
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200552 GList *started = NULL;
Olivier Crête448d1802013-01-08 21:30:44 -0500553
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400554 g_return_if_fail (GST_IS_DEVICE_MONITOR (monitor));
Olivier Crête448d1802013-01-08 21:30:44 -0500555
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100556 gst_bus_set_flushing (monitor->priv->bus, TRUE);
Olivier Crête448d1802013-01-08 21:30:44 -0500557
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100558 GST_OBJECT_LOCK (monitor);
Olivier Crête6d12b332014-06-26 17:13:12 -0400559 for (i = 0; i < monitor->priv->providers->len; i++) {
560 GstDeviceProvider *provider =
561 g_ptr_array_index (monitor->priv->providers, i);
562
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200563 started = g_list_prepend (started, gst_object_ref (provider));
564 }
565 GST_OBJECT_UNLOCK (monitor);
566
567 while (started) {
568 GstDeviceProvider *provider = started->data;
569
Olivier Crête6d12b332014-06-26 17:13:12 -0400570 if (gst_device_provider_can_monitor (provider))
571 gst_device_provider_stop (provider);
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200572
573 started = g_list_delete_link (started, started);
574 gst_object_unref (provider);
Olivier Crête6d12b332014-06-26 17:13:12 -0400575 }
Wim Taymanseedd9cb2015-07-16 18:47:20 +0200576
577 GST_OBJECT_LOCK (monitor);
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100578 monitor->priv->started = FALSE;
579 GST_OBJECT_UNLOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500580
581}
582
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200583static void
584provider_hidden (GstDeviceProvider * provider, const gchar * hidden,
585 GstDeviceMonitor * monitor)
586{
587 GST_OBJECT_LOCK (monitor);
588 monitor->priv->hidden =
589 g_list_prepend (monitor->priv->hidden, g_strdup (hidden));
590 GST_OBJECT_UNLOCK (monitor);
591}
592
593static void
594provider_unhidden (GstDeviceProvider * provider, const gchar * hidden,
595 GstDeviceMonitor * monitor)
596{
597 GList *find;
598
599 GST_OBJECT_LOCK (monitor);
600 find =
601 g_list_find_custom (monitor->priv->hidden, hidden,
602 (GCompareFunc) g_strcmp0);
603 if (find) {
604 g_free (find->data);
605 monitor->priv->hidden = g_list_delete_link (monitor->priv->hidden, find);
606 }
607 GST_OBJECT_UNLOCK (monitor);
608}
609
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100610/**
Olivier Crête6d12b332014-06-26 17:13:12 -0400611 * gst_device_monitor_add_filter:
612 * @monitor: a device monitor
Evan Nemerson5abc82e2014-06-30 23:39:18 -0700613 * @classes: (allow-none): device classes to use as filter or %NULL for any class
Olivier Crête6d12b332014-06-26 17:13:12 -0400614 * @caps: (allow-none): the #GstCaps to filter or %NULL for ANY
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100615 *
Olivier Crête6d12b332014-06-26 17:13:12 -0400616 * Adds a filter for which #GstDevice will be monitored, any device that matches
Nirbheek Chauhan20c89fa2016-01-15 00:30:59 +0530617 * all these classes and the #GstCaps will be returned.
618 *
619 * If this function is called multiple times to add more filters, each will be
620 * matched independently. That is, adding more filters will not further restrict
621 * what devices are matched.
622 *
623 * The #GstCaps supported by the device as returned by gst_device_get_caps() are
624 * not intersected with caps filters added using this function.
Olivier Crête6d12b332014-06-26 17:13:12 -0400625 *
626 * Filters must be added before the #GstDeviceMonitor is started.
627 *
Nicolas Dufresne48700c72015-06-14 10:25:52 -0400628 * Returns: The id of the new filter or 0 if no provider matched the filter's
Olivier Crête6d12b332014-06-26 17:13:12 -0400629 * classes.
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100630 *
631 * Since: 1.4
632 */
Olivier Crête6d12b332014-06-26 17:13:12 -0400633guint
634gst_device_monitor_add_filter (GstDeviceMonitor * monitor,
635 const gchar * classes, GstCaps * caps)
Olivier Crête448d1802013-01-08 21:30:44 -0500636{
637 GList *factories = NULL;
Olivier Crête6d12b332014-06-26 17:13:12 -0400638 struct DeviceFilter *filter;
639 guint id = 0;
640 gboolean matched = FALSE;
Olivier Crête448d1802013-01-08 21:30:44 -0500641
Olivier Crête6d12b332014-06-26 17:13:12 -0400642 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), 0);
643 g_return_val_if_fail (!monitor->priv->started, 0);
Olivier Crête448d1802013-01-08 21:30:44 -0500644
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100645 GST_OBJECT_LOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500646
Olivier Crête6d12b332014-06-26 17:13:12 -0400647 filter = g_slice_new0 (struct DeviceFilter);
648 filter->id = monitor->priv->last_id++;
649 if (caps)
650 filter->caps = gst_caps_ref (caps);
651 else
652 filter->caps = gst_caps_new_any ();
653 if (classes)
654 filter->classesv = g_strsplit (classes, "/", 0);
Olivier Crête448d1802013-01-08 21:30:44 -0500655
Olivier Crête6d12b332014-06-26 17:13:12 -0400656 factories = gst_device_provider_factory_list_get_device_providers (1);
Olivier Crête448d1802013-01-08 21:30:44 -0500657
658 while (factories) {
Olivier Crête79921742014-06-26 14:28:09 -0400659 GstDeviceProviderFactory *factory = factories->data;
Olivier Crête448d1802013-01-08 21:30:44 -0500660
Olivier Crête6d12b332014-06-26 17:13:12 -0400661 if (gst_device_provider_factory_has_classesv (factory, filter->classesv)) {
662 GstDeviceProvider *provider;
Olivier Crête448d1802013-01-08 21:30:44 -0500663
Olivier Crête6d12b332014-06-26 17:13:12 -0400664 provider = gst_device_provider_factory_get (factory);
665
666 if (provider) {
667 guint i;
668
669 for (i = 0; i < monitor->priv->providers->len; i++) {
670 if (g_ptr_array_index (monitor->priv->providers, i) == provider) {
671 gst_object_unref (provider);
672 provider = NULL;
673 matched = TRUE;
674 break;
675 }
676 }
677 }
678
679 if (provider) {
680 GstBus *bus = gst_device_provider_get_bus (provider);
681
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200682 update_hidden_providers_list (&monitor->priv->hidden, provider);
683 g_signal_connect (provider, "provider-hidden",
684 (GCallback) provider_hidden, monitor);
685 g_signal_connect (provider, "provider-unhidden",
686 (GCallback) provider_unhidden, monitor);
687
Olivier Crête6d12b332014-06-26 17:13:12 -0400688 matched = TRUE;
689 gst_bus_enable_sync_message_emission (bus);
690 g_signal_connect (bus, "sync-message",
691 G_CALLBACK (bus_sync_message), monitor);
692 gst_object_unref (bus);
693 g_ptr_array_add (monitor->priv->providers, provider);
694 monitor->priv->cookie++;
695 }
Olivier Crête448d1802013-01-08 21:30:44 -0500696 }
697
Olivier Crête6d12b332014-06-26 17:13:12 -0400698 factories = g_list_remove (factories, factory);
Olivier Crête448d1802013-01-08 21:30:44 -0500699 gst_object_unref (factory);
700 }
701
Olivier Crête6d12b332014-06-26 17:13:12 -0400702 /* Ensure there is no leak here */
703 g_assert (factories == NULL);
704
Nirbheek Chauhan4d6c7cc2016-01-15 00:25:05 +0530705 if (matched)
Olivier Crête6d12b332014-06-26 17:13:12 -0400706 id = filter->id;
Nirbheek Chauhan4d6c7cc2016-01-15 00:25:05 +0530707 g_ptr_array_add (monitor->priv->filters, filter);
Olivier Crête6d12b332014-06-26 17:13:12 -0400708
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100709 GST_OBJECT_UNLOCK (monitor);
Olivier Crête6d12b332014-06-26 17:13:12 -0400710
711 return id;
Olivier Crête448d1802013-01-08 21:30:44 -0500712}
713
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100714/**
Olivier Crête6d12b332014-06-26 17:13:12 -0400715 * gst_device_monitor_remove_filter:
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400716 * @monitor: a device monitor
Olivier Crête6d12b332014-06-26 17:13:12 -0400717 * @filter_id: the id of the filter
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100718 *
Olivier Crête6d12b332014-06-26 17:13:12 -0400719 * Removes a filter from the #GstDeviceMonitor using the id that was returned
720 * by gst_device_monitor_add_filter().
Olivier Crête77db6bf2014-06-20 16:55:06 -0400721 *
Olivier Crête6d12b332014-06-26 17:13:12 -0400722 * Returns: %TRUE of the filter id was valid, %FALSE otherwise
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100723 *
724 * Since: 1.4
725 */
Olivier Crête6d12b332014-06-26 17:13:12 -0400726gboolean
727gst_device_monitor_remove_filter (GstDeviceMonitor * monitor, guint filter_id)
Olivier Crête448d1802013-01-08 21:30:44 -0500728{
Olivier Crête6d12b332014-06-26 17:13:12 -0400729 guint i, j;
730 gboolean removed = FALSE;
Olivier Crête448d1802013-01-08 21:30:44 -0500731
Olivier Crête6d12b332014-06-26 17:13:12 -0400732 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE);
733 g_return_val_if_fail (!monitor->priv->started, FALSE);
734 g_return_val_if_fail (filter_id > 0, FALSE);
Olivier Crête448d1802013-01-08 21:30:44 -0500735
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100736 GST_OBJECT_LOCK (monitor);
Olivier Crête6d12b332014-06-26 17:13:12 -0400737 for (i = 0; i < monitor->priv->filters->len; i++) {
738 struct DeviceFilter *filter = g_ptr_array_index (monitor->priv->filters, i);
739
740 if (filter->id == filter_id) {
741 g_ptr_array_remove_index (monitor->priv->filters, i);
742 removed = TRUE;
743 break;
744 }
745 }
746
747 if (removed) {
748 for (i = 0; i < monitor->priv->providers->len; i++) {
749 GstDeviceProvider *provider =
750 g_ptr_array_index (monitor->priv->providers, i);
751 GstDeviceProviderFactory *factory =
752 gst_device_provider_get_factory (provider);
753 gboolean valid = FALSE;
754
755 for (j = 0; j < monitor->priv->filters->len; j++) {
756 struct DeviceFilter *filter =
757 g_ptr_array_index (monitor->priv->filters, j);
758
759 if (gst_device_provider_factory_has_classesv (factory,
760 filter->classesv)) {
761 valid = TRUE;
762 break;
763 }
764 }
765
766 if (!valid) {
767 monitor->priv->cookie++;
768 gst_device_monitor_remove (monitor, i);
769 i--;
770 }
771 }
772 }
773
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100774 GST_OBJECT_UNLOCK (monitor);
Olivier Crête448d1802013-01-08 21:30:44 -0500775
Olivier Crête6d12b332014-06-26 17:13:12 -0400776 return removed;
Olivier Crête448d1802013-01-08 21:30:44 -0500777}
778
Olivier Crête6d12b332014-06-26 17:13:12 -0400779
780
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100781/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400782 * gst_device_monitor_new:
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100783 *
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400784 * Create a new #GstDeviceMonitor
Olivier Crête77db6bf2014-06-20 16:55:06 -0400785 *
Sebastian Drögef119e932017-05-15 18:58:38 +0300786 * Returns: (transfer full): a new device monitor.
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100787 *
788 * Since: 1.4
789 */
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400790GstDeviceMonitor *
791gst_device_monitor_new (void)
Olivier Crête448d1802013-01-08 21:30:44 -0500792{
Sebastian Drögef119e932017-05-15 18:58:38 +0300793 GstDeviceMonitor *monitor;
794
795 monitor = g_object_new (GST_TYPE_DEVICE_MONITOR, NULL);
796
797 /* Clear floating flag */
798 gst_object_ref_sink (monitor);
799
800 return monitor;
Olivier Crête448d1802013-01-08 21:30:44 -0500801}
802
803/**
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400804 * gst_device_monitor_get_bus:
Olivier Crête79921742014-06-26 14:28:09 -0400805 * @monitor: a #GstDeviceProvider
Olivier Crête448d1802013-01-08 21:30:44 -0500806 *
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400807 * Gets the #GstBus of this #GstDeviceMonitor
Olivier Crête448d1802013-01-08 21:30:44 -0500808 *
809 * Returns: (transfer full): a #GstBus
Tim-Philipp Müllerbd26fa72014-06-14 16:30:49 +0100810 *
811 * Since: 1.4
Olivier Crête448d1802013-01-08 21:30:44 -0500812 */
813GstBus *
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400814gst_device_monitor_get_bus (GstDeviceMonitor * monitor)
Olivier Crête448d1802013-01-08 21:30:44 -0500815{
Olivier Crêtec2583ca2014-06-26 15:08:46 -0400816 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
Olivier Crête448d1802013-01-08 21:30:44 -0500817
818 return gst_object_ref (monitor->priv->bus);
819}
Wim Taymans62f62072015-07-17 10:18:02 +0200820
821/**
822 * gst_device_monitor_get_providers:
823 * @monitor: a #GstDeviceMonitor
824 *
825 * Get a list of the currently selected device provider factories.
826 *
827 * This
828 *
829 * Returns: (transfer full) (array zero-terminated=1) (element-type gchar*):
830 * A list of device provider factory names that are currently being
831 * monitored by @monitor or %NULL when nothing is being monitored.
832 *
833 * Since: 1.6
834 */
835gchar **
836gst_device_monitor_get_providers (GstDeviceMonitor * monitor)
837{
838 guint i, len;
839 gchar **res = NULL;
840
841 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL);
842
843 GST_OBJECT_LOCK (monitor);
844 len = monitor->priv->providers->len;
845 if (len == 0)
846 goto done;
847
848 res = g_new (gchar *, len + 1);
849
850 for (i = 0; i < len; i++) {
851 GstDeviceProvider *provider =
852 g_ptr_array_index (monitor->priv->providers, i);
853 GstDeviceProviderFactory *factory =
854 gst_device_provider_get_factory (provider);
855
856 res[i] = g_strdup (GST_OBJECT_NAME (factory));
857 }
858 res[i] = NULL;
859
860done:
861 GST_OBJECT_UNLOCK (monitor);
862
863 return res;
864}
Wim Taymans5a7b7e62015-07-16 18:56:00 +0200865
866/**
867 * gst_device_monitor_set_show_all_devices:
868 * @monitor: a #GstDeviceMonitor
869 * @show_all: show all devices
870 *
871 * Set if all devices should be visible, even those devices from hidden
872 * providers. Setting @show_all to true might show some devices multiple times.
873 *
874 * Since: 1.6
875 */
876void
877gst_device_monitor_set_show_all_devices (GstDeviceMonitor * monitor,
878 gboolean show_all)
879{
880 g_return_if_fail (GST_IS_DEVICE_MONITOR (monitor));
881
882 GST_OBJECT_LOCK (monitor);
883 monitor->priv->show_all = show_all;
884 GST_OBJECT_UNLOCK (monitor);
885}
886
887/**
888 * gst_device_monitor_get_show_all_devices:
889 * @monitor: a #GstDeviceMonitor
890 *
891 * Get if @monitor is curretly showing all devices, even those from hidden
892 * providers.
893 *
894 * Returns: %TRUE when all devices will be shown.
895 *
896 * Since: 1.6
897 */
898gboolean
899gst_device_monitor_get_show_all_devices (GstDeviceMonitor * monitor)
900{
901 gboolean res;
902
903 g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE);
904
905 GST_OBJECT_LOCK (monitor);
906 res = monitor->priv->show_all;
907 GST_OBJECT_UNLOCK (monitor);
908
909 return res;
910}