gstreamer/gst-libs/gst/propertyprobe/propertyprobe.c

347 lines
9.2 KiB
C
Raw Normal View History

/* GStreamer PropertyProbe
* Copyright (C) 2003 David Schleef <ds@schleef.org>
*
* property_probe.c: property_probe design virtual class function wrappers
*
* 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.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
#include "propertyprobe.h"
enum {
SIGNAL_PROBE_NEEDED,
LAST_SIGNAL
};
static void gst_property_probe_iface_init (GstPropertyProbeInterface *iface);
static guint gst_property_probe_signals[LAST_SIGNAL] = { 0 };
GType
gst_property_probe_get_type (void)
{
static GType gst_property_probe_type = 0;
if (!gst_property_probe_type) {
static const GTypeInfo gst_property_probe_info = {
sizeof (GstPropertyProbeInterface),
(GBaseInitFunc) gst_property_probe_iface_init,
NULL,
NULL,
NULL,
NULL,
0,
0,
NULL,
};
gst_property_probe_type =
g_type_register_static (G_TYPE_INTERFACE,
"GstPropertyProbe",
&gst_property_probe_info, 0);
}
return gst_property_probe_type;
}
static void
gst_property_probe_iface_init (GstPropertyProbeInterface *iface)
{
static gboolean initialized = FALSE;
if (!initialized) {
gst_property_probe_signals[SIGNAL_PROBE_NEEDED] =
g_signal_new ("probe-needed", G_TYPE_FROM_CLASS (iface), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstPropertyProbeInterface, probe_needed),
NULL, NULL, g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
initialized = TRUE;
}
/* default virtual functions */
iface->get_properties = NULL;
iface->get_values = NULL;
}
/**
* gst_property_probe_get_properties:
* @probe: the #GstPropertyProbe to get the properties for.
*
* Get a list of properties for which probing is supported.
*
* Returns the list of properties for which probing is supported
* by this element.
*/
const GList *
gst_property_probe_get_properties (GstPropertyProbe *probe)
{
GstPropertyProbeInterface *iface;
g_return_val_if_fail (probe != NULL, NULL);
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
if (iface->get_properties)
return iface->get_properties (probe);
return NULL;
}
const GParamSpec *
gst_property_probe_get_property (GstPropertyProbe *probe,
const gchar *name)
{
const GList *pspecs = gst_property_probe_get_properties (probe);
g_return_val_if_fail (probe != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
while (pspecs) {
const GParamSpec *pspec = pspecs->data;
if (!strcmp (pspec->name, name))
return pspec;
pspecs = pspecs->next;
}
return NULL;
}
void
gst_property_probe_probe_property (GstPropertyProbe *probe,
const GParamSpec *pspec)
{
GstPropertyProbeInterface *iface;
g_return_if_fail (probe != NULL);
g_return_if_fail (pspec != NULL);
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
if (iface->probe_property)
iface->probe_property (probe, pspec->param_id, pspec);
}
/**
* gst_property_probe_probe_property_name:
* @probe: the #GstPropertyProbe to check.
* @name: name of the property to return.
*
* Returns the #GParamSpec for the given property. It's similar to
* g_object_class_find_property (), except that this function only
* takes "probe'able" properties into account.
*
* Returns: the #GParamSpec that belongs to the given property.
*/
void
gst_property_probe_probe_property_name (GstPropertyProbe *probe,
const gchar *name)
{
const GParamSpec *pspec;
g_return_if_fail (probe != NULL);
g_return_if_fail (name != NULL);
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
if (!pspec) {
g_warning ("No such property %s", name);
return;
}
gst_property_probe_probe_property (probe, pspec);
}
/**
* gst_property_probe_needs_probe:
* @probe: the #GstPropertyProbe object to which the given property belongs.
* @pspec: a #GParamSpec that identifies the property to check.
*
* Checks whether a property needs a probe. This might be because
* the property wasn't initialized before, or because host setup
* changed. This might be, for example, because a new device was
* added, and thus device probing needs to be refreshed to display
* the new device.
*
* Returns: TRUE if the property needs a new probe, FALSE if not.
*/
gboolean
gst_property_probe_needs_probe (GstPropertyProbe *probe,
const GParamSpec *pspec)
{
GstPropertyProbeInterface *iface;
g_return_val_if_fail (probe != NULL, FALSE);
g_return_val_if_fail (pspec != NULL, FALSE);
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
if (iface->needs_probe)
return iface->needs_probe (probe, pspec->param_id, pspec);
return FALSE;
}
/**
* gst_property_probe_needs_probe_name:
* @probe: the #GstPropertyProbe object to which the given property belongs.
* @name: the name of the property to check.
*
* Same as gst_property_probe_needs_probe ().
*
* Returns: TRUE if the property needs a new probe, FALSE if not.
*/
gboolean
gst_property_probe_needs_probe_name (GstPropertyProbe *probe,
const gchar *name)
{
const GParamSpec *pspec;
g_return_val_if_fail (probe != NULL, FALSE);
g_return_val_if_fail (name != NULL, FALSE);
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
if (!pspec) {
g_warning ("No such property %s", name);
return FALSE;
}
return gst_property_probe_needs_probe (probe, pspec);
}
/**
* gst_property_probe_get_values:
* @probe: the #GstPropertyProbe object.
* @pspec: the #GParamSpec property identifier.
*
* Gets the possible (probed) values for the given property,
* requires the property to have been probed before.
*
* Returns: A list of valid values for the given property.
*/
GValueArray *
gst_property_probe_get_values (GstPropertyProbe *probe,
const GParamSpec *pspec)
{
GstPropertyProbeInterface *iface;
g_return_val_if_fail (probe != NULL, NULL);
g_return_val_if_fail (pspec != NULL, NULL);
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
if (iface->get_values)
return iface->get_values (probe, pspec->param_id, pspec);
return NULL;
}
/**
* gst_property_probe_get_values_name:
* @probe: the #GstPropertyProbe object.
* @name: the name of the property to get values for.
*
* Same as gst_property_probe_get_values ().
*
* Returns: A list of valid values for the given property.
*/
GValueArray *
gst_property_probe_get_values_name (GstPropertyProbe *probe,
const gchar *name)
{
const GParamSpec *pspec;
g_return_val_if_fail (probe != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
if (!pspec) {
g_warning ("No such property %s", name);
return NULL;
}
return gst_property_probe_get_values (probe, pspec);
}
/**
* gst_property_probe_probe_and_get_values:
* @probe: the #GstPropertyProbe object.
* @pspec: The #GParamSpec property identifier.
*
* Check whether the given property requires a new probe. If so,
* fo the probe. After that, retrieve a value list. Meant as a
* utility function that wraps the above functions.
*
* Return: the list of valid values for this property.
*/
GValueArray *
gst_property_probe_probe_and_get_values (GstPropertyProbe *probe,
const GParamSpec *pspec)
{
GstPropertyProbeInterface *iface;
g_return_val_if_fail (probe != NULL, NULL);
g_return_val_if_fail (pspec != NULL, NULL);
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
if (gst_property_probe_needs_probe (probe, pspec))
gst_property_probe_probe_property (probe, pspec);
return gst_property_probe_get_values (probe, pspec);
}
/**
* gst_property_probe_probe_and_get_values_name:
* @probe: the #GstPropertyProbe object.
* @name: the name of the property to get values for.
*
* Same as gst_property_probe_probe_and_get_values ().
*
* Return: the list of valid values for this property.
*/
GValueArray *
gst_property_probe_probe_and_get_values_name (GstPropertyProbe *probe,
const gchar *name)
{
const GParamSpec *pspec;
g_return_val_if_fail (probe != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
if (!pspec) {
g_warning ("No such property %s", name);
return NULL;
}
return gst_property_probe_probe_and_get_values (probe, pspec);
}