diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2014-06-26 14:28:09 -0400 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2014-06-26 14:45:30 -0400 |
commit | 7992174a1a367c2f3cf3bc53fc1bd76fd8a365d0 (patch) | |
tree | 4a58fd47fda6fe8c082ac3ef0f46866256b1b0b4 | |
parent | 4720e6d0e0327fe5e8cf83e03a00e57540b6c943 (diff) |
DeviceProvider: Rename from DeviceMonitor
-rw-r--r-- | docs/gst/gstreamer-docs.sgml | 6 | ||||
-rw-r--r-- | docs/gst/gstreamer-sections.txt | 94 | ||||
-rw-r--r-- | docs/plugins/gstreamer-plugins.hierarchy | 2 | ||||
-rw-r--r-- | gst/Makefile.am | 8 | ||||
-rw-r--r-- | gst/gst.h | 2 | ||||
-rw-r--r-- | gst/gst_private.h | 10 | ||||
-rw-r--r-- | gst/gstdevice.c | 6 | ||||
-rw-r--r-- | gst/gstdevicemonitor.c | 587 | ||||
-rw-r--r-- | gst/gstdevicemonitorfactory.h | 90 | ||||
-rw-r--r-- | gst/gstdeviceprovider.c | 591 | ||||
-rw-r--r-- | gst/gstdeviceprovider.h (renamed from gst/gstdevicemonitor.h) | 86 | ||||
-rw-r--r-- | gst/gstdeviceproviderfactory.c (renamed from gst/gstdevicemonitorfactory.c) | 285 | ||||
-rw-r--r-- | gst/gstdeviceproviderfactory.h | 90 | ||||
-rw-r--r-- | gst/gstglobaldevicemonitor.c | 97 | ||||
-rw-r--r-- | gst/gstglobaldevicemonitor.h | 4 | ||||
-rw-r--r-- | gst/gstmessage.c | 8 | ||||
-rw-r--r-- | gst/gstmessage.h | 4 | ||||
-rw-r--r-- | gst/gstregistry.c | 22 | ||||
-rw-r--r-- | gst/gstregistrybinary.c | 4 | ||||
-rw-r--r-- | gst/gstregistrychunks.c | 20 | ||||
-rw-r--r-- | gst/gstregistrychunks.h | 8 | ||||
-rw-r--r-- | tools/gst-inspect.c | 16 | ||||
-rw-r--r-- | win32/common/libgstreamer.def | 50 |
23 files changed, 1048 insertions, 1042 deletions
diff --git a/docs/gst/gstreamer-docs.sgml b/docs/gst/gstreamer-docs.sgml index c3b38fbaa..e73ac6ed8 100644 --- a/docs/gst/gstreamer-docs.sgml +++ b/docs/gst/gstreamer-docs.sgml @@ -117,10 +117,10 @@ Windows. It is released under the GNU Library General Public License <chapter id="gstreamer-device-probing"> <title>GStreamer Device Discovery and Device Probing</title> - <xi:include href="xml/gstdevice.xml" /> - <xi:include href="xml/gstdevicemonitor.xml" /> - <xi:include href="xml/gstdevicemonitorfactory.xml" /> <xi:include href="xml/gstglobaldevicemonitor.xml" /> + <xi:include href="xml/gstdevice.xml" /> + <xi:include href="xml/gstdeviceprovider.xml" /> + <xi:include href="xml/gstdeviceproviderfactory.xml" /> </chapter> <chapter id="gstreamer-support"> diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 60f84feea..f471c3f99 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -3353,61 +3353,61 @@ gst_device_get_type </SECTION> <SECTION> -<FILE>gstdevicemonitor</FILE> -<TITLE>GstDeviceMonitor</TITLE> -GstDeviceMonitor -GstDeviceMonitorClass -gst_device_monitor_can_monitor -gst_device_monitor_class_add_metadata -gst_device_monitor_class_add_static_metadata -gst_device_monitor_class_get_metadata -gst_device_monitor_class_set_metadata -gst_device_monitor_class_set_static_metadata -gst_device_monitor_device_add -gst_device_monitor_device_remove -gst_device_monitor_get_bus -gst_device_monitor_get_devices -gst_device_monitor_get_factory -gst_device_monitor_register -gst_device_monitor_start -gst_device_monitor_stop +<FILE>gstdeviceprovider</FILE> +<TITLE>GstDeviceProvider</TITLE> +GstDeviceProvider +GstDeviceProviderClass +gst_device_provider_can_monitor +gst_device_provider_class_add_metadata +gst_device_provider_class_add_static_metadata +gst_device_provider_class_get_metadata +gst_device_provider_class_set_metadata +gst_device_provider_class_set_static_metadata +gst_device_provider_device_add +gst_device_provider_device_remove +gst_device_provider_get_bus +gst_device_provider_get_devices +gst_device_provider_get_factory +gst_device_provider_register +gst_device_provider_start +gst_device_provider_stop <SUBSECTION Standard> GstDevicePrivate -GST_DEVICE_MONITOR -GST_DEVICE_MONITOR_CAST -GST_DEVICE_MONITOR_CLASS -GST_DEVICE_MONITOR_GET_CLASS -GST_IS_DEVICE_MONITOR -GST_IS_DEVICE_MONITOR_CLASS -GST_TYPE_DEVICE_MONITOR -gst_device_monitor_get_type +GST_DEVICE_PROVIDER +GST_DEVICE_PROVIDER_CAST +GST_DEVICE_PROVIDER_CLASS +GST_DEVICE_PROVIDER_GET_CLASS +GST_IS_DEVICE_PROVIDER +GST_IS_DEVICE_PROVIDER_CLASS +GST_TYPE_DEVICE_PROVIDER +gst_device_provider_get_type </SECTION> <SECTION> -<FILE>gstdevicemonitorfactory</FILE> -<TITLE>GstDeviceMonitorFactory</TITLE> -GstDeviceMonitorFactory -GstDeviceMonitorFactoryClass -gst_device_monitor_factory_find -gst_device_monitor_factory_get -gst_device_monitor_factory_get_by_name -gst_device_monitor_factory_get_device_monitor_type -gst_device_monitor_factory_get_metadata -gst_device_monitor_factory_get_metadata_keys -gst_device_monitor_factory_has_classes -gst_device_monitor_factory_has_classesv -gst_device_monitor_factory_list_get_device_monitors +<FILE>gstdeviceproviderfactory</FILE> +<TITLE>GstDeviceProviderFactory</TITLE> +GstDeviceProviderFactory +GstDeviceProviderFactoryClass +gst_device_provider_factory_find +gst_device_provider_factory_get +gst_device_provider_factory_get_by_name +gst_device_provider_factory_get_device_provider_type +gst_device_provider_factory_get_metadata +gst_device_provider_factory_get_metadata_keys +gst_device_provider_factory_has_classes +gst_device_provider_factory_has_classesv +gst_device_provider_factory_list_get_device_providers <SUBSECTION Standard> -GstDeviceMonitorPrivate -GST_DEVICE_MONITOR_FACTORY -GST_DEVICE_MONITOR_FACTORY_CAST -GST_DEVICE_MONITOR_FACTORY_CLASS -GST_TYPE_DEVICE_MONITOR_FACTORY -GST_IS_DEVICE_MONITOR_FACTORY -GST_IS_DEVICE_MONITOR_FACTORY_CLASS -gst_device_monitor_factory_get_type +GstDeviceProviderPrivate +GST_DEVICE_PROVIDER_FACTORY +GST_DEVICE_PROVIDER_FACTORY_CAST +GST_DEVICE_PROVIDER_FACTORY_CLASS +GST_TYPE_DEVICE_PROVIDER_FACTORY +GST_IS_DEVICE_PROVIDER_FACTORY +GST_IS_DEVICE_PROVIDER_FACTORY_CLASS +gst_device_provider_factory_get_type </SECTION> <SECTION> diff --git a/docs/plugins/gstreamer-plugins.hierarchy b/docs/plugins/gstreamer-plugins.hierarchy index 9195eb1c8..c65606ea0 100644 --- a/docs/plugins/gstreamer-plugins.hierarchy +++ b/docs/plugins/gstreamer-plugins.hierarchy @@ -36,7 +36,7 @@ GObject GstPadTemplate GstPlugin GstPluginFeature - GstDeviceMonitorFactory + GstDeviceProviderFactory GstElementFactory GstTypeFindFactory GstRegistry diff --git a/gst/Makefile.am b/gst/Makefile.am index 86d226e12..ffab2339f 100644 --- a/gst/Makefile.am +++ b/gst/Makefile.am @@ -72,8 +72,8 @@ libgstreamer_@GST_API_VERSION@_la_SOURCES = \ gstdatetime.c \ gstdebugutils.c \ gstdevice.c \ - gstdevicemonitor.c \ - gstdevicemonitorfactory.c \ + gstdeviceprovider.c \ + gstdeviceproviderfactory.c \ gstelement.c \ gstelementfactory.c \ gsterror.c \ @@ -177,8 +177,8 @@ gst_headers = \ gstelement.h \ gstelementmetadata.h \ gstdevice.h \ - gstdevicemonitor.h \ - gstdevicemonitorfactory.h \ + gstdeviceprovider.h \ + gstdeviceproviderfactory.h \ gstelementfactory.h \ gsterror.h \ gstevent.h \ @@ -43,7 +43,7 @@ #include <gst/gstdatetime.h> #include <gst/gstdebugutils.h> #include <gst/gstdevice.h> -#include <gst/gstdevicemonitor.h> +#include <gst/gstdeviceprovider.h> #include <gst/gstelement.h> #include <gst/gstelementmetadata.h> #include <gst/gsterror.h> diff --git a/gst/gst_private.h b/gst/gst_private.h index e85d5c5f9..b25707ce1 100644 --- a/gst/gst_private.h +++ b/gst/gst_private.h @@ -54,8 +54,8 @@ extern const char g_log_domain_gstreamer[]; /* for GstElement */ #include "gstelement.h" -/* for GstDeviceMonitor */ -#include "gstdevicemonitor.h" +/* for GstDeviceProvider */ +#include "gstdeviceprovider.h" /* for GstToc */ #include "gsttoc.h" @@ -399,19 +399,19 @@ struct _GstElementFactoryClass { gpointer _gst_reserved[GST_PADDING]; }; -struct _GstDeviceMonitorFactory { +struct _GstDeviceProviderFactory { GstPluginFeature feature; /* <private> */ GType type; /* unique GType the device factory or 0 if not loaded */ - volatile GstDeviceMonitor *monitor; + volatile GstDeviceProvider *provider; gpointer metadata; gpointer _gst_reserved[GST_PADDING]; }; -struct _GstDeviceMonitorFactoryClass { +struct _GstDeviceProviderFactoryClass { GstPluginFeatureClass parent; /* <private> */ diff --git a/gst/gstdevice.c b/gst/gstdevice.c index 9119ba90b..9982509cb 100644 --- a/gst/gstdevice.c +++ b/gst/gstdevice.c @@ -22,13 +22,13 @@ /** * SECTION:gstdevice * @short_description: Object representing a device - * @see_also: #GstDeviceMonitor + * @see_also: #GstDeviceProvider * * #GstDevice are objects representing a device, they contain * relevant metadata about the device, such as its class and the #GstCaps * representing the media types it can produce or handle. * - * #GstDevice are created by #GstDeviceMonitor objects which can be + * #GstDevice are created by #GstDeviceProvider objects which can be * aggregated by #GstGlobalDeviceMonitor objects. * * Since: 1.4 @@ -239,7 +239,7 @@ gst_device_get_display_name (GstDevice * device) * * Gets the "class" of a device. This is a "/" separated list of * classes that represent this device. They are a subset of the - * classes of the #GstDeviceMonitor that produced this device. + * classes of the #GstDeviceProvider that produced this device. * * Returns: The device class. Free with g_free() after use. * diff --git a/gst/gstdevicemonitor.c b/gst/gstdevicemonitor.c deleted file mode 100644 index 6fabe1190..000000000 --- a/gst/gstdevicemonitor.c +++ /dev/null @@ -1,587 +0,0 @@ -/* GStreamer - * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com> - * - * gstdevicemonitor.c: Device probing and monitoring - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:gstdevicemonitor - * @short_description: A device monitor and prober - * @see_also: #GstDevice, #GstGlobalDeviceMonitor - * - * A #GstDeviceMonitor subclass is provided by a plugin that handles devices - * if there is a way to programatically list connected devices. It can also - * optionally provide updates to the list of connected devices. - * - * Each #GstDeviceMonitor subclass is a singleton, a plugin should - * normally provide a single subclass for all devices. - * - * Applications would normally use a #GstGlobalDeviceMonitor to monitor devices - * from all revelant monitors. - * - * Since: 1.4 - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gst_private.h" - -#include "gstdevicemonitor.h" - -#include "gstelementmetadata.h" -#include "gstquark.h" - -struct _GstDeviceMonitorPrivate -{ - GstBus *bus; - - GMutex start_lock; - - gboolean started_count; -}; - -/* this is used in gstelementfactory.c:gst_element_register() */ -GQuark __gst_devicemonitorclass_factory = 0; - -static void gst_device_monitor_class_init (GstDeviceMonitorClass * klass); -static void gst_device_monitor_init (GstDeviceMonitor * element); -static void gst_device_monitor_base_class_init (gpointer g_class); -static void gst_device_monitor_base_class_finalize (gpointer g_class); -static void gst_device_monitor_dispose (GObject * object); -static void gst_device_monitor_finalize (GObject * object); - -static gpointer gst_device_monitor_parent_class = NULL; - -GType -gst_device_monitor_get_type (void) -{ - static volatile gsize gst_device_monitor_type = 0; - - if (g_once_init_enter (&gst_device_monitor_type)) { - GType _type; - static const GTypeInfo element_info = { - sizeof (GstDeviceMonitorClass), - gst_device_monitor_base_class_init, - gst_device_monitor_base_class_finalize, - (GClassInitFunc) gst_device_monitor_class_init, - NULL, - NULL, - sizeof (GstDeviceMonitor), - 0, - (GInstanceInitFunc) gst_device_monitor_init, - NULL - }; - - _type = g_type_register_static (GST_TYPE_OBJECT, "GstDeviceMonitor", - &element_info, G_TYPE_FLAG_ABSTRACT); - - __gst_devicemonitorclass_factory = - g_quark_from_static_string ("GST_DEVICEMONITORCLASS_FACTORY"); - g_once_init_leave (&gst_device_monitor_type, _type); - } - return gst_device_monitor_type; -} - -static void -gst_device_monitor_base_class_init (gpointer g_class) -{ - GstDeviceMonitorClass *klass = GST_DEVICE_MONITOR_CLASS (g_class); - - /* Copy the element details here so elements can inherit the - * details from their base class and classes only need to set - * the details in class_init instead of base_init */ - klass->metadata = - klass->metadata ? gst_structure_copy (klass->metadata) : - gst_structure_new_empty ("metadata"); - - klass->factory = g_type_get_qdata (G_TYPE_FROM_CLASS (klass), - __gst_devicemonitorclass_factory); -} - -static void -gst_device_monitor_base_class_finalize (gpointer g_class) -{ - GstDeviceMonitorClass *klass = GST_DEVICE_MONITOR_CLASS (g_class); - - gst_structure_free (klass->metadata); -} - -static void -gst_device_monitor_class_init (GstDeviceMonitorClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - - gst_device_monitor_parent_class = g_type_class_peek_parent (klass); - - g_type_class_add_private (klass, sizeof (GstDeviceMonitorPrivate)); - - gobject_class->dispose = gst_device_monitor_dispose; - gobject_class->finalize = gst_device_monitor_finalize; -} - -static void -gst_device_monitor_init (GstDeviceMonitor * monitor) -{ - monitor->priv = G_TYPE_INSTANCE_GET_PRIVATE (monitor, - GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorPrivate); - - g_mutex_init (&monitor->priv->start_lock); - - monitor->priv->bus = gst_bus_new (); - gst_bus_set_flushing (monitor->priv->bus, TRUE); -} - - -static void -gst_device_monitor_dispose (GObject * object) -{ - GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object); - - gst_object_replace ((GstObject **) & monitor->priv->bus, NULL); - - GST_OBJECT_LOCK (monitor); - g_list_free_full (monitor->devices, (GDestroyNotify) gst_object_unparent); - monitor->devices = NULL; - GST_OBJECT_UNLOCK (monitor); - - G_OBJECT_CLASS (gst_device_monitor_parent_class)->dispose (object); -} - -static void -gst_device_monitor_finalize (GObject * object) -{ - GstDeviceMonitor *monitor = GST_DEVICE_MONITOR (object); - - g_mutex_clear (&monitor->priv->start_lock); - - G_OBJECT_CLASS (gst_device_monitor_parent_class)->finalize (object); -} - -/** - * gst_device_monitor_class_add_metadata: - * @klass: class to set metadata for - * @key: the key to set - * @value: the value to set - * - * Set @key with @value as metadata in @klass. - */ -void -gst_device_monitor_class_add_metadata (GstDeviceMonitorClass * klass, - const gchar * key, const gchar * value) -{ - g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass)); - g_return_if_fail (key != NULL); - g_return_if_fail (value != NULL); - - gst_structure_set ((GstStructure *) klass->metadata, - key, G_TYPE_STRING, value, NULL); -} - -/** - * gst_device_monitor_class_add_static_metadata: - * @klass: class to set metadata for - * @key: the key to set - * @value: the value to set - * - * Set @key with @value as metadata in @klass. - * - * Same as gst_device_monitor_class_add_metadata(), but @value must be a static string - * or an inlined string, as it will not be copied. (GStreamer plugins will - * be made resident once loaded, so this function can be used even from - * dynamically loaded plugins.) - * - * Since: 1.4 - */ -void -gst_device_monitor_class_add_static_metadata (GstDeviceMonitorClass * klass, - const gchar * key, const gchar * value) -{ - GValue val = G_VALUE_INIT; - - g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass)); - g_return_if_fail (key != NULL); - g_return_if_fail (value != NULL); - - g_value_init (&val, G_TYPE_STRING); - g_value_set_static_string (&val, value); - gst_structure_take_value ((GstStructure *) klass->metadata, key, &val); -} - -/** - * gst_device_monitor_class_set_metadata: - * @klass: class to set metadata for - * @longname: The long English name of the device monitor. E.g. "File Sink" - * @classification: String describing the type of device monitor, as an unordered list - * separated with slashes ('/'). See draft-klass.txt of the design docs - * for more details and common types. E.g: "Sink/File" - * @description: Sentence describing the purpose of the device monitor. - * E.g: "Write stream to a file" - * @author: Name and contact details of the author(s). Use \n to separate - * multiple author metadata. E.g: "Joe Bloggs <joe.blogs at foo.com>" - * - * Sets the detailed information for a #GstDeviceMonitorClass. - * <note>This function is for use in _class_init functions only.</note> - * - * Since: 1.4 - */ -void -gst_device_monitor_class_set_metadata (GstDeviceMonitorClass * klass, - const gchar * longname, const gchar * classification, - const gchar * description, const gchar * author) -{ - g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass)); - g_return_if_fail (longname != NULL && *longname != '\0'); - g_return_if_fail (classification != NULL && *classification != '\0'); - g_return_if_fail (description != NULL && *description != '\0'); - g_return_if_fail (author != NULL && *author != '\0'); - - gst_structure_id_set ((GstStructure *) klass->metadata, - GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname, - GST_QUARK (ELEMENT_METADATA_KLASS), G_TYPE_STRING, classification, - GST_QUARK (ELEMENT_METADATA_DESCRIPTION), G_TYPE_STRING, description, - GST_QUARK (ELEMENT_METADATA_AUTHOR), G_TYPE_STRING, author, NULL); -} - -/** - * gst_device_monitor_class_set_static_metadata: - * @klass: class to set metadata for - * @longname: The long English name of the element. E.g. "File Sink" - * @classification: String describing the type of element, as an unordered list - * separated with slashes ('/'). See draft-klass.txt of the design docs - * for more details and common types. E.g: "Sink/File" - * @description: Sentence describing the purpose of the element. - * E.g: "Write stream to a file" - * @author: Name and contact details of the author(s). Use \n to separate - * multiple author metadata. E.g: "Joe Bloggs <joe.blogs at foo.com>" - * - * Sets the detailed information for a #GstDeviceMonitorClass. - * <note>This function is for use in _class_init functions only.</note> - * - * Same as gst_device_monitor_class_set_metadata(), but @longname, @classification, - * @description, and @author must be static strings or inlined strings, as - * they will not be copied. (GStreamer plugins will be made resident once - * loaded, so this function can be used even from dynamically loaded plugins.) - * - * Since: 1.4 - */ -void -gst_device_monitor_class_set_static_metadata (GstDeviceMonitorClass * klass, - const gchar * longname, const gchar * classification, - const gchar * description, const gchar * author) -{ - GstStructure *s = (GstStructure *) klass->metadata; - GValue val = G_VALUE_INIT; - - g_return_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass)); - g_return_if_fail (longname != NULL && *longname != '\0'); - g_return_if_fail (classification != NULL && *classification != '\0'); - g_return_if_fail (description != NULL && *description != '\0'); - g_return_if_fail (author != NULL && *author != '\0'); - - g_value_init (&val, G_TYPE_STRING); - - g_value_set_static_string (&val, longname); - gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_LONGNAME), &val); - - g_value_set_static_string (&val, classification); - gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_KLASS), &val); - - g_value_set_static_string (&val, description); - gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_DESCRIPTION), - &val); - - g_value_set_static_string (&val, author); - gst_structure_id_take_value (s, GST_QUARK (ELEMENT_METADATA_AUTHOR), &val); -} - -/** - * gst_device_monitor_class_get_metadata: - * @klass: class to get metadata for - * @key: the key to get - * - * Get metadata with @key in @klass. - * - * Returns: the metadata for @key. - * - * Since: 1.4 - */ -const gchar * -gst_device_monitor_class_get_metadata (GstDeviceMonitorClass * klass, - const gchar * key) -{ - g_return_val_if_fail (GST_IS_DEVICE_MONITOR_CLASS (klass), NULL); - g_return_val_if_fail (key != NULL, NULL); - - return gst_structure_get_string ((GstStructure *) klass->metadata, key); -} - -/** - * gst_device_monitor_get_devices: - * @monitor: A #GstDeviceMonitor - * - * Gets a list of devices that this monitor understands. This may actually - * probe the hardware if the monitor is not currently started. - * - * Returns: (transfer full) (element-type GstDevice): a #GList of - * #GstDevice - * - * Since: 1.4 - */ - -GList * -gst_device_monitor_get_devices (GstDeviceMonitor * monitor) -{ - GstDeviceMonitorClass *klass; - GList *devices = NULL; - gboolean started; - GList *item; - - g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL); - klass = GST_DEVICE_MONITOR_GET_CLASS (monitor); - - g_mutex_lock (&monitor->priv->start_lock); - started = (monitor->priv->started_count > 0); - - if (started) { - GST_OBJECT_LOCK (monitor); - for (item = monitor->devices; item; item = item->next) - devices = g_list_prepend (devices, gst_object_ref (item->data)); - GST_OBJECT_UNLOCK (monitor); - } else if (klass->probe) - devices = klass->probe (monitor); - - g_mutex_unlock (&monitor->priv->start_lock); - - return devices; -} - -/** - * gst_device_monitor_start: - * @monitor: A #GstDeviceMonitor - * - * Starts monitoring the devices. This will cause #GST_MESSAGE_DEVICE messages - * to be posted on the monitor's bus when devices are added or removed from - * the system. - * - * Since the #GstDeviceMonitor is a singleton, - * gst_device_monitor_start() may already have been called by another - * user of the object, gst_device_monitor_stop() needs to be called the same - * number of times. - * - * Returns: %TRUE if the device monitoring could be started - * - * Since: 1.4 - */ - -gboolean -gst_device_monitor_start (GstDeviceMonitor * monitor) -{ - GstDeviceMonitorClass *klass; - gboolean ret = FALSE; - - g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE); - klass = GST_DEVICE_MONITOR_GET_CLASS (monitor); - - g_mutex_lock (&monitor->priv->start_lock); - - if (monitor->priv->started_count > 0) { - ret = TRUE; - goto started; - } - - if (klass->start) - ret = klass->start (monitor); - - if (ret) { - monitor->priv->started_count++; - gst_bus_set_flushing (monitor->priv->bus, FALSE); - } - -started: - - g_mutex_unlock (&monitor->priv->start_lock); - - return ret; -} - -/** - * gst_device_monitor_stop: - * @monitor: A #GstDeviceMonitor - * - * Decreases the use-count by one. If the use count reaches zero, this - * #GstDeviceMonitor will stop monitoring the devices. This needs to be - * called the same number of times that gst_device_monitor_start() was called. - * - * Since: 1.4 - */ - -void -gst_device_monitor_stop (GstDeviceMonitor * monitor) -{ - GstDeviceMonitorClass *klass; - - g_return_if_fail (GST_IS_DEVICE_MONITOR (monitor)); - klass = GST_DEVICE_MONITOR_GET_CLASS (monitor); - - g_mutex_lock (&monitor->priv->start_lock); - - if (monitor->priv->started_count == 1) { - gst_bus_set_flushing (monitor->priv->bus, TRUE); - if (klass->stop) - klass->stop (monitor); - GST_OBJECT_LOCK (monitor); - g_list_free_full (monitor->devices, (GDestroyNotify) gst_object_unparent); - monitor->devices = NULL; - GST_OBJECT_UNLOCK (monitor); - } else if (monitor->priv->started_count < 1) { - g_critical ("Trying to stop a GstDeviceMonitor %s which is already stopped", - GST_OBJECT_NAME (monitor)); - } - - monitor->priv->started_count--; - g_mutex_unlock (&monitor->priv->start_lock); -} - - -/** - * gst_device_monitor_get_factory: - * @monitor: a #GstDeviceMonitor to request the device monitor factory of. - * - * Retrieves the factory that was used to create this device monitor. - * - * Returns: (transfer none): the #GstDeviceMonitorFactory used for creating this - * device monitor. no refcounting is needed. - * - * Since: 1.4 - */ -GstDeviceMonitorFactory * -gst_device_monitor_get_factory (GstDeviceMonitor * monitor) -{ - g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL); - - return GST_DEVICE_MONITOR_GET_CLASS (monitor)->factory; -} - -/** - * gst_device_monitor_can_monitor: - * @monitor: a #GstDeviceMonitor - * - * If this function returns %TRUE, then the device monitor can monitor if - * devices are added or removed. Otherwise, it can only do static probing. - * - * Returns: %TRUE if the #GstDeviceMonitor support monitoring, %FALSE otherwise - */ -gboolean -gst_device_monitor_can_monitor (GstDeviceMonitor * monitor) -{ - GstDeviceMonitorClass *klass; - - g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), FALSE); - klass = GST_DEVICE_MONITOR_GET_CLASS (monitor); - - if (klass->start) - return TRUE; - else - return FALSE; -} - -/** - * gst_device_monitor_get_bus: - * @monitor: a #GstDeviceMonitor - * - * Gets the #GstBus of this #GstDeviceMonitor - * - * Returns: (transfer full): a #GstBus - * - * Since: 1.4 - */ -GstBus * -gst_device_monitor_get_bus (GstDeviceMonitor * monitor) -{ - g_return_val_if_fail (GST_IS_DEVICE_MONITOR (monitor), NULL); - - return gst_object_ref (monitor->priv->bus); -} - -/** - * gst_device_monitor_device_add: - * @monitor: a #GstDeviceMonitor - * @device: (transfer full): a #GstDevice that has been added - * - * Posts a message on the monitor's #GstBus to inform applications that - * a new device has been added. - * - * This is for use by subclasses. - * - * Since: 1.4 - */ -void -gst_device_monitor_device_add (GstDeviceMonitor * monitor, GstDevice * device) -{ - GstMessage *message; - - if (!gst_object_set_parent (GST_OBJECT (device), GST_OBJECT (monitor))) { - GST_WARNING_OBJECT (monitor, "Could not parent device %p to monitor," - " it already has a parent", device); - return; - } - - GST_OBJECT_LOCK (monitor); - monitor->devices = g_list_prepend (monitor->devices, gst_object_ref (device)); - GST_OBJECT_UNLOCK (monitor); - - message = gst_message_new_device_added (GST_OBJECT (monitor), device); - gst_bus_post (monitor->priv->bus, message); - gst_object_unref (device); -} - - -/** - * gst_device_monitor_device_remove: - * @monitor: a #GstDeviceMonitor - * @device: a #GstDevice that has been removed - * - * Posts a message on the monitor's #GstBus to inform applications that - * a device has been removed. - * - * This is for use by subclasses. - * - * Since: 1.4 - */ -void -gst_device_monitor_device_remove (GstDeviceMonitor * monitor, - GstDevice * device) -{ - GstMessage *message; - GList *item; - - GST_OBJECT_LOCK (monitor); - item = g_list_find (monitor->devices, device); - if (item) { - monitor->devices = g_list_delete_link (monitor->devices, item); - } - GST_OBJECT_UNLOCK (monitor); - - message = gst_message_new_device_removed (GST_OBJECT (monitor), device); - g_signal_emit_by_name (device, "removed"); - gst_bus_post (monitor->priv->bus, message); - if (item) - gst_object_unparent (GST_OBJECT (device)); -} diff --git a/gst/gstdevicemonitorfactory.h b/gst/gstdevicemonitorfactory.h deleted file mode 100644 index 02bf04a8b..000000000 --- a/gst/gstdevicemonitorfactory.h +++ /dev/null @@ -1,90 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> - * 2000,2004 Wim Taymans <wim@fluendo.com> - * 2012 Olivier Crete <olivier.crete@collabora.com> - * - * gstdevicemonitorfactory.h: Header for GstDeviceMonitorFactory - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - - - -#ifndef __GST_DEVICE_MONITOR_FACTORY_H__ -#define __GST_DEVICE_MONITOR_FACTORY_H__ - -/** - * GstDeviceMonitorFactory: - * - * The opaque #GstDeviceMonitorFactory data structure. - * - * Since: 1.4 - */ - -/** - * GstDeviceMonitorFactoryClass: - * - * The opaque #GstDeviceMonitorFactoryClass data structure. - * - * Since: 1.4 - */ -typedef struct _GstDeviceMonitorFactory GstDeviceMonitorFactory; -typedef struct _GstDeviceMonitorFactoryClass GstDeviceMonitorFactoryClass; - -#include <gst/gstconfig.h> -#include <gst/gstplugin.h> -#include <gst/gstpluginfeature.h> -#include <gst/gstdevicemonitor.h> - -G_BEGIN_DECLS - -#define GST_TYPE_DEVICE_MONITOR_FACTORY (gst_device_monitor_factory_get_type()) -#define GST_DEVICE_MONITOR_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEVICE_MONITOR_FACTORY,\ - GstDeviceMonitorFactory)) -#define GST_DEVICE_MONITOR_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEVICE_MONITOR_FACTORY,\ - GstDeviceMonitorFactoryClass)) -#define GST_IS_DEVICE_MONITOR_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEVICE_MONITOR_FACTORY)) -#define GST_IS_DEVICE_MONITOR_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEVICE_MONITOR_FACTORY)) -#define GST_DEVICE_MONITOR_FACTORY_CAST(obj) ((GstDeviceMonitorFactory *)(obj)) - -GType gst_device_monitor_factory_get_type (void); - -GstDeviceMonitorFactory * gst_device_monitor_factory_find (const gchar *name); - -GType gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory *factory); - -const gchar * gst_device_monitor_factory_get_metadata (GstDeviceMonitorFactory *factory, const gchar *key); -gchar ** gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory *factory); - -GstDeviceMonitor* gst_device_monitor_factory_get (GstDeviceMonitorFactory *factory) G_GNUC_MALLOC; -GstDeviceMonitor* gst_device_monitor_factory_get_by_name (const gchar *factoryname) G_GNUC_MALLOC; - -gboolean gst_device_monitor_register (GstPlugin *plugin, const gchar *name, - guint rank, - GType type); - -gboolean gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory, - gchar ** classes); - -gboolean gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory *factory, - const gchar * classes); - -GList * gst_device_monitor_factory_list_get_device_monitors (const gchar *classes, - GstRank minrank) G_GNUC_MALLOC; - -G_END_DECLS - -#endif /* __GST_DEVICE_MONITOR_FACTORY_H__ */ diff --git a/gst/gstdeviceprovider.c b/gst/gstdeviceprovider.c new file mode 100644 index 000000000..1cf174935 --- /dev/null +++ b/gst/gstdeviceprovider.c @@ -0,0 +1,591 @@ +/* GStreamer + * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com> + * + * gstdeviceprovider.c: Device probing and monitoring + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:gstdeviceprovider + * @short_description: A device provider, monitor and prober + * @see_also: #GstDevice, #GstGlobalDeviceMonitor + * + * A #GstDeviceProvider subclass is provided by a plugin that handles devices + * if there is a way to programatically list connected devices. It can also + * optionally provide updates to the list of connected devices. + * + * Each #GstDeviceProvider subclass is a singleton, a plugin should + * normally provide a single subclass for all devices. + * + * Applications would normally use a #GstGlobalDeviceMonitor to monitor devices + * from all relevant providers. + * + * Since: 1.4 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst_private.h" + +#include "gstdeviceprovider.h" + +#include "gstelementmetadata.h" +#include "gstquark.h" + +struct _GstDeviceProviderPrivate +{ + GstBus *bus; + + GMutex start_lock; + + gboolean started_count; +}; + +/* this is used in gstelementfactory.c:gst_element_register() */ +GQuark __gst_deviceproviderclass_factory = 0; + +static void gst_device_provider_class_init (GstDeviceProviderClass * klass); +static void gst_device_provider_init (GstDeviceProvider * element); +static void gst_device_provider_base_class_init (gpointer g_class); +static void gst_device_provider_base_class_finalize (gpointer g_class); +static void gst_device_provider_dispose (GObject * object); +static void gst_device_provider_finalize (GObject * object); + +static gpointer gst_device_provider_parent_class = NULL; + +GType +gst_device_provider_get_type (void) +{ + static volatile gsize gst_device_provider_type = 0; + + if (g_once_init_enter (&gst_device_provider_type)) { + GType _type; + static const GTypeInfo element_info = { + sizeof (GstDeviceProviderClass), + gst_device_provider_base_class_init, + gst_device_provider_base_class_finalize, + (GClassInitFunc) gst_device_provider_class_init, + NULL, + NULL, + sizeof (GstDeviceProvider), + 0, + (GInstanceInitFunc) gst_device_provider_init, + NULL + }; + + _type = g_type_register_static (GST_TYPE_OBJECT, "GstDeviceProvider", + &element_info, G_TYPE_FLAG_ABSTRACT); + + __gst_deviceproviderclass_factory = + g_quark_from_static_string ("GST_DEVICEPROVIDERCLASS_FACTORY"); + g_once_init_leave (&gst_device_provider_type, _type); + } + return gst_device_provider_type; +} + +static void +gst_device_provider_base_class_init (gpointer g_class) +{ + GstDeviceProviderClass *klass = GST_DEVICE_PROVIDER_CLASS (g_class); + + /* Copy the element details here so elements can inherit the + * details from their base class and classes only need to set + * the details in class_init instead of base_init */ + klass->metadata = + klass->metadata ? gst_structure_copy (klass->metadata) : + gst_structure_new_empty ("metadata"); + + klass->factory = g_type_get_qdata (G_TYPE_FROM_CLASS (klass), + __gst_deviceproviderclass_factory); +} + +static void +gst_device_provider_base_class_finalize (gpointer g_class) +{ + GstDeviceProviderClass *klass = GST_DEVICE_PROVIDER_CLASS (g_class); + + gst_structure_free (klass->metadata); +} + +static void +gst_device_provider_class_init (GstDeviceProviderClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gst_device_provider_parent_class = g_type_class_peek_parent (klass); + + g_type_class_add_private (klass, sizeof (GstDeviceProviderPrivate)); + + gobject_class->dispose = gst_device_provider_dispose; + gobject_class->finalize = gst_device_provider_finalize; +} + +static void +gst_device_provider_init (GstDeviceProvider * provider) +{ + provider->priv = G_TYPE_INSTANCE_GET_PRIVATE (provider, + GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderPrivate); + + g_mutex_init (&provider->priv->start_lock); + + provider->priv->bus = gst_bus_new (); + gst_bus_set_flushing (provider->priv->bus, TRUE); +} + + +static void +gst_device_provider_dispose (GObject * object) +{ + GstDeviceProvider *provider = GST_DEVICE_PROVIDER (object); + + gst_object_replace ((GstObject **) & provider->priv->bus, NULL); + + GST_OBJECT_LOCK (provider); + g_list_free_full (provider->devices, (GDestroyNotify) gst_object_unparent); + provider->devices = NULL; + GST_OBJECT_UNLOCK (provider); + + G_OBJECT_CLASS (gst_device_provider_parent_class)->dispose (object); +} + +static void +gst_device_provider_finalize (GObject * object) +{ + GstDeviceProvider *provider = GST_DEVICE_PROVIDER (object); + + g_mutex_clear (&provider->priv->start_lock); + + G_OBJECT_CLASS (gst_device_provider_parent_class)->finalize (object); +} + +/** + * gst_device_provider_class_add_metadata: + * @klass: class to set metadata for + * @key: the key to set + * @value: the value to set + * + * Set @key with @value as metadata in @klass. + */ +void +gst_device_provider_class_add_metadata (GstDeviceProviderClass * klass, + const gchar * key, const gchar * value) +{ + g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass)); + g_return_if_fail (key != NULL); + g_return_if_fail (value != NULL); + + gst_structure_set ((GstStructure *) klass->metadata, + key, G_TYPE_STRING, value, NULL); +} + +/** + * gst_device_provider_class_add_static_metadata: + * @klass: class to set metadata for + * @key: the key to set + * @value: the value to set + * + * Set @key with @value as metadata in @klass. + * + * Same as gst_device_provider_class_add_metadata(), but @value must be a static string + * or an inlined string, as it will not be copied. (GStreamer plugins will + * be made resident once loaded, so this function can be used even from + * dynamically loaded plugins.) + * + * Since: 1.4 + */ +void +gst_device_provider_class_add_static_metadata (GstDeviceProviderClass * klass, + const gchar * key, const gchar * value) +{ + GValue val = G_VALUE_INIT; + + g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass)); + g_return_if_fail (key != NULL); + g_return_if_fail (value != NULL); + + g_value_init (&val, G_TYPE_STRING); + g_value_set_static_string (&val, value); + gst_structure_take_value ((GstStructure *) klass->metadata, key, &val); +} + +/** + * gst_device_provider_class_set_metadata: + * @klass: class to set metadata for + * @longname: The long English name of the device provider. E.g. "File Sink" + * @classification: String describing the type of device provider, as an + * unordered list separated with slashes ('/'). See draft-klass.txt of the + * design docs + * for more details and common types. E.g: "Sink/File" + * @description: Sentence describing the purpose of the device provider. + * E.g: "Write stream to a file" + * @author: Name and contact details of the author(s). Use \n to separate + * multiple author metadata. E.g: "Joe Bloggs <joe.blogs at foo.com>" + * + * Sets the detailed information for a #GstDeviceProviderClass. + * <note>This function is for use in _class_init functions only.</note> + * + * Since: 1.4 + */ +void +gst_device_provider_class_set_metadata (GstDeviceProviderClass * klass, + const gchar * longname, const gchar * classification, + const gchar * description, const gchar * author) +{ + g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass)); + g_return_if_fail (longname != NULL && *longname != '\0'); + g_return_if_fail (classification != NULL && *classification != '\0'); + g_return_if_fail (description != NULL && *description != '\0'); + g_return_if_fail (author != NULL && *author != '\0'); + + gst_structure_id_set ((GstStructure *) klass->metadata, + GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname, + GST_QUARK (ELEMENT_METADATA_KLASS), G_TYPE_STRING, classification, + GST_QUARK (ELEMENT_METADATA_DESCRIPTION), G_TYPE_STRING, description, + GST_QUARK (ELEMENT_METADATA_AUTHOR), G_TYPE_STRING, author, NULL); +} + +/** + * gst_device_provider_class_set_static_metadata: + * @klass: class to set metadata for + * @longname: The long English name of the element. E.g. "File Sink" + * @classification: String describing the type of element, as an unordered list + * separated with slashes ('/'). See draft-klass.txt of the design docs + * for more details and common types. E.g: "Sink/File" + * @description: Sentence describing the purpose of the element. + * E.g: "Write stream to a file" + * @author: Name and contact details of the author(s). Use \n to separate + * multiple author metadata. E.g: "Joe Bloggs <joe.blogs at foo.com>" + * + * Sets the detailed information for a #GstDeviceProviderClass. + * <note>This function is for use in _class_init functions only.</note> + * + * Same as gst_device_provider_class_set_metadata(), but @longname, @classification, + * @description, and @author must be static strings or inlined strings, as + * they will not be copied. (GStreamer plugins will be made resident once + * loaded, so this function can be used even from dynamically loaded plugins.) + * + * Since: 1.4 + */ +void +gst_device_provider_class_set_static_metadata (GstDeviceProviderClass * klass, + const gchar * longname, const gchar * classification, + const gchar * description, const gchar * author) +{ + GstStructure *s = (GstStructure *) klass->metadata; + GValue val = G_VALUE_INIT; + + g_return_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass)); + g_return_if_fail (longname != NULL && *longname != '\0'); + g_return_if_fail (classification != NULL && *classification != '\0'); + g_return_if_fail (description != NULL && *description != '\0'); + g_return_if_fail (author != NULL && *author != '\0'); + + g_value_init (&val, G_TYPE_STRING); + + g_value_set_static_string (&val, longname); + gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_LONGNAME), &val); + + g_value_set_static_string (&val, classification); + gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_KLASS), &val); + + g_value_set_static_string (&val, description); + gst_structure_id_set_value (s, GST_QUARK (ELEMENT_METADATA_DESCRIPTION), + &val); + + g_value_set_static_string (&val, author); + gst_structure_id_take_value (s, GST_QUARK (ELEMENT_METADATA_AUTHOR), &val); +} + +/** + * gst_device_provider_class_get_metadata: + * @klass: class to get metadata for + * @key: the key to get + * + * Get metadata with @key in @klass. + * + * Returns: the metadata for @key. + * + * Since: 1.4 + */ +const gchar * +gst_device_provider_class_get_metadata (GstDeviceProviderClass * klass, + const gchar * key) +{ + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_CLASS (klass), NULL); + g_return_val_if_fail (key != NULL, NULL); + + return gst_structure_get_string ((GstStructure *) klass->metadata, key); +} + +/** + * gst_device_provider_get_devices: + * @provider: A #GstDeviceProvider + * + * Gets a list of devices that this provider understands. This may actually + * probe the hardware if the provider is not currently started. + * + * Returns: (transfer full) (element-type GstDevice): a #GList of + * #GstDevice + * + * Since: 1.4 + */ + +GList * +gst_device_provider_get_devices (GstDeviceProvider * provider) +{ + GstDeviceProviderClass *klass; + GList *devices = NULL; + gboolean started; + GList *item; + + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL); + klass = GST_DEVICE_PROVIDER_GET_CLASS (provider); + + g_mutex_lock (&provider->priv->start_lock); + started = (provider->priv->started_count > 0); + + if (started) { + GST_OBJECT_LOCK (provider); + for (item = provider->devices; item; item = item->next) + devices = g_list_prepend (devices, gst_object_ref (item->data)); + GST_OBJECT_UNLOCK (provider); + } else if (klass->probe) + devices = klass->probe (provider); + + g_mutex_unlock (&provider->priv->start_lock); + + return devices; +} + +/** + * gst_device_provider_start: + * @provider: A #GstDeviceProvider + * + * Starts providering the devices. This will cause #GST_MESSAGE_DEVICE messages + * to be posted on the provider's bus when devices are added or removed from + * the system. + * + * Since the #GstDeviceProvider is a singleton, + * gst_device_provider_start() may already have been called by another + * user of the object, gst_device_provider_stop() needs to be called the same + * number of times. + * + * Returns: %TRUE if the device providering could be started + * + * Since: 1.4 + */ + +gboolean +gst_device_provider_start (GstDeviceProvider * provider) +{ + GstDeviceProviderClass *klass; + gboolean ret = FALSE; + + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), FALSE); + klass = GST_DEVICE_PROVIDER_GET_CLASS (provider); + + g_mutex_lock (&provider->priv->start_lock); + + if (provider->priv->started_count > 0) { + ret = TRUE; + goto started; + } + + if (klass->start) + ret = klass->start (provider); + + if (ret) { + provider->priv->started_count++; + gst_bus_set_flushing (provider->priv->bus, FALSE); + } + +started: + + g_mutex_unlock (&provider->priv->start_lock); + + return ret; +} + +/** + * gst_device_provider_stop: + * @provider: A #GstDeviceProvider + * + * Decreases the use-count by one. If the use count reaches zero, this + * #GstDeviceProvider will stop providering the devices. This needs to be + * called the same number of times that gst_device_provider_start() was called. + * + * Since: 1.4 + */ + +void +gst_device_provider_stop (GstDeviceProvider * provider) +{ + GstDeviceProviderClass *klass; + + g_return_if_fail (GST_IS_DEVICE_PROVIDER (provider)); + klass = GST_DEVICE_PROVIDER_GET_CLASS (provider); + + g_mutex_lock (&provider->priv->start_lock); + + if (provider->priv->started_count == 1) { + gst_bus_set_flushing (provider->priv->bus, TRUE); + if (klass->stop) + klass->stop (provider); + GST_OBJECT_LOCK (provider); + g_list_free_full (provider->devices, (GDestroyNotify) gst_object_unparent); + provider->devices = NULL; + GST_OBJECT_UNLOCK (provider); + } else if (provider->priv->started_count < 1) { + g_critical + ("Trying to stop a GstDeviceProvider %s which is already stopped", + GST_OBJECT_NAME (provider)); + } + + provider->priv->started_count--; + g_mutex_unlock (&provider->priv->start_lock); +} + + +/** + * gst_device_provider_get_factory: + * @provider: a #GstDeviceProvider to request the device provider factory of. + * + * Retrieves the factory that was used to create this device provider. + * + * Returns: (transfer none): the #GstDeviceProviderFactory used for + * creating this device provider. no refcounting is needed. + * + * Since: 1.4 + */ +GstDeviceProviderFactory * +gst_device_provider_get_factory (GstDeviceProvider * provider) +{ + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL); + + return GST_DEVICE_PROVIDER_GET_CLASS (provider)->factory; +} + +/** + * gst_device_provider_can_provider: + * @provider: a #GstDeviceProvider + * + * If this function returns %TRUE, then the device provider can provider if + * devices are added or removed. Otherwise, it can only do static probing. + * + * Returns: %TRUE if the #GstDeviceProvider support providering, %FALSE otherwise + */ +gboolean +gst_device_provider_can_monitor (GstDeviceProvider * provider) +{ + GstDeviceProviderClass *klass; + + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), FALSE); + klass = GST_DEVICE_PROVIDER_GET_CLASS (provider); + + if (klass->start) + return TRUE; + else + return FALSE; +} + +/** + * gst_device_provider_get_bus: + * @provider: a #GstDeviceProvider + * + * Gets the #GstBus of this #GstDeviceProvider + * + * Returns: (transfer full): a #GstBus + * + * Since: 1.4 + */ +GstBus * +gst_device_provider_get_bus (GstDeviceProvider * provider) +{ + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER (provider), NULL); + + return gst_object_ref (provider->priv->bus); +} + +/** + * gst_device_provider_device_add: + * @provider: a #GstDeviceProvider + * @device: (transfer full): a #GstDevice that has been added + * + * Posts a message on the provider's #GstBus to inform applications that + * a new device has been added. + * + * This is for use by subclasses. + * + * Since: 1.4 + */ +void +gst_device_provider_device_add (GstDeviceProvider * provider, + GstDevice * device) +{ + GstMessage *message; + + if (!gst_object_set_parent (GST_OBJECT (device), GST_OBJECT (provider))) { + GST_WARNING_OBJECT (provider, "Could not parent device %p to provider," + " it already has a parent", device); + return; + } + + GST_OBJECT_LOCK (provider); + provider->devices = g_list_prepend (provider->devices, + gst_object_ref (device)); + GST_OBJECT_UNLOCK (provider); + + message = gst_message_new_device_added (GST_OBJECT (provider), device); + gst_bus_post (provider->priv->bus, message); + gst_object_unref (device); +} + + +/** + * gst_device_provider_device_remove: + * @provider: a #GstDeviceProvider + * @device: a #GstDevice that has been removed + * + * Posts a message on the provider's #GstBus to inform applications that + * a device has been removed. + * + * This is for use by subclasses. + * + * Since: 1.4 + */ +void +gst_device_provider_device_remove (GstDeviceProvider * provider, + GstDevice * device) +{ + GstMessage *message; + GList *item; + + GST_OBJECT_LOCK (provider); + item = g_list_find (provider->devices, device); + if (item) { + provider->devices = g_list_delete_link (provider->devices, item); + } + GST_OBJECT_UNLOCK (provider); + + message = gst_message_new_device_removed (GST_OBJECT (provider), device); + g_signal_emit_by_name (device, "removed"); + gst_bus_post (provider->priv->bus, message); + if (item) + gst_object_unparent (GST_OBJECT (device)); +} diff --git a/gst/gstdevicemonitor.h b/gst/gstdeviceprovider.h index f5c33073e..6370afc65 100644 --- a/gst/gstdevicemonitor.h +++ b/gst/gstdeviceprovider.h @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2012 Olivier Crete <olivier.crete@collabora.com> * - * gstdevicemonitor.h: Device probing and monitoring + * gstdeviceprovider.h: Device probing and monitoring * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,39 +19,39 @@ * Boston, MA 02111-1307, USA. */ -#include <gst/gstdevicemonitorfactory.h> +#include <gst/gstdeviceproviderfactory.h> -#ifndef __GST_DEVICE_MONITOR_H__ -#define __GST_DEVICE_MONITOR_H__ +#ifndef __GST_DEVICE_PROVIDER_H__ +#define __GST_DEVICE_PROVIDER_H__ #include <gst/gstelement.h> G_BEGIN_DECLS -typedef struct _GstDeviceMonitor GstDeviceMonitor; -typedef struct _GstDeviceMonitorClass GstDeviceMonitorClass; -typedef struct _GstDeviceMonitorPrivate GstDeviceMonitorPrivate; +typedef struct _GstDeviceProvider GstDeviceProvider; +typedef struct _GstDeviceProviderClass GstDeviceProviderClass; +typedef struct _GstDeviceProviderPrivate GstDeviceProviderPrivate; -#define GST_TYPE_DEVICE_MONITOR (gst_device_monitor_get_type()) -#define GST_IS_DEVICE_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEVICE_MONITOR)) -#define GST_IS_DEVICE_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEVICE_MONITOR)) -#define GST_DEVICE_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorClass)) -#define GST_DEVICE_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitor)) -#define GST_DEVICE_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE_MONITOR, GstDeviceMonitorClass)) -#define GST_DEVICE_MONITOR_CAST(obj) ((GstDeviceMonitor *)(obj)) +#define GST_TYPE_DEVICE_PROVIDER (gst_device_provider_get_type()) +#define GST_IS_DEVICE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEVICE_PROVIDER)) +#define GST_IS_DEVICE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEVICE_PROVIDER)) +#define GST_DEVICE_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderClass)) +#define GST_DEVICE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEVICE_PROVIDER, GstDeviceProvider)) +#define GST_DEVICE_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE_PROVIDER, GstDeviceProviderClass)) +#define GST_DEVICE_PROVIDER_CAST(obj) ((GstDeviceProvider *)(obj)) /** - * GstDeviceMonitor: + * GstDeviceProvider: * @parent: The parent #GstObject * @devices: a #GList of the #GstDevice objects * - * The structure of the base #GstDeviceMonitor + * The structure of the base #GstDeviceProvider * * Since: 1.4 */ -struct _GstDeviceMonitor { +struct _GstDeviceProvider { GstObject parent; /* Protected by the Object lock */ @@ -59,16 +59,16 @@ struct _GstDeviceMonitor { /*< private >*/ - GstDeviceMonitorPrivate *priv; + GstDeviceProviderPrivate *priv; gpointer _gst_reserved[GST_PADDING]; }; /** - * GstDeviceMonitorClass: + * GstDeviceProviderClass: * @parent_class: the parent #GstObjectClass structure - * @factory: a pointer to the #GstDeviceMonitorFactory that creates this - * monitor + * @factory: a pointer to the #GstDeviceProviderFactory that creates this + * provider * @probe: Returns a list of devices that are currently available. * This should never block. * @start: Starts monitoring for new devices. Only subclasses that can know @@ -76,20 +76,20 @@ struct _GstDeviceMonitor { * @stop: Stops monitoring for new devices. Only subclasses that implement * the start() method need to implement this method. * - * The structure of the base #GstDeviceMonitorClass + * The structure of the base #GstDeviceProviderClass * * Since: 1.4 */ -struct _GstDeviceMonitorClass { +struct _GstDeviceProviderClass { GstObjectClass parent_class; - GstDeviceMonitorFactory *factory; + GstDeviceProviderFactory *factory; - GList* (*probe) (GstDeviceMonitor * monitor); + GList* (*probe) (GstDeviceProvider * provider); - gboolean (*start) (GstDeviceMonitor * monitor); - void (*stop) (GstDeviceMonitor * monitor); + gboolean (*start) (GstDeviceProvider * provider); + void (*stop) (GstDeviceProvider * provider); /*< private >*/ gpointer metadata; @@ -98,45 +98,45 @@ struct _GstDeviceMonitorClass { gpointer _gst_reserved[GST_PADDING]; }; -GType gst_device_monitor_get_type (void); +GType gst_device_provider_get_type (void); -GList * gst_device_monitor_get_devices (GstDeviceMonitor * monitor); +GList * gst_device_provider_get_devices (GstDeviceProvider * provider); -gboolean gst_device_monitor_start (GstDeviceMonitor * monitor); -void gst_device_monitor_stop (GstDeviceMonitor * monitor); +gboolean gst_device_provider_start (GstDeviceProvider * provider); +void gst_device_provider_stop (GstDeviceProvider * provider); -gboolean gst_device_monitor_can_monitor (GstDeviceMonitor * monitor); +gboolean gst_device_provider_can_monitor (GstDeviceProvider * provider); -GstBus * gst_device_monitor_get_bus (GstDeviceMonitor * monitor); +GstBus * gst_device_provider_get_bus (GstDeviceProvider * provider); -void gst_device_monitor_device_add (GstDeviceMonitor * monitor, +void gst_device_provider_device_add (GstDeviceProvider * provider, GstDevice * device); -void gst_device_monitor_device_remove (GstDeviceMonitor * monitor, +void gst_device_provider_device_remove (GstDeviceProvider * provider, GstDevice * device); -/* device monitor class meta data */ -void gst_device_monitor_class_set_metadata (GstDeviceMonitorClass *klass, +/* device provider class meta data */ +void gst_device_provider_class_set_metadata (GstDeviceProviderClass *klass, const gchar *longname, const gchar *classification, const gchar *description, const gchar *author); -void gst_device_monitor_class_set_static_metadata (GstDeviceMonitorClass *klass, +void gst_device_provider_class_set_static_metadata (GstDeviceProviderClass *klass, const gchar *longname, const gchar *classification, const gchar *description, const gchar *author); -void gst_device_monitor_class_add_metadata (GstDeviceMonitorClass * klass, +void gst_device_provider_class_add_metadata (GstDeviceProviderClass * klass, const gchar * key, const gchar * value); -void gst_device_monitor_class_add_static_metadata (GstDeviceMonitorClass * klass, +void gst_device_provider_class_add_static_metadata (GstDeviceProviderClass * klass, const gchar * key, const gchar * value); -const gchar * gst_device_monitor_class_get_metadata (GstDeviceMonitorClass * klass, +const gchar * gst_device_provider_class_get_metadata (GstDeviceProviderClass * klass, const gchar * key); /* factory management */ -GstDeviceMonitorFactory * gst_device_monitor_get_factory (GstDeviceMonitor * monitor); +GstDeviceProviderFactory * gst_device_provider_get_factory (GstDeviceProvider * provider); G_END_DECLS -#endif /* __GST_DEVICE_MONITOR_H__ */ +#endif /* __GST_DEVICE_PROVIDER_H__ */ diff --git a/gst/gstdevicemonitorfactory.c b/gst/gstdeviceproviderfactory.c index 4d113a098..d0586afce 100644 --- a/gst/gstdevicemonitorfactory.c +++ b/gst/gstdeviceproviderfactory.c @@ -3,7 +3,7 @@ * 2000 Wim Taymans <wtay@chello.be> * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de> * - * gstdevicemonitorfactory.c: GstDeviceMonitorFactory object, support routines + * gstdeviceproviderfactory.c: GstDeviceProviderFactory object, support routines * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -22,16 +22,16 @@ */ /** - * SECTION:gstdevicemonitorfactory - * @short_description: Create GstDeviceMonitors from a factory - * @see_also: #GstDeviceMonitor, #GstPlugin, #GstPluginFeature, #GstPadTemplate. + * SECTION:gstdeviceproviderfactory + * @short_description: Create GstDeviceProviders from a factory + * @see_also: #GstDeviceProvider, #GstPlugin, #GstPluginFeature, #GstPadTemplate. * - * #GstDeviceMonitorFactory is used to create instances of device monitors. A - * GstDeviceMonitorfactory can be added to a #GstPlugin as it is also a + * #GstDeviceProviderFactory is used to create instances of device providers. A + * GstDeviceProviderfactory can be added to a #GstPlugin as it is also a * #GstPluginFeature. * - * Use the gst_device_monitor_factory_find() and gst_device_monitor_factory_create() - * functions to create device monitor instances or use gst_device_monitor_factory_make() as a + * Use the gst_device_provider_factory_find() and gst_device_provider_factory_create() + * functions to create device provider instances or use gst_device_provider_factory_make() as a * convenient shortcut. * * Since: 1.4 @@ -43,94 +43,94 @@ #include "gst_private.h" -#include "gstdevicemonitorfactory.h" +#include "gstdeviceproviderfactory.h" #include "gst.h" #include "glib-compat-private.h" -GST_DEBUG_CATEGORY_STATIC (device_monitor_factory_debug); -#define GST_CAT_DEFAULT device_monitor_factory_debug +GST_DEBUG_CATEGORY_STATIC (device_provider_factory_debug); +#define GST_CAT_DEFAULT device_provider_factory_debug -static void gst_device_monitor_factory_finalize (GObject * object); -static void gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * +static void gst_device_provider_factory_finalize (GObject * object); +static void gst_device_provider_factory_cleanup (GstDeviceProviderFactory * factory); -/* static guint gst_device_monitor_factory_signals[LAST_SIGNAL] = { 0 }; */ +/* static guint gst_device_provider_factory_signals[LAST_SIGNAL] = { 0 }; */ /* this is defined in gstelement.c */ -extern GQuark __gst_devicemonitorclass_factory; +extern GQuark __gst_deviceproviderclass_factory; #define _do_init \ { \ - GST_DEBUG_CATEGORY_INIT (device_monitor_factory_debug, "GST_DEVICE_MONITOR_FACTORY", \ + GST_DEBUG_CATEGORY_INIT (device_provider_factory_debug, "GST_DEVICE_PROVIDER_FACTORY", \ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \ - "device monitor factories keep information about installed device monitors"); \ + "device provider factories keep information about installed device providers"); \ } -G_DEFINE_TYPE_WITH_CODE (GstDeviceMonitorFactory, gst_device_monitor_factory, +G_DEFINE_TYPE_WITH_CODE (GstDeviceProviderFactory, gst_device_provider_factory, GST_TYPE_PLUGIN_FEATURE, _do_init); static void -gst_device_monitor_factory_class_init (GstDeviceMonitorFactoryClass * klass) +gst_device_provider_factory_class_init (GstDeviceProviderFactoryClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; - gobject_class->finalize = gst_device_monitor_factory_finalize; + gobject_class->finalize = gst_device_provider_factory_finalize; } static void -gst_device_monitor_factory_init (GstDeviceMonitorFactory * factory) +gst_device_provider_factory_init (GstDeviceProviderFactory * factory) { } static void -gst_device_monitor_factory_finalize (GObject * object) +gst_device_provider_factory_finalize (GObject * object) { - GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (object); - GstDeviceMonitor *monitor; + GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (object); + GstDeviceProvider *provider; - gst_device_monitor_factory_cleanup (factory); + gst_device_provider_factory_cleanup (factory); - monitor = g_atomic_pointer_get (&factory->monitor); - if (monitor) - gst_object_unref (monitor); + provider = g_atomic_pointer_get (&factory->provider); + if (provider) + gst_object_unref (provider); - G_OBJECT_CLASS (gst_device_monitor_factory_parent_class)->finalize (object); + G_OBJECT_CLASS (gst_device_provider_factory_parent_class)->finalize (object); } /** - * gst_device_monitor_factory_find: + * gst_device_provider_factory_find: * @name: name of factory to find * - * Search for an device monitor factory of the given name. Refs the returned - * device monitor factory; caller is responsible for unreffing. + * Search for an device provider factory of the given name. Refs the returned + * device provider factory; caller is responsible for unreffing. * - * Returns: (transfer full) (nullable): #GstDeviceMonitorFactory if + * Returns: (transfer full) (nullable): #GstDeviceProviderFactory if * found, %NULL otherwise * * Since: 1.4 */ -GstDeviceMonitorFactory * -gst_device_monitor_factory_find (const gchar * name) +GstDeviceProviderFactory * +gst_device_provider_factory_find (const gchar * name) { GstPluginFeature *feature; g_return_val_if_fail (name != NULL, NULL); feature = gst_registry_find_feature (gst_registry_get (), name, - GST_TYPE_DEVICE_MONITOR_FACTORY); + GST_TYPE_DEVICE_PROVIDER_FACTORY); if (feature) - return GST_DEVICE_MONITOR_FACTORY (feature); + return GST_DEVICE_PROVIDER_FACTORY (feature); - /* this isn't an error, for instance when you query if an device monitor factory is + /* this isn't an error, for instance when you query if an device provider factory is * present */ - GST_LOG ("no such device monitor factory \"%s\"", name); + GST_LOG ("no such device provider factory \"%s\"", name); return NULL; } static void -gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * factory) +gst_device_provider_factory_cleanup (GstDeviceProviderFactory * factory) { if (factory->metadata) { gst_structure_free ((GstStructure *) factory->metadata); @@ -143,22 +143,22 @@ gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * factory) #define CHECK_METADATA_FIELD(klass, name, key) \ G_STMT_START { \ - const gchar *metafield = gst_device_monitor_class_get_metadata (klass, key); \ + const gchar *metafield = gst_device_provider_class_get_metadata (klass, key); \ if (G_UNLIKELY (metafield == NULL || *metafield == '\0')) { \ - g_warning ("Device monitor factory metadata for '%s' has no valid %s field", name, key); \ + g_warning ("Device provider factory metadata for '%s' has no valid %s field", name, key); \ goto detailserror; \ } \ } G_STMT_END; /** - * gst_device_monitor_register: - * @plugin: (allow-none): #GstPlugin to register the device monitor with, or %NULL for - * a static device monitor. - * @name: name of device monitors of this type - * @rank: rank of device monitor (higher rank means more importance when autoplugging) - * @type: GType of device monitor to register - * - * Create a new device monitorfactory capable of instantiating objects of the + * gst_device_provider_register: + * @plugin: (allow-none): #GstPlugin to register the device provider with, or %NULL for + * a static device provider. + * @name: name of device providers of this type + * @rank: rank of device provider (higher rank means more importance when autoplugging) + * @type: GType of device provider to register + * + * Create a new device providerfactory capable of instantiating objects of the * @type and add the factory to @plugin. * * Returns: %TRUE, if the registering succeeded, %FALSE on error @@ -166,16 +166,16 @@ gst_device_monitor_factory_cleanup (GstDeviceMonitorFactory * factory) * Since: 1.4 */ gboolean -gst_device_monitor_register (GstPlugin * plugin, const gchar * name, guint rank, - GType type) +gst_device_provider_register (GstPlugin * plugin, const gchar * name, + guint rank, GType type) { GstPluginFeature *existing_feature; GstRegistry *registry; - GstDeviceMonitorFactory *factory; - GstDeviceMonitorClass *klass; + GstDeviceProviderFactory *factory; + GstDeviceProviderClass *klass; g_return_val_if_fail (name != NULL, FALSE); - g_return_val_if_fail (g_type_is_a (type, GST_TYPE_DEVICE_MONITOR), FALSE); + g_return_val_if_fail (g_type_is_a (type, GST_TYPE_DEVICE_PROVIDER), FALSE); registry = gst_registry_get (); @@ -187,24 +187,24 @@ gst_device_monitor_register (GstPlugin * plugin, const gchar * name, guint rank, if (existing_feature) { GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)", existing_feature, name); - factory = GST_DEVICE_MONITOR_FACTORY_CAST (existing_feature); + factory = GST_DEVICE_PROVIDER_FACTORY_CAST (existing_feature); factory->type = type; existing_feature->loaded = TRUE; - g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory); + g_type_set_qdata (type, __gst_deviceproviderclass_factory, factory); gst_object_unref (existing_feature); return TRUE; } factory = - GST_DEVICE_MONITOR_FACTORY_CAST (g_object_newv - (GST_TYPE_DEVICE_MONITOR_FACTORY, 0, NULL)); + GST_DEVICE_PROVIDER_FACTORY_CAST (g_object_newv + (GST_TYPE_DEVICE_PROVIDER_FACTORY, 0, NULL)); gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name); - GST_LOG_OBJECT (factory, "Created new device monitorfactory for type %s", + GST_LOG_OBJECT (factory, "Created new device providerfactory for type %s", g_type_name (type)); /* provide info needed during class structure setup */ - g_type_set_qdata (type, __gst_devicemonitorclass_factory, factory); - klass = GST_DEVICE_MONITOR_CLASS (g_type_class_ref (type)); + g_type_set_qdata (type, __gst_deviceproviderclass_factory, factory); + klass = GST_DEVICE_PROVIDER_CLASS (g_type_class_ref (type)); CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_LONGNAME); CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_KLASS); @@ -233,34 +233,34 @@ gst_device_monitor_register (GstPlugin * plugin, const gchar * name, guint rank, /* ERRORS */ detailserror: { - gst_device_monitor_factory_cleanup (factory); + gst_device_provider_factory_cleanup (factory); return FALSE; } } /** - * gst_device_monitor_factory_get: + * gst_device_provider_factory_get: * @factory: factory to instantiate * - * Returns the device monitor of the type defined by the given device - * monitorfactory. + * Returns the device provider of the type defined by the given device + * providerfactory. * - * Returns: (transfer full) (nullable): the #GstDeviceMonitor or %NULL - * if the device monitor couldn't be created + * Returns: (transfer full) (nullable): the #GstDeviceProvider or %NULL + * if the device provider couldn't be created * * Since: 1.4 */ -GstDeviceMonitor * -gst_device_monitor_factory_get (GstDeviceMonitorFactory * factory) +GstDeviceProvider * +gst_device_provider_factory_get (GstDeviceProviderFactory * factory) { - GstDeviceMonitor *device_monitor; - GstDeviceMonitorClass *oclass; - GstDeviceMonitorFactory *newfactory; + GstDeviceProvider *device_provider; + GstDeviceProviderClass *oclass; + GstDeviceProviderFactory *newfactory; g_return_val_if_fail (factory != NULL, NULL); newfactory = - GST_DEVICE_MONITOR_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE + GST_DEVICE_PROVIDER_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE (factory))); if (newfactory == NULL) @@ -268,45 +268,45 @@ gst_device_monitor_factory_get (GstDeviceMonitorFactory * factory) factory = newfactory; - GST_INFO ("getting device monitor \"%s\"", GST_OBJECT_NAME (factory)); + GST_INFO ("getting device provider \"%s\"", GST_OBJECT_NAME (factory)); if (factory->type == 0) goto no_type; - device_monitor = g_atomic_pointer_get (&newfactory->monitor); - if (device_monitor) - return gst_object_ref (device_monitor); + device_provider = g_atomic_pointer_get (&newfactory->provider); + if (device_provider) + return gst_object_ref (device_provider); - /* create an instance of the device monitor, cast so we don't assert on NULL + /* create an instance of the device provider, cast so we don't assert on NULL * also set name as early as we can */ - device_monitor = GST_DEVICE_MONITOR_CAST (g_object_newv (factory->type, 0, + device_provider = GST_DEVICE_PROVIDER_CAST (g_object_newv (factory->type, 0, NULL)); - if (G_UNLIKELY (device_monitor == NULL)) - goto no_device_monitor; + if (G_UNLIKELY (device_provider == NULL)) + goto no_device_provider; - /* fill in the pointer to the factory in the device monitor class. The + /* fill in the pointer to the factory in the device provider class. The * class will not be unreffed currently. * Be thread safe as there might be 2 threads creating the first instance of - * an device monitor at the same moment + * an device provider at the same moment */ - oclass = GST_DEVICE_MONITOR_GET_CLASS (device_monitor); + oclass = GST_DEVICE_PROVIDER_GET_CLASS (device_provider); if (!g_atomic_pointer_compare_and_exchange (&oclass->factory, NULL, factory)) gst_object_unref (factory); - gst_object_ref_sink (device_monitor); + gst_object_ref_sink (device_provider); /* We use an atomic to make sure we don't create two in parallel */ - if (!g_atomic_pointer_compare_and_exchange (&newfactory->monitor, NULL, - device_monitor)) { - gst_object_unref (device_monitor); + if (!g_atomic_pointer_compare_and_exchange (&newfactory->provider, NULL, + device_provider)) { + gst_object_unref (device_provider); - device_monitor = g_atomic_pointer_get (&newfactory->monitor); + device_provider = g_atomic_pointer_get (&newfactory->provider); } - GST_DEBUG ("created device monitor \"%s\"", GST_OBJECT_NAME (factory)); + GST_DEBUG ("created device provider \"%s\"", GST_OBJECT_NAME (factory)); - return gst_object_ref (device_monitor); + return gst_object_ref (device_provider); /* ERRORS */ load_failed: @@ -322,53 +322,53 @@ no_type: gst_object_unref (factory); return NULL; } -no_device_monitor: +no_device_provider: { - GST_WARNING_OBJECT (factory, "could not create device monitor"); + GST_WARNING_OBJECT (factory, "could not create device provider"); gst_object_unref (factory); return NULL; } } /** - * gst_device_monitor_factory_get_by_name: + * gst_device_provider_factory_get_by_name: * @factoryname: a named factory to instantiate * - * Returns the device monitor of the type defined by the given device - * monitor factory. + * Returns the device provider of the type defined by the given device + * provider factory. * - * Returns: (transfer full) (nullable): a #GstDeviceMonitor or %NULL - * if unable to create device monitor + * Returns: (transfer full) (nullable): a #GstDeviceProvider or %NULL + * if unable to create device provider * * Since: 1.4 */ -GstDeviceMonitor * -gst_device_monitor_factory_get_by_name (const gchar * factoryname) +GstDeviceProvider * +gst_device_provider_factory_get_by_name (const gchar * factoryname) { - GstDeviceMonitorFactory *factory; - GstDeviceMonitor *device_monitor; + GstDeviceProviderFactory *factory; + GstDeviceProvider *device_provider; g_return_val_if_fail (factoryname != NULL, NULL); g_return_val_if_fail (gst_is_initialized (), NULL); - GST_LOG ("gstdevicemonitorfactory: get_by_name \"%s\"", factoryname); + GST_LOG ("gstdeviceproviderfactory: get_by_name \"%s\"", factoryname); - factory = gst_device_monitor_factory_find (factoryname); + factory = gst_device_provider_factory_find (factoryname); if (factory == NULL) goto no_factory; GST_LOG_OBJECT (factory, "found factory %p", factory); - device_monitor = gst_device_monitor_factory_get (factory); - if (device_monitor == NULL) + device_provider = gst_device_provider_factory_get (factory); + if (device_provider == NULL) goto create_failed; gst_object_unref (factory); - return device_monitor; + return device_provider; /* ERRORS */ no_factory: { - GST_INFO ("no such device monitor factory \"%s\"!", factoryname); + GST_INFO ("no such device provider factory \"%s\"!", factoryname); return NULL; } create_failed: @@ -380,30 +380,30 @@ create_failed: } /** - * gst_device_monitor_factory_get_device_monitor_type: + * gst_device_provider_factory_get_device_provider_type: * @factory: factory to get managed #GType from * - * Get the #GType for device monitors managed by this factory. The type can - * only be retrieved if the device monitor factory is loaded, which can be + * Get the #GType for device providers managed by this factory. The type can + * only be retrieved if the device provider factory is loaded, which can be * assured with gst_plugin_feature_load(). * - * Returns: the #GType for device monitors managed by this factory or 0 if + * Returns: the #GType for device providers managed by this factory or 0 if * the factory is not loaded. * * Since: 1.4 */ GType -gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory * +gst_device_provider_factory_get_device_provider_type (GstDeviceProviderFactory * factory) { - g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), 0); + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), 0); return factory->type; } /** - * gst_device_monitor_factory_get_metadata: - * @factory: a #GstDeviceMonitorFactory + * gst_device_provider_factory_get_metadata: + * @factory: a #GstDeviceProviderFactory * @key: a key * * Get the metadata on @factory with @key. @@ -414,15 +414,15 @@ gst_device_monitor_factory_get_device_monitor_type (GstDeviceMonitorFactory * * Since: 1.4 */ const gchar * -gst_device_monitor_factory_get_metadata (GstDeviceMonitorFactory * factory, +gst_device_provider_factory_get_metadata (GstDeviceProviderFactory * factory, const gchar * key) { return gst_structure_get_string ((GstStructure *) factory->metadata, key); } /** - * gst_device_monitor_factory_get_metadata_keys: - * @factory: a #GstDeviceMonitorFactory + * gst_device_provider_factory_get_metadata_keys: + * @factory: a #GstDeviceProviderFactory * * Get the available keys for the metadata on @factory. * @@ -433,13 +433,14 @@ gst_device_monitor_factory_get_metadata (GstDeviceMonitorFactory * factory, * Since: 1.4 */ gchar ** -gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory * factory) +gst_device_provider_factory_get_metadata_keys (GstDeviceProviderFactory * + factory) { GstStructure *metadata; gchar **arr; gint i, num; - g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), NULL); + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), NULL); metadata = (GstStructure *) factory->metadata; if (metadata == NULL) @@ -458,8 +459,8 @@ gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory * factory) } /** - * gst_device_monitor_factory_has_classesv: - * @factory: a #GstDeviceMonitorFactory + * gst_device_provider_factory_has_classesv: + * @factory: a #GstDeviceProviderFactory * @classes: (array zero-terminated=1): a %NULL terminated array of * klasses to match, only match if all classes are matched * @@ -470,19 +471,19 @@ gst_device_monitor_factory_get_metadata_keys (GstDeviceMonitorFactory * factory) * Since: 1.4 */ gboolean -gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory, +gst_device_provider_factory_has_classesv (GstDeviceProviderFactory * factory, gchar ** classes) { const gchar *klass; - g_return_val_if_fail (GST_IS_DEVICE_MONITOR_FACTORY (factory), FALSE); + g_return_val_if_fail (GST_IS_DEVICE_PROVIDER_FACTORY (factory), FALSE); - klass = gst_device_monitor_factory_get_metadata (factory, + klass = gst_device_provider_factory_get_metadata (factory, GST_ELEMENT_METADATA_KLASS); if (klass == NULL) { GST_ERROR_OBJECT (factory, - "device monitor factory is missing klass identifiers"); + "device provider factory is missing klass identifiers"); return FALSE; } @@ -509,8 +510,8 @@ gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory, } /** - * gst_device_monitor_factory_has_classes: - * @factory: a #GstDeviceMonitorFactory + * gst_device_provider_factory_has_classes: + * @factory: a #GstDeviceProviderFactory * @classes: a "/" separate list of klasses to match, only match if all classes * are matched * @@ -521,7 +522,7 @@ gst_device_monitor_factory_has_classesv (GstDeviceMonitorFactory * factory, * Since: 1.4 */ gboolean -gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory * factory, +gst_device_provider_factory_has_classes (GstDeviceProviderFactory * factory, const gchar * classes) { gchar **classesv; @@ -529,7 +530,7 @@ gst_device_monitor_factory_has_classes (GstDeviceMonitorFactory * factory, classesv = g_strsplit (classes, "/", 0); - res = gst_device_monitor_factory_has_classesv (factory, classesv); + res = gst_device_provider_factory_has_classesv (factory, classesv); g_strfreev (classesv); @@ -543,38 +544,38 @@ typedef struct } FilterData; static gboolean -device_monitor_filter (GstPluginFeature * feature, FilterData * data) +device_provider_filter (GstPluginFeature * feature, FilterData * data) { gboolean res; - /* we only care about device monitor factories */ - if (G_UNLIKELY (!GST_IS_DEVICE_MONITOR_FACTORY (feature))) + /* we only care about device provider factories */ + if (G_UNLIKELY (!GST_IS_DEVICE_PROVIDER_FACTORY (feature))) return FALSE; res = (gst_plugin_feature_get_rank (feature) >= data->minrank) && - gst_device_monitor_factory_has_classes (GST_DEVICE_MONITOR_FACTORY_CAST + gst_device_provider_factory_has_classes (GST_DEVICE_PROVIDER_FACTORY_CAST (feature), data->classes); return res; } /** - * gst_device_monitor_factory_list_get_device_monitors: + * gst_device_provider_factory_list_get_device_providers: * @classes: a "/" separate list of klasses to match, only match if all classes * are matched * @minrank: Minimum rank * * Get a list of factories that match all of the given @classes. Only - * device monitors with a rank greater or equal to @minrank will be + * device providers with a rank greater or equal to @minrank will be * returned. The list of factories is returned by decreasing rank. * - * Returns: (transfer full) (element-type Gst.DeviceMonitorFactory): a #GList of - * #GstDeviceMonitorFactory device monitors. Use gst_plugin_feature_list_free() after + * Returns: (transfer full) (element-type Gst.DeviceProviderFactory): a #GList of + * #GstDeviceProviderFactory device providers. Use gst_plugin_feature_list_free() after * usage. * * Since: 1.4 */ -GList *gst_device_monitor_factory_list_get_device_monitors +GList *gst_device_provider_factory_list_get_device_providers (const gchar * classes, GstRank minrank) { GList *result; @@ -586,7 +587,7 @@ GList *gst_device_monitor_factory_list_get_device_monitors /* get the feature list using the filter */ result = gst_registry_feature_filter (gst_registry_get (), - (GstPluginFeatureFilter) device_monitor_filter, FALSE, &data); + (GstPluginFeatureFilter) device_provider_filter, FALSE, &data); /* sort on rank and name */ result = g_list_sort (result, gst_plugin_feature_rank_compare_func); diff --git a/gst/gstdeviceproviderfactory.h b/gst/gstdeviceproviderfactory.h new file mode 100644 index 000000000..0d93e2fab --- /dev/null +++ b/gst/gstdeviceproviderfactory.h @@ -0,0 +1,90 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> + * 2000,2004 Wim Taymans <wim@fluendo.com> + * 2012 Olivier Crete <olivier.crete@collabora.com> + * + * gstdeviceproviderfactory.h: Header for GstDeviceProviderFactory + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + + +#ifndef __GST_DEVICE_PROVIDER_FACTORY_H__ +#define __GST_DEVICE_PROVIDER_FACTORY_H__ + +/** + * GstDeviceProviderFactory: + * + * The opaque #GstDeviceProviderFactory data structure. + * + * Since: 1.4 + */ + +/** + * GstDeviceProviderFactoryClass: + * + * The opaque #GstDeviceProviderFactoryClass data structure. + * + * Since: 1.4 + */ +typedef struct _GstDeviceProviderFactory GstDeviceProviderFactory; +typedef struct _GstDeviceProviderFactoryClass GstDeviceProviderFactoryClass; + +#include <gst/gstconfig.h> +#include <gst/gstplugin.h> +#include <gst/gstpluginfeature.h> +#include <gst/gstdeviceprovider.h> + +G_BEGIN_DECLS + +#define GST_TYPE_DEVICE_PROVIDER_FACTORY (gst_device_provider_factory_get_type()) +#define GST_DEVICE_PROVIDER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEVICE_PROVIDER_FACTORY,\ + GstDeviceProviderFactory)) +#define GST_DEVICE_PROVIDER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEVICE_PROVIDER_FACTORY,\ + GstDeviceProviderFactoryClass)) +#define GST_IS_DEVICE_PROVIDER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEVICE_PROVIDER_FACTORY)) +#define GST_IS_DEVICE_PROVIDER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEVICE_PROVIDER_FACTORY)) +#define GST_DEVICE_PROVIDER_FACTORY_CAST(obj) ((GstDeviceProviderFactory *)(obj)) + +GType gst_device_provider_factory_get_type (void); + +GstDeviceProviderFactory * gst_device_provider_factory_find (const gchar *name); + +GType gst_device_provider_factory_get_device_provider_type (GstDeviceProviderFactory *factory); + +const gchar * gst_device_provider_factory_get_metadata (GstDeviceProviderFactory *factory, const gchar *key); +gchar ** gst_device_provider_factory_get_metadata_keys (GstDeviceProviderFactory *factory); + +GstDeviceProvider* gst_device_provider_factory_get (GstDeviceProviderFactory *factory) G_GNUC_MALLOC; +GstDeviceProvider* gst_device_provider_factory_get_by_name (const gchar *factoryname) G_GNUC_MALLOC; + +gboolean gst_device_provider_register (GstPlugin *plugin, const gchar *name, + guint rank, + GType type); + +gboolean gst_device_provider_factory_has_classesv (GstDeviceProviderFactory * factory, + gchar ** classes); + +gboolean gst_device_provider_factory_has_classes (GstDeviceProviderFactory *factory, + const gchar * classes); + +GList * gst_device_provider_factory_list_get_device_providers (const gchar *classes, + GstRank minrank) G_GNUC_MALLOC; + +G_END_DECLS + +#endif /* __GST_DEVICE_PROVIDER_FACTORY_H__ */ diff --git a/gst/gstglobaldevicemonitor.c b/gst/gstglobaldevicemonitor.c index 68900efe9..0c9dda961 100644 --- a/gst/gstglobaldevicemonitor.c +++ b/gst/gstglobaldevicemonitor.c @@ -22,12 +22,12 @@ /** * SECTION:gstglobaldevicemonitor * @short_description: A global device monitor and prober - * @see_also: #GstDevice, #GstDeviceMonitor + * @see_also: #GstDevice, #GstDeviceProvider * * Applications should create a #GstGlobalDeviceMonitor when they want * to probe, list and monitor devices of a specific type. The * #GstGlobalDeviceMonitor will create the appropriate - * #GstDeviceMonitor objects and manage them. It will then post + * #GstDeviceProvider objects and manage them. It will then post * messages on its #GstBus for devices that have been added and * removed. * @@ -48,7 +48,7 @@ struct _GstGlobalDeviceMonitorPrivate GstBus *bus; - GPtrArray *monitors; + GPtrArray *providers; guint cookie; GstCaps *caps; @@ -111,28 +111,28 @@ gst_global_device_monitor_init (GstGlobalDeviceMonitor * self) self->priv->bus = gst_bus_new (); gst_bus_set_flushing (self->priv->bus, TRUE); - self->priv->monitors = g_ptr_array_new (); + self->priv->providers = g_ptr_array_new (); self->priv->caps = gst_caps_new_any (); self->priv->classes = g_strdup (""); factories = - gst_device_monitor_factory_list_get_device_monitors (self->priv->classes, - 1); + gst_device_provider_factory_list_get_device_providers (self->priv-> + classes, 1); while (factories) { - GstDeviceMonitorFactory *factory = factories->data; - GstDeviceMonitor *monitor; + GstDeviceProviderFactory *factory = factories->data; + GstDeviceProvider *provider; factories = g_list_remove (factories, factory); - monitor = gst_device_monitor_factory_get (factory); - if (monitor) { - GstBus *bus = gst_device_monitor_get_bus (monitor); + provider = gst_device_provider_factory_get (factory); + if (provider) { + GstBus *bus = gst_device_provider_get_bus (provider); gst_bus_enable_sync_message_emission (bus); g_signal_connect (bus, "sync-message", G_CALLBACK (bus_sync_message), self); - g_ptr_array_add (self->priv->monitors, monitor); + g_ptr_array_add (self->priv->providers, provider); } gst_object_unref (factory); @@ -143,16 +143,16 @@ gst_global_device_monitor_init (GstGlobalDeviceMonitor * self) static void gst_global_device_monitor_remove (GstGlobalDeviceMonitor * self, guint i) { - GstDeviceMonitor *monitor = g_ptr_array_index (self->priv->monitors, i); + GstDeviceProvider *provider = g_ptr_array_index (self->priv->providers, i); GstBus *bus; - g_ptr_array_remove_index_fast (self->priv->monitors, i); + g_ptr_array_remove_index_fast (self->priv->providers, i); - bus = gst_device_monitor_get_bus (monitor); + bus = gst_device_provider_get_bus (provider); g_signal_handlers_disconnect_by_func (bus, bus_sync_message, self); gst_object_unref (bus); - gst_object_unref (monitor); + gst_object_unref (provider); } static void @@ -162,11 +162,11 @@ gst_global_device_monitor_dispose (GObject * object) g_return_if_fail (self->priv->started == FALSE); - if (self->priv->monitors) { - while (self->priv->monitors->len) - gst_global_device_monitor_remove (self, self->priv->monitors->len - 1); - g_ptr_array_unref (self->priv->monitors); - self->priv->monitors = NULL; + if (self->priv->providers) { + while (self->priv->providers->len) + gst_global_device_monitor_remove (self, self->priv->providers->len - 1); + g_ptr_array_unref (self->priv->providers); + self->priv->providers = NULL; } gst_caps_replace (&self->priv->caps, NULL); @@ -178,7 +178,7 @@ gst_global_device_monitor_dispose (GObject * object) /** * gst_global_device_monitor_get_devices: - * @monitor: A #GstDeviceMonitor + * @monitor: A #GstDeviceProvider * * Gets a list of devices from all of the relevant monitors. This may actually * probe the hardware if the global monitor is not currently started. @@ -207,15 +207,15 @@ again: cookie = monitor->priv->cookie; - for (i = 0; i < monitor->priv->monitors->len; i++) { + for (i = 0; i < monitor->priv->providers->len; i++) { GList *tmpdev; - GstDeviceMonitor *device_monitor = - gst_object_ref (g_ptr_array_index (monitor->priv->monitors, i)); + GstDeviceProvider *provider = + gst_object_ref (g_ptr_array_index (monitor->priv->providers, i)); GList *item; GST_OBJECT_UNLOCK (monitor); - tmpdev = gst_device_monitor_get_devices (device_monitor); + tmpdev = gst_device_provider_get_devices (provider); for (item = tmpdev; item; item = item->next) { GstDevice *dev = GST_DEVICE (item->data); @@ -228,7 +228,7 @@ again: } g_list_free_full (tmpdev, gst_object_unref); - gst_object_unref (device_monitor); + gst_object_unref (provider); GST_OBJECT_LOCK (monitor); @@ -263,20 +263,20 @@ gst_global_device_monitor_start (GstGlobalDeviceMonitor * monitor) GST_OBJECT_LOCK (monitor); - if (monitor->priv->monitors->len == 0) { + if (monitor->priv->providers->len == 0) { GST_OBJECT_UNLOCK (monitor); return FALSE; } gst_bus_set_flushing (monitor->priv->bus, FALSE); - for (i = 0; i < monitor->priv->monitors->len; i++) { - if (!gst_device_monitor_start (g_ptr_array_index (monitor->priv->monitors, + for (i = 0; i < monitor->priv->providers->len; i++) { + if (!gst_device_provider_start (g_ptr_array_index (monitor->priv->providers, i))) { gst_bus_set_flushing (monitor->priv->bus, TRUE); for (; i != 0; i--) - gst_device_monitor_stop (g_ptr_array_index (monitor->priv->monitors, + gst_device_provider_stop (g_ptr_array_index (monitor->priv->providers, i - 1)); GST_OBJECT_UNLOCK (monitor); @@ -292,7 +292,7 @@ gst_global_device_monitor_start (GstGlobalDeviceMonitor * monitor) /** * gst_global_device_monitor_stop: - * @monitor: A #GstDeviceMonitor + * @monitor: A #GstDeviceProvider * * Stops monitoring the devices. * @@ -308,8 +308,8 @@ gst_global_device_monitor_stop (GstGlobalDeviceMonitor * monitor) gst_bus_set_flushing (monitor->priv->bus, TRUE); GST_OBJECT_LOCK (monitor); - for (i = 0; i < monitor->priv->monitors->len; i++) - gst_device_monitor_stop (g_ptr_array_index (monitor->priv->monitors, i)); + for (i = 0; i < monitor->priv->providers->len; i++) + gst_device_provider_stop (g_ptr_array_index (monitor->priv->providers, i)); monitor->priv->started = FALSE; GST_OBJECT_UNLOCK (monitor); @@ -345,15 +345,16 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor, g_free (monitor->priv->classes); monitor->priv->classes = g_strdup (classes); - factories = gst_device_monitor_factory_list_get_device_monitors (classes, 1); + factories = gst_device_provider_factory_list_get_device_providers (classes, + 1); - for (i = 0; i < monitor->priv->monitors->len; i++) { - GstDeviceMonitor *dev_monitor; - GstDeviceMonitorFactory *f; + for (i = 0; i < monitor->priv->providers->len; i++) { + GstDeviceProvider *provider; + GstDeviceProviderFactory *f; GList *item; - dev_monitor = g_ptr_array_index (monitor->priv->monitors, i); - f = gst_device_monitor_get_factory (dev_monitor); + provider = g_ptr_array_index (monitor->priv->providers, i); + f = gst_device_provider_get_factory (provider); item = g_list_find (factories, f); @@ -364,7 +365,7 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor, factories = g_list_remove_link (factories, item); gst_object_unref (f); } else { - /* If it's not in our list, them remove it from the list of monitors. + /* If it's not in our list, them remove it from the list of providers. */ monitor->priv->cookie++; @@ -374,20 +375,20 @@ gst_global_device_monitor_set_classes_filter (GstGlobalDeviceMonitor * monitor, } while (factories) { - GstDeviceMonitorFactory *factory = factories->data; - GstDeviceMonitor *device_monitor; + GstDeviceProviderFactory *factory = factories->data; + GstDeviceProvider *provider; factories = g_list_remove (factories, factory); - device_monitor = gst_device_monitor_factory_get (factory); - if (device_monitor) { - GstBus *bus = gst_device_monitor_get_bus (device_monitor); + provider = gst_device_provider_factory_get (factory); + if (provider) { + GstBus *bus = gst_device_provider_get_bus (provider); gst_bus_enable_sync_message_emission (bus); g_signal_connect (bus, "sync-message", G_CALLBACK (bus_sync_message), monitor); gst_object_unref (bus); - g_ptr_array_add (monitor->priv->monitors, device_monitor); + g_ptr_array_add (monitor->priv->providers, provider); monitor->priv->cookie++; } @@ -484,7 +485,7 @@ gst_global_device_monitor_new (void) /** * gst_global_device_monitor_get_bus: - * @monitor: a #GstDeviceMonitor + * @monitor: a #GstDeviceProvider * * Gets the #GstBus of this #GstGlobalDeviceMonitor * diff --git a/gst/gstglobaldevicemonitor.h b/gst/gstglobaldevicemonitor.h index b92fd4023..c0b623a55 100644 --- a/gst/gstglobaldevicemonitor.h +++ b/gst/gstglobaldevicemonitor.h @@ -25,8 +25,8 @@ #include <gst/gstobject.h> #include <gst/gstdevice.h> -#include <gst/gstdevicemonitor.h> -#include <gst/gstdevicemonitorfactory.h> +#include <gst/gstdeviceprovider.h> +#include <gst/gstdeviceproviderfactory.h> G_BEGIN_DECLS diff --git a/gst/gstmessage.c b/gst/gstmessage.c index 5555fb237..9119a003d 100644 --- a/gst/gstmessage.c +++ b/gst/gstmessage.c @@ -2340,7 +2340,7 @@ gst_message_parse_have_context (GstMessage * message, GstContext ** context) * @device: (transfer none): The new #GstDevice * * Creates a new device-added message. The device-added message is produced by - * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the appearance + * #GstDeviceProvider or a #GstGlobalDeviceMonitor. They announce the appearance * of monitored devices. * * Returns: a newly allocated #GstMessage @@ -2370,7 +2370,7 @@ gst_message_new_device_added (GstObject * src, GstDevice * device) * pointer to the new #GstDevice, or %NULL * * Parses a device-added message. The device-added message is produced by - * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the appearance + * #GstDeviceProvider or a #GstGlobalDeviceMonitor. It announces the appearance * of monitored devices. * * Since: 1.4 @@ -2392,7 +2392,7 @@ gst_message_parse_device_added (GstMessage * message, GstDevice ** device) * @device: (transfer none): The removed #GstDevice * * Creates a new device-removed message. The device-removed message is produced - * by #GstDeviceMonitor or a #GstGlobalDeviceMonitor. They announce the + * by #GstDeviceProvider or a #GstGlobalDeviceMonitor. They announce the * disappearance of monitored devices. * * Returns: a newly allocated #GstMessage @@ -2422,7 +2422,7 @@ gst_message_new_device_removed (GstObject * src, GstDevice * device) * pointer to the removed #GstDevice, or %NULL * * Parses a device-removed message. The device-removed message is produced by - * #GstDeviceMonitor or a #GstGlobalDeviceMonitor. It announces the + * #GstDeviceProvider or a #GstGlobalDeviceMonitor. It announces the * disappearance of monitored devices. * * Since: 1.4 diff --git a/gst/gstmessage.h b/gst/gstmessage.h index 8c8e9a8e3..7d4282e74 100644 --- a/gst/gstmessage.h +++ b/gst/gstmessage.h @@ -105,9 +105,9 @@ typedef struct _GstMessage GstMessage; * filter for GST_MESSAGE_EXTENDED and then check the result for the * specific type. (Since 1.4) * @GST_MESSAGE_DEVICE_ADDED: Message indicating a #GstDevice was added to - * a #GstDeviceMonitor (Since 1.4) + * a #GstDeviceProvider (Since 1.4) * @GST_MESSAGE_DEVICE_REMOVED: Message indicating a #GstDevice was removed - * from a #GstDeviceMonitor (Since 1.4) + * from a #GstDeviceProvider (Since 1.4) * @GST_MESSAGE_ANY: mask for all of the above messages. * * The different message types that are available. diff --git a/gst/gstregistry.c b/gst/gstregistry.c index 7d612f83d..73fdf0edb 100644 --- a/gst/gstregistry.c +++ b/gst/gstregistry.c @@ -127,7 +127,7 @@ #include "gstinfo.h" #include "gsterror.h" #include "gstregistry.h" -#include "gstdevicemonitorfactory.h" +#include "gstdeviceproviderfactory.h" #include "gstpluginloader.h" @@ -166,7 +166,7 @@ struct _GstRegistryPrivate guint32 efl_cookie; GList *typefind_factory_list; guint32 tfl_cookie; - GList *device_monitor_factory_list; + GList *device_provider_factory_list; guint32 dmfl_cookie; }; @@ -317,10 +317,10 @@ gst_registry_finalize (GObject * object) gst_plugin_feature_list_free (registry->priv->typefind_factory_list); } - if (registry->priv->device_monitor_factory_list) { + if (registry->priv->device_provider_factory_list) { GST_DEBUG_OBJECT (registry, - "Cleaning up cached device monitor factory list"); - gst_plugin_feature_list_free (registry->priv->device_monitor_factory_list); + "Cleaning up cached device provider factory list"); + gst_plugin_feature_list_free (registry->priv->device_provider_factory_list); } G_OBJECT_CLASS (parent_class)->finalize (object); @@ -789,20 +789,20 @@ gst_registry_get_typefind_factory_list (GstRegistry * registry) static GList * -gst_registry_get_device_monitor_factory_list (GstRegistry * registry) +gst_registry_get_device_provider_factory_list (GstRegistry * registry) { GList *list; GST_OBJECT_LOCK (registry); gst_registry_get_feature_list_or_create (registry, - ®istry->priv->device_monitor_factory_list, - ®istry->priv->dmfl_cookie, GST_TYPE_DEVICE_MONITOR_FACTORY); + ®istry->priv->device_provider_factory_list, + ®istry->priv->dmfl_cookie, GST_TYPE_DEVICE_PROVIDER_FACTORY); /* Return reffed copy */ list = gst_plugin_feature_list_copy (registry-> - priv->device_monitor_factory_list); + priv->device_provider_factory_list); GST_OBJECT_UNLOCK (registry); @@ -953,8 +953,8 @@ gst_registry_get_feature_list (GstRegistry * registry, GType type) return gst_registry_get_element_factory_list (registry); else if (type == GST_TYPE_TYPE_FIND_FACTORY) return gst_registry_get_typefind_factory_list (registry); - else if (type == GST_TYPE_DEVICE_MONITOR_FACTORY) - return gst_registry_get_device_monitor_factory_list (registry); + else if (type == GST_TYPE_DEVICE_PROVIDER_FACTORY) + return gst_registry_get_device_provider_factory_list (registry); data.type = type; data.name = NULL; diff --git a/gst/gstregistrybinary.c b/gst/gstregistrybinary.c index ee4a7a089..7b8556e68 100644 --- a/gst/gstregistrybinary.c +++ b/gst/gstregistrybinary.c @@ -56,7 +56,7 @@ #include <gst/gstelement.h> #include <gst/gsttypefind.h> #include <gst/gsttypefindfactory.h> -#include <gst/gstdevicemonitorfactory.h> +#include <gst/gstdeviceproviderfactory.h> #include <gst/gsturi.h> #include <gst/gstinfo.h> #include <gst/gstenumtypes.h> @@ -526,7 +526,7 @@ priv_gst_registry_binary_read_cache (GstRegistry * registry, /* make sure these types exist */ GST_TYPE_ELEMENT_FACTORY; GST_TYPE_TYPE_FIND_FACTORY; - GST_TYPE_DEVICE_MONITOR_FACTORY; + GST_TYPE_DEVICE_PROVIDER_FACTORY; #ifndef GST_DISABLE_GST_DEBUG timer = g_timer_new (); diff --git a/gst/gstregistrychunks.c b/gst/gstregistrychunks.c index fcacd6b6d..f8548654c 100644 --- a/gst/gstregistrychunks.c +++ b/gst/gstregistrychunks.c @@ -33,7 +33,7 @@ #include <gst/gstelement.h> #include <gst/gsttypefind.h> #include <gst/gsttypefindfactory.h> -#include <gst/gstdevicemonitorfactory.h> +#include <gst/gstdeviceproviderfactory.h> #include <gst/gsturi.h> #include <gst/gstinfo.h> #include <gst/gstenumtypes.h> @@ -333,17 +333,17 @@ gst_registry_chunks_save_feature (GList ** list, GstPluginFeature * feature) } else { gst_registry_chunks_save_const_string (list, ""); } - } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) { - GstRegistryChunkDeviceMonitorFactory *tff; - GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (feature); + } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) { + GstRegistryChunkDeviceProviderFactory *tff; + GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (feature); /* Initialize with zeroes because of struct padding and * valgrind complaining about copying unitialized memory */ - tff = g_slice_new0 (GstRegistryChunkDeviceMonitorFactory); + tff = g_slice_new0 (GstRegistryChunkDeviceProviderFactory); chk = gst_registry_chunks_make_data (tff, - sizeof (GstRegistryChunkDeviceMonitorFactory)); + sizeof (GstRegistryChunkDeviceProviderFactory)); pf = (GstRegistryChunkPluginFeature *) tff; @@ -668,16 +668,16 @@ gst_registry_chunks_load_feature (GstRegistry * registry, gchar ** in, factory->extensions[i - 1] = str; } } - } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) { - GstRegistryChunkDeviceMonitorFactory *dmf; - GstDeviceMonitorFactory *factory = GST_DEVICE_MONITOR_FACTORY (feature); + } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) { + GstRegistryChunkDeviceProviderFactory *dmf; + GstDeviceProviderFactory *factory = GST_DEVICE_PROVIDER_FACTORY (feature); const gchar *meta_data_str; align (*in); GST_DEBUG ("Reading/casting for GstRegistryChunkPluginFeature at address %p", *in); - unpack_element (*in, dmf, GstRegistryChunkDeviceMonitorFactory, end, fail); + unpack_element (*in, dmf, GstRegistryChunkDeviceProviderFactory, end, fail); pf = (GstRegistryChunkPluginFeature *) dmf; diff --git a/gst/gstregistrychunks.h b/gst/gstregistrychunks.h index e2c86baaa..57ced703f 100644 --- a/gst/gstregistrychunks.h +++ b/gst/gstregistrychunks.h @@ -132,15 +132,15 @@ typedef struct _GstRegistryChunkTypeFindFactory } GstRegistryChunkTypeFindFactory; /* - * GstRegistryChunkDeviceMonitorFactory: + * GstRegistryChunkDeviceProviderFactory: * - * A structure containing the device monitor factory fields + * A structure containing the device provider factory fields */ -typedef struct _GstRegistryChunkDeviceMonitorFactory +typedef struct _GstRegistryChunkDeviceProviderFactory { GstRegistryChunkPluginFeature plugin_feature; -} GstRegistryChunkDeviceMonitorFactory; +} GstRegistryChunkDeviceProviderFactory; /* * GstRegistryChunkPadTemplate: diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c index 543bd1ac4..992f4ffc5 100644 --- a/tools/gst-inspect.c +++ b/tools/gst-inspect.c @@ -1139,7 +1139,7 @@ print_plugin_features (GstPlugin * plugin) gint num_features = 0; gint num_elements = 0; gint num_typefinders = 0; - gint num_devmonitors = 0; + gint num_devproviders = 0; gint num_other = 0; origlist = features = @@ -1180,14 +1180,14 @@ print_plugin_features (GstPlugin * plugin) gst_plugin_feature_get_name (feature)); num_typefinders++; - } else if (GST_IS_DEVICE_MONITOR_FACTORY (feature)) { - GstDeviceMonitorFactory *factory; + } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) { + GstDeviceProviderFactory *factory; - factory = GST_DEVICE_MONITOR_FACTORY (feature); + factory = GST_DEVICE_PROVIDER_FACTORY (feature); n_print (" %s: %s\n", GST_OBJECT_NAME (factory), - gst_device_monitor_factory_get_metadata (factory, + gst_device_provider_factory_get_metadata (factory, GST_ELEMENT_METADATA_LONGNAME)); - num_devmonitors++; + num_devproviders++; } else if (feature) { n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)), g_type_name (G_OBJECT_TYPE (feature))); @@ -1205,8 +1205,8 @@ print_plugin_features (GstPlugin * plugin) n_print (" +-- %d elements\n", num_elements); if (num_typefinders > 0) n_print (" +-- %d typefinders\n", num_typefinders); - if (num_devmonitors > 0) - n_print (" +-- %d device monitors\n", num_devmonitors); + if (num_devproviders > 0) + n_print (" +-- %d device providers\n", num_devproviders); if (num_other > 0) n_print (" +-- %d other objects\n", num_other); diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index fc74f2f57..8579962af 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -415,31 +415,31 @@ EXPORTS gst_device_get_type gst_device_has_classes gst_device_has_classesv - gst_device_monitor_can_monitor - gst_device_monitor_class_add_metadata - gst_device_monitor_class_add_static_metadata - gst_device_monitor_class_get_metadata - gst_device_monitor_class_set_metadata - gst_device_monitor_class_set_static_metadata - gst_device_monitor_device_add - gst_device_monitor_device_remove - gst_device_monitor_factory_find - gst_device_monitor_factory_get - gst_device_monitor_factory_get_by_name - gst_device_monitor_factory_get_device_monitor_type - gst_device_monitor_factory_get_metadata - gst_device_monitor_factory_get_metadata_keys - gst_device_monitor_factory_get_type - gst_device_monitor_factory_has_classes - gst_device_monitor_factory_has_classesv - gst_device_monitor_factory_list_get_device_monitors - gst_device_monitor_get_bus - gst_device_monitor_get_devices - gst_device_monitor_get_factory - gst_device_monitor_get_type - gst_device_monitor_register - gst_device_monitor_start - gst_device_monitor_stop + gst_device_provider_can_monitor + gst_device_provider_class_add_metadata + gst_device_provider_class_add_static_metadata + gst_device_provider_class_get_metadata + gst_device_provider_class_set_metadata + gst_device_provider_class_set_static_metadata + gst_device_provider_device_add + gst_device_provider_device_remove + gst_device_provider_factory_find + gst_device_provider_factory_get + gst_device_provider_factory_get_by_name + gst_device_provider_factory_get_device_provider_type + gst_device_provider_factory_get_metadata + gst_device_provider_factory_get_metadata_keys + gst_device_provider_factory_get_type + gst_device_provider_factory_has_classes + gst_device_provider_factory_has_classesv + gst_device_provider_factory_list_get_device_providers + gst_device_provider_get_bus + gst_device_provider_get_devices + gst_device_provider_get_factory + gst_device_provider_get_type + gst_device_provider_register + gst_device_provider_start + gst_device_provider_stop gst_device_reconfigure_element gst_double_range_get_type gst_element_abort_state |