mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
controller: emulate _get_g_value_array()
Add a default implementation on the baseclass.
This commit is contained in:
parent
772c58e255
commit
c4072744b7
1 changed files with 71 additions and 2 deletions
|
@ -316,6 +316,20 @@ gst_control_binding_get_value_array (GstControlBinding * self,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#define CONVERT_ARRAY(type,TYPE) \
|
||||
{ \
|
||||
g##type *v = g_new (g##type,n_values); \
|
||||
ret = gst_control_binding_get_value_array (self, timestamp, interval, \
|
||||
n_values, v); \
|
||||
if (ret) { \
|
||||
for (i = 0; i < n_values; i++) { \
|
||||
g_value_init (&values[i], G_TYPE_##TYPE); \
|
||||
g_value_set_##type (&values[i], v[i]); \
|
||||
} \
|
||||
} \
|
||||
g_free (v); \
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_control_binding_get_g_value_array:
|
||||
* @self: the control binding
|
||||
|
@ -352,8 +366,63 @@ gst_control_binding_get_g_value_array (GstControlBinding * self,
|
|||
ret =
|
||||
klass->get_g_value_array (self, timestamp, interval, n_values, values);
|
||||
} else {
|
||||
GST_WARNING_OBJECT (self, "missing get_g_value_array implementation");
|
||||
// FIXME(ensonic): emulate
|
||||
guint i;
|
||||
GType type, base;
|
||||
|
||||
base = type = G_PARAM_SPEC_VALUE_TYPE (GST_CONTROL_BINDING_PSPEC (self));
|
||||
while ((type = g_type_parent (type)))
|
||||
base = type;
|
||||
|
||||
GST_INFO_OBJECT (self, "missing get_g_value_array implementation, we're "
|
||||
"emulating it");
|
||||
switch (base) {
|
||||
case G_TYPE_INT:
|
||||
CONVERT_ARRAY (int, INT);
|
||||
break;
|
||||
case G_TYPE_UINT:
|
||||
CONVERT_ARRAY (uint, UINT);
|
||||
break;
|
||||
case G_TYPE_LONG:
|
||||
CONVERT_ARRAY (long, LONG);
|
||||
break;
|
||||
case G_TYPE_ULONG:
|
||||
CONVERT_ARRAY (ulong, ULONG);
|
||||
break;
|
||||
case G_TYPE_INT64:
|
||||
CONVERT_ARRAY (int64, INT64);
|
||||
break;
|
||||
case G_TYPE_UINT64:
|
||||
CONVERT_ARRAY (uint64, UINT64);
|
||||
break;
|
||||
case G_TYPE_FLOAT:
|
||||
CONVERT_ARRAY (float, FLOAT);
|
||||
break;
|
||||
case G_TYPE_DOUBLE:
|
||||
CONVERT_ARRAY (double, DOUBLE);
|
||||
break;
|
||||
case G_TYPE_BOOLEAN:
|
||||
CONVERT_ARRAY (boolean, BOOLEAN);
|
||||
break;
|
||||
case G_TYPE_ENUM:
|
||||
{
|
||||
gint *v = g_new (gint, n_values);
|
||||
ret = gst_control_binding_get_value_array (self, timestamp, interval,
|
||||
n_values, v);
|
||||
if (ret) {
|
||||
for (i = 0; i < n_values; i++) {
|
||||
g_value_init (&values[i], type);
|
||||
g_value_set_enum (&values[i], v[i]);
|
||||
}
|
||||
}
|
||||
g_free (v);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
GST_WARNING ("incomplete implementation for paramspec type '%s'",
|
||||
G_PARAM_SPEC_TYPE_NAME (GST_CONTROL_BINDING_PSPEC (self)));
|
||||
GST_CONTROL_BINDING_PSPEC (self) = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue