diff options
Diffstat (limited to 'tests/check/libs/controller.c')
-rw-r--r-- | tests/check/libs/controller.c | 2627 |
1 files changed, 928 insertions, 1699 deletions
diff --git a/tests/check/libs/controller.c b/tests/check/libs/controller.c index 05cd432..68388c7 100644 --- a/tests/check/libs/controller.c +++ b/tests/check/libs/controller.c @@ -26,69 +26,108 @@ #endif #include <gst/gst.h> #include <gst/check/gstcheck.h> -#include <gst/controller/gstcontroller.h> -#include <gst/controller/gstcontrolsource.h> #include <gst/controller/gstinterpolationcontrolsource.h> #include <gst/controller/gstlfocontrolsource.h> +#include <gst/controller/gsttriggercontrolsource.h> +#include <gst/controller/gstdirectcontrolbinding.h> -/* LOCAL TEST ELEMENT */ +/* enum for text element */ + +#define GST_TYPE_TEST_ENUM (gst_test_enum_get_type ()) + +typedef enum +{ + ENUM_V0 = 0, + ENUM_V10 = 10, + ENUM_V11, + ENUM_V12, + ENUM_V255 = 255 +} GstTestEnum; + +static GType +gst_test_enum_get_type (void) +{ + static gsize gtype = 0; + static const GEnumValue values[] = { + {ENUM_V0, "ENUM_V0", "0"}, + {ENUM_V10, "ENUM_V10", "10"}, + {ENUM_V11, "ENUM_V11", "11"}, + {ENUM_V12, "ENUM_V12", "12"}, + {ENUM_V255, "ENUM_V255", "255"}, + {0, NULL, NULL} + }; + + if (g_once_init_enter (>ype)) { + GType tmp = g_enum_register_static ("GstTestEnum", values); + g_once_init_leave (>ype, tmp); + } + + return (GType) gtype; +} + +/* local test element */ enum { - ARG_ULONG = 1, - ARG_FLOAT, - ARG_DOUBLE, - ARG_BOOLEAN, - ARG_READONLY, - ARG_STATIC, - ARG_CONSTRUCTONLY, - ARG_COUNT + PROP_INT = 1, + PROP_FLOAT, + PROP_DOUBLE, + PROP_BOOLEAN, + PROP_ENUM, + PROP_READONLY, + PROP_STATIC, + PROP_CONSTRUCTONLY, + PROP_COUNT }; -#define GST_TYPE_TEST_MONO_SOURCE (gst_test_mono_source_get_type ()) -#define GST_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSource)) -#define GST_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSourceClass)) -#define GST_IS_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_MONO_SOURCE)) -#define GST_IS_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_MONO_SOURCE)) -#define GST_TEST_MONO_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSourceClass)) +#define GST_TYPE_TEST_OBJ (gst_test_obj_get_type ()) +#define GST_TEST_OBJ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_OBJ, GstTestObj)) +#define GST_TEST_OBJ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_OBJ, GstTestObjClass)) +#define GST_IS_TEST_OBJ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_OBJ)) +#define GST_IS_TEST_OBJ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_OBJ)) +#define GST_TEST_OBJ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_OBJ, GstTestObjClass)) -typedef struct _GstTestMonoSource GstTestMonoSource; -typedef struct _GstTestMonoSourceClass GstTestMonoSourceClass; +typedef struct _GstTestObj GstTestObj; +typedef struct _GstTestObjClass GstTestObjClass; -struct _GstTestMonoSource +struct _GstTestObj { GstElement parent; - gulong val_ulong; + gint val_int; gfloat val_float; gdouble val_double; gboolean val_boolean; + GstTestEnum val_enum; }; -struct _GstTestMonoSourceClass +struct _GstTestObjClass { GstElementClass parent_class; }; -static GType gst_test_mono_source_get_type (void); +static GType gst_test_obj_get_type (void); static void -gst_test_mono_source_get_property (GObject * object, +gst_test_obj_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - GstTestMonoSource *self = GST_TEST_MONO_SOURCE (object); + GstTestObj *self = GST_TEST_OBJ (object); switch (property_id) { - case ARG_ULONG: - g_value_set_ulong (value, self->val_ulong); + case PROP_INT: + g_value_set_int (value, self->val_int); break; - case ARG_FLOAT: + case PROP_FLOAT: g_value_set_float (value, self->val_float); break; - case ARG_DOUBLE: + case PROP_DOUBLE: g_value_set_double (value, self->val_double); break; - case ARG_BOOLEAN: + case PROP_BOOLEAN: g_value_set_boolean (value, self->val_boolean); break; + case PROP_ENUM: + g_value_set_enum (value, self->val_enum); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -96,29 +135,33 @@ gst_test_mono_source_get_property (GObject * object, } static void -gst_test_mono_source_set_property (GObject * object, +gst_test_obj_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - GstTestMonoSource *self = GST_TEST_MONO_SOURCE (object); + GstTestObj *self = GST_TEST_OBJ (object); switch (property_id) { - case ARG_ULONG: - self->val_ulong = g_value_get_ulong (value); - GST_DEBUG ("test value ulong=%lu", self->val_ulong); + case PROP_INT: + self->val_int = g_value_get_int (value); + GST_DEBUG ("test value int=%d", self->val_int); break; - case ARG_FLOAT: + case PROP_FLOAT: self->val_float = g_value_get_float (value); GST_DEBUG ("test value float=%f", self->val_float); break; - case ARG_DOUBLE: + case PROP_DOUBLE: self->val_double = g_value_get_double (value); - GST_DEBUG ("test value double=%f", self->val_double); + GST_DEBUG ("test value double=%lf", self->val_double); break; - case ARG_BOOLEAN: + case PROP_BOOLEAN: self->val_boolean = g_value_get_boolean (value); GST_DEBUG ("test value boolean=%d", self->val_boolean); break; - case ARG_CONSTRUCTONLY: + case PROP_ENUM: + self->val_enum = g_value_get_enum (value); + GST_DEBUG ("test value enum=%d", self->val_enum); + break; + case PROP_CONSTRUCTONLY: break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -127,837 +170,332 @@ gst_test_mono_source_set_property (GObject * object, } static void -gst_test_mono_source_class_init (GstTestMonoSourceClass * klass) +gst_test_obj_class_init (GstTestObjClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->set_property = gst_test_mono_source_set_property; - gobject_class->get_property = gst_test_mono_source_get_property; + gobject_class->set_property = gst_test_obj_set_property; + gobject_class->get_property = gst_test_obj_get_property; - g_object_class_install_property (gobject_class, ARG_ULONG, - g_param_spec_ulong ("ulong", - "ulong prop", - "ulong number parameter for the test_mono_source", - 0, G_MAXULONG, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_INT, + g_param_spec_int ("int", + "int prop", + "int number parameter", + 0, 100, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); - g_object_class_install_property (gobject_class, ARG_FLOAT, + g_object_class_install_property (gobject_class, PROP_FLOAT, g_param_spec_float ("float", "float prop", - "float number parameter for the test_mono_source", + "float number parameter", 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); - g_object_class_install_property (gobject_class, ARG_DOUBLE, + g_object_class_install_property (gobject_class, PROP_DOUBLE, g_param_spec_double ("double", "double prop", - "double number parameter for the test_mono_source", + "double number parameter", 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); - g_object_class_install_property (gobject_class, ARG_BOOLEAN, + g_object_class_install_property (gobject_class, PROP_BOOLEAN, g_param_spec_boolean ("boolean", "boolean prop", - "boolean parameter for the test_mono_source", + "boolean parameter", FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); - g_object_class_install_property (gobject_class, ARG_READONLY, - g_param_spec_ulong ("readonly", + g_object_class_install_property (gobject_class, PROP_ENUM, + g_param_spec_enum ("enum", + "enum prop", + "enum parameter", + GST_TYPE_TEST_ENUM, ENUM_V0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_READONLY, + g_param_spec_int ("readonly", "readonly prop", - "readonly parameter for the test_mono_source", - 0, G_MAXULONG, 0, G_PARAM_READABLE | GST_PARAM_CONTROLLABLE)); + "readonly parameter", + 0, G_MAXINT, 0, G_PARAM_READABLE | GST_PARAM_CONTROLLABLE)); - g_object_class_install_property (gobject_class, ARG_STATIC, - g_param_spec_ulong ("static", + g_object_class_install_property (gobject_class, PROP_STATIC, + g_param_spec_int ("static", "static prop", - "static parameter for the test_mono_source", - 0, G_MAXULONG, 0, G_PARAM_READWRITE)); + "static parameter", 0, G_MAXINT, 0, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_CONSTRUCTONLY, - g_param_spec_ulong ("construct-only", + g_object_class_install_property (gobject_class, PROP_CONSTRUCTONLY, + g_param_spec_int ("construct-only", "construct-only prop", - "construct-only parameter for the test_mono_source", - 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + "construct-only parameter", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); } static void -gst_test_mono_source_base_init (GstTestMonoSourceClass * klass) +gst_test_obj_base_init (GstTestObjClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (element_class, - "Monophonic source for unit tests", - "Source/Audio/MonoSource", - "Use in unit tests", "Stefan Kost <ensonic@users.sf.net>"); + "test object for unit tests", + "Test", "Use in unit tests", "Stefan Sauer <ensonic@users.sf.net>"); } static GType -gst_test_mono_source_get_type (void) +gst_test_obj_get_type (void) { - static volatile gsize test_mono_source_type = 0; + static volatile gsize test_obj_type = 0; - if (g_once_init_enter (&test_mono_source_type)) { + if (g_once_init_enter (&test_obj_type)) { GType type; static const GTypeInfo info = { - (guint16) sizeof (GstTestMonoSourceClass), - (GBaseInitFunc) gst_test_mono_source_base_init, // base_init + (guint16) sizeof (GstTestObjClass), + (GBaseInitFunc) gst_test_obj_base_init, // base_init NULL, // base_finalize - (GClassInitFunc) gst_test_mono_source_class_init, // class_init + (GClassInitFunc) gst_test_obj_class_init, // class_init NULL, // class_finalize NULL, // class_data - (guint16) sizeof (GstTestMonoSource), + (guint16) sizeof (GstTestObj), 0, // n_preallocs NULL, // instance_init NULL // value_table }; - type = - g_type_register_static (GST_TYPE_ELEMENT, "GstTestMonoSource", &info, - 0); - g_once_init_leave (&test_mono_source_type, type); + type = g_type_register_static (GST_TYPE_ELEMENT, "GstTestObj", &info, 0); + g_once_init_leave (&test_obj_type, type); } - return test_mono_source_type; -} - -/* so we don't have to paste the gst_element_register into 50 places below */ -static gboolean -local_gst_controller_init (int *argc, char ***argv) -{ - fail_unless (gst_controller_init (argc, argv)); - - fail_unless (gst_element_register (NULL, "testmonosource", GST_RANK_NONE, - GST_TYPE_TEST_MONO_SOURCE)); - - return TRUE; -} - -#define gst_controller_init(a,b) local_gst_controller_init(a,b) - -/* TESTS */ -/* double init should not harm */ -GST_START_TEST (controller_init) -{ - gst_controller_init (NULL, NULL); - gst_controller_init (NULL, NULL); - gst_controller_init (NULL, NULL); - gst_controller_init (NULL, NULL); + return test_obj_type; } -GST_END_TEST; - -/* tests for an element with no controlled params */ -GST_START_TEST (controller_new_fail1) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("fakesrc", "test_source"); - - /* that property should not exist */ - ctrl = gst_controller_new (G_OBJECT (elem), "_schrompf_", NULL); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; - -/* tests for an element with controlled params, but none given */ -GST_START_TEST (controller_new_fail2) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* no property given */ - ctrl = gst_controller_new (G_OBJECT (elem), NULL); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; - -/* tests for readonly params */ -GST_START_TEST (controller_new_fail3) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and but is readonly */ - ASSERT_CRITICAL (ctrl = - gst_controller_new (G_OBJECT (elem), "readonly", NULL)); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; - -/* tests for static params */ -GST_START_TEST (controller_new_fail4) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and but is not controlable */ - ASSERT_CRITICAL (ctrl = gst_controller_new (G_OBJECT (elem), "static", NULL)); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; - -/* tests for construct-only params */ -GST_START_TEST (controller_new_fail5) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and but is construct-only */ - ASSERT_CRITICAL (ctrl = - gst_controller_new (G_OBJECT (elem), "construct-only", NULL)); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; - - -/* tests for an element with controlled params */ -GST_START_TEST (controller_new_okay1) -{ - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); - gst_object_unref (elem); -} - -GST_END_TEST; - -/* tests for an element with several controlled params */ -GST_START_TEST (controller_new_okay2) -{ - GstController *ctrl, *ctrl2, *ctrl3; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "double", "float", NULL); - fail_unless (ctrl != NULL, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1); - - ctrl2 = gst_controller_new (G_OBJECT (elem), "boolean", NULL); - fail_unless (ctrl2 != NULL, NULL); - fail_unless (ctrl2 == ctrl, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2); - - /* trying to control the same properties again should correctly - * increase the refcount of the object returned as well */ - ctrl3 = - gst_controller_new (G_OBJECT (elem), "ulong", "double", "float", NULL); - fail_unless (ctrl3 != NULL, NULL); - fail_unless (ctrl3 == ctrl, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 3); - - g_object_unref (ctrl); - g_object_unref (ctrl2); - g_object_unref (ctrl3); - gst_object_unref (elem); -} - -GST_END_TEST; - -/* controlling several params should return the same controller */ -GST_START_TEST (controller_new_okay3) -{ - GstController *ctrl1, *ctrl2, *ctrl3; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl1 = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl1 != NULL, NULL); - - /* that property should exist and should be controllable */ - ctrl2 = gst_controller_new (G_OBJECT (elem), "double", NULL); - fail_unless (ctrl2 != NULL, NULL); - fail_unless (ctrl1 == ctrl2, NULL); - - /* that property should exist and should be controllable */ - ctrl3 = gst_controller_new (G_OBJECT (elem), "float", NULL); - fail_unless (ctrl3 != NULL, NULL); - fail_unless (ctrl1 == ctrl3, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl1)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl1)->ref_count, 3); - g_object_unref (ctrl1); - g_object_unref (ctrl2); - g_object_unref (ctrl3); - gst_object_unref (elem); -} - -GST_END_TEST; - -/* controlling a params twice should be handled */ -GST_START_TEST (controller_param_twice) +static void +setup (void) { - GstController *ctrl; - GstElement *elem; - gboolean res; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - /* it should have been added at least once, let remove it */ - res = gst_controller_remove_properties (ctrl, "ulong", NULL); - fail_unless (res, NULL); - - /* removing it again should not work */ - res = gst_controller_remove_properties (ctrl, "ulong", NULL); - fail_unless (!res, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); - gst_object_unref (elem); + gst_element_register (NULL, "testobj", GST_RANK_NONE, GST_TYPE_TEST_OBJ); } -GST_END_TEST; - -/* tests if we cleanup properly */ -GST_START_TEST (controller_finalize) +static void +teardown (void) { - GstController *ctrl; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - /* free the controller */ - g_object_unref (ctrl); - - /* object shouldn't have a controller anymore */ - ctrl = gst_object_get_controller (G_OBJECT (elem)); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); } -GST_END_TEST; - -/* tests if we cleanup properly */ -GST_START_TEST (controller_controlsource_refcounts) -{ - GstController *ctrl; - GstElement *elem; - GstControlSource *csource, *test_csource; - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - csource = (GstControlSource *) gst_interpolation_control_source_new (); - fail_unless (csource != NULL, NULL); - - fail_unless_equals_int (G_OBJECT (csource)->ref_count, 1); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", csource)); - fail_unless_equals_int (G_OBJECT (csource)->ref_count, 2); - - g_object_unref (G_OBJECT (csource)); - - test_csource = gst_controller_get_control_source (ctrl, "ulong"); - fail_unless (test_csource != NULL, NULL); - fail_unless (test_csource == csource); - fail_unless_equals_int (G_OBJECT (csource)->ref_count, 2); - g_object_unref (csource); - - /* free the controller */ - g_object_unref (ctrl); - - /* object shouldn't have a controller anymore */ - ctrl = gst_object_get_controller (G_OBJECT (elem)); - fail_unless (ctrl == NULL, NULL); - - gst_object_unref (elem); -} - -GST_END_TEST; +/* TESTS */ -/* tests if we don't fail on empty controllers */ +/* tests if we don't fail on empty interpolation controlsources */ GST_START_TEST (controller_controlsource_empty1) { - GstController *ctrl; GstElement *elem; - GstControlSource *csource; - - gst_controller_init (NULL, NULL); + GstControlSource *cs; - elem = gst_element_factory_make ("testmonosource", "test_source"); + elem = gst_element_factory_make ("testobj", NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + cs = gst_interpolation_control_source_new (); - csource = (GstControlSource *) gst_interpolation_control_source_new (); - fail_unless (csource != NULL, NULL); - - fail_unless (gst_controller_set_control_source (ctrl, "ulong", csource)); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* don't fail on empty control point lists */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); /* unref objects */ - g_object_unref (csource); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* tests if we don't fail on controllers that are empty again */ +/* tests if we don't fail on interpolation controlsources that are empty again */ GST_START_TEST (controller_controlsource_empty2) { - GstController *ctrl; GstElement *elem; - GstInterpolationControlSource *csource; - GValue val = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); + GstControlSource *cs; + GstTimedValueControlSource *tvcs; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - csource = gst_interpolation_control_source_new (); - fail_unless (csource != NULL, NULL); + cs = gst_interpolation_control_source_new (); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - (GstControlSource *) csource)); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set control values */ - g_value_init (&val, G_TYPE_ULONG); - g_value_set_ulong (&val, 0); - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, &val); + tvcs = (GstTimedValueControlSource *) cs; + gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0); /* ... and unset the value */ - gst_interpolation_control_source_unset (csource, 0 * GST_SECOND); + gst_timed_value_control_source_unset (tvcs, 0 * GST_SECOND); /* don't fail on empty control point lists */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); /* unref objects */ - g_object_unref (csource); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test timed value handling without interpolation */ -GST_START_TEST (controller_interpolate_none) +GST_START_TEST (controller_interpolation_none) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); + gdouble v; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_NONE)); - - fail_unless (gst_interpolation_control_source_get_count (csource) == 0); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_NONE, NULL); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 1); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 2); - - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); + + /* check values on control source directly */ + fail_unless (gst_control_source_get_value (cs, 0 * GST_SECOND, &v)); + fail_unless_equals_float (v, 0.0); + fail_unless (gst_control_source_get_value (cs, 1 * GST_SECOND, &v)); + fail_unless_equals_float (v, 0.0); + fail_unless (gst_control_source_get_value (cs, 2 * GST_SECOND, &v)); + fail_unless_equals_float (v, 1.0); + fail_unless (gst_control_source_get_value (cs, 3 * GST_SECOND, &v)); + fail_unless_equals_float (v, 1.0); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); - gst_object_unref (elem); -} - -GST_END_TEST; - -/* test timed value handling in trigger mode */ -GST_START_TEST (controller_interpolate_trigger) -{ - GstController *ctrl; - GstInterpolationControlSource *csource; - GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); - - /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_TRIGGER)); - - g_value_init (&val_ulong, G_TYPE_ULONG); - fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource), - 0 * GST_SECOND, &val_ulong)); - - /* set control values */ - g_value_set_ulong (&val_ulong, 50); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - - - /* now pull in values for some timestamps */ - fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource), - 0 * GST_SECOND, &val_ulong)); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource), - 1 * GST_SECOND, &val_ulong)); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource), - 2 * GST_SECOND, &val_ulong)); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (G_OBJECT (csource)); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test timed value handling with linear interpolation */ -GST_START_TEST (controller_interpolate_linear) +GST_START_TEST (controller_interpolation_linear) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test timed value handling with cubic interpolation */ -GST_START_TEST (controller_interpolate_cubic) +GST_START_TEST (controller_interpolation_cubic) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_double = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "double", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "double", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "double", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_CUBIC)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_CUBIC, NULL); /* set control values */ - g_value_init (&val_double, G_TYPE_DOUBLE); - g_value_set_double (&val_double, 0.0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - g_value_set_double (&val_double, 5.0); - res = - gst_interpolation_control_source_set (csource, 1 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - g_value_set_double (&val_double, 2.0); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - g_value_set_double (&val_double, 8.0); - res = - gst_interpolation_control_source_set (csource, 4 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 0.5)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.2)); + fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 0.8)); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 0.0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 5.0); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 2.0); - gst_controller_sync_values (ctrl, 3 * GST_SECOND); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double > 2.0 && - GST_TEST_MONO_SOURCE (elem)->val_double < 8.0, NULL); - gst_controller_sync_values (ctrl, 4 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 8.0); - gst_controller_sync_values (ctrl, 5 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 8.0); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 50.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless (GST_TEST_OBJ (elem)->val_double > 20.0 && + GST_TEST_OBJ (elem)->val_double < 80.0, NULL); + gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 80.0); + gst_object_sync_values (GST_OBJECT (elem), 5 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 80.0); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test timed value handling with cubic interpolation */ -GST_START_TEST (controller_interpolate_cubic_too_few_cp) +GST_START_TEST (controller_interpolation_cubic_too_few_cp) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_double = { 0, }; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "double", NULL); - fail_unless (ctrl != NULL, NULL); - - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "double", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "double", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_CUBIC)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_CUBIC, NULL); /* set 2 control values */ - g_value_init (&val_double, G_TYPE_DOUBLE); - g_value_set_double (&val_double, 0.0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - g_value_set_double (&val_double, 4.0); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.4)); /* now pull in values for some timestamps and verify that it used linear * interpolation as we don't gave enough control points */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 0.0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 2.0); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 4.0); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); - gst_object_unref (elem); -} - -GST_END_TEST; - -/* make sure we don't crash when someone sets an unsupported interpolation - * mode */ -GST_START_TEST (controller_interpolate_unimplemented) -{ - GstController *ctrl; - GstInterpolationControlSource *csource; - GstElement *elem; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); - - /* set completely bogus interpolation mode */ - fail_if (gst_interpolation_control_source_set_interpolation_mode (csource, - (GstInterpolateMode) 93871)); - - g_object_unref (G_OBJECT (csource)); - - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0); + + gst_object_unref (cs); gst_object_unref (elem); } @@ -966,79 +504,51 @@ GST_END_TEST; /* test _unset() */ GST_START_TEST (controller_interpolation_unset) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + elem = gst_element_factory_make ("testobj", NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_NONE)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_NONE, NULL); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 1 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 50); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 0.5)); /* verify values */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); /* unset second */ - res = gst_interpolation_control_source_unset (csource, 1 * GST_SECOND); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_unset (tvcs, 1 * GST_SECOND)); /* verify value again */ - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); /* unset all values, reset and try to unset again */ - fail_unless (gst_interpolation_control_source_unset (csource, - 0 * GST_SECOND)); - fail_unless (gst_interpolation_control_source_unset (csource, - 2 * GST_SECOND)); - gst_interpolation_control_source_unset_all (csource); - fail_if (gst_interpolation_control_source_unset (csource, 2 * GST_SECOND)); - - g_object_unref (csource); + fail_unless (gst_timed_value_control_source_unset (tvcs, 0 * GST_SECOND)); + fail_unless (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND)); + gst_timed_value_control_source_unset_all (tvcs); + fail_if (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND)); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } @@ -1047,61 +557,41 @@ GST_END_TEST; /* test _unset_all() */ GST_START_TEST (controller_interpolation_unset_all) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + elem = gst_element_factory_make ("testobj", NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_NONE)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_NONE, NULL); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 1 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0)); /* verify values */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); /* unset all */ - gst_interpolation_control_source_unset_all (csource); - - g_object_unref (csource); + gst_timed_value_control_source_unset_all (tvcs); + GST_TEST_OBJ (elem)->val_int = 0; /* verify value again */ - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } @@ -1110,62 +600,51 @@ GST_END_TEST; /* test retrieval of an array of values with get_value_array() */ GST_START_TEST (controller_interpolation_linear_value_array) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - GstValueArray values = { NULL, }; - - gst_controller_init (NULL, NULL); + gdouble *raw_values; + GValue *g_values; - elem = gst_element_factory_make ("testmonosource", "test_source"); + elem = gst_element_factory_make ("testobj", NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 1.0)); - /* now pull in values for some timestamps */ - values.property_name = (char *) "ulong"; - values.nbsamples = 3; - values.sample_interval = GST_SECOND; - values.values = (gpointer) g_new (gulong, 3); - - fail_unless (gst_control_source_get_value_array (GST_CONTROL_SOURCE (csource), - 0, &values)); - fail_unless_equals_int (((gulong *) values.values)[0], 0); - fail_unless_equals_int (((gulong *) values.values)[1], 50); - fail_unless_equals_int (((gulong *) values.values)[2], 100); - - g_object_unref (csource); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_free (values.values); - g_object_unref (ctrl); + /* now pull in raw-values for some timestamps */ + raw_values = g_new (gdouble, 3); + + fail_unless (gst_control_source_get_value_array (cs, + 0, GST_SECOND / 2, 3, raw_values)); + fail_unless_equals_float ((raw_values)[0], 0.0); + fail_unless_equals_float ((raw_values)[1], 0.5); + fail_unless_equals_float ((raw_values)[2], 1.0); + + g_free (raw_values); + + /* now pull in mapped values for some timestamps */ + g_values = g_new0 (GValue, 3); + + fail_unless (gst_object_get_value_array (GST_OBJECT (elem), "int", + 0, GST_SECOND / 2, 3, g_values)); + fail_unless_equals_int (g_value_get_int (&g_values[0]), 0); + fail_unless_equals_int (g_value_get_int (&g_values[1]), 50); + fail_unless_equals_int (g_value_get_int (&g_values[2]), 100); + + g_free (g_values); + + gst_object_unref (cs); gst_object_unref (elem); } @@ -1174,68 +653,48 @@ GST_END_TEST; /* test if values below minimum and above maximum are clipped */ GST_START_TEST (controller_interpolation_linear_invalid_values) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_float = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "float", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "float", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "float", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); /* set control values */ - g_value_init (&val_float, G_TYPE_FLOAT); - g_value_set_float (&val_float, 200.0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_float); - fail_unless (res, NULL); - g_value_set_float (&val_float, -200.0); - res = - gst_interpolation_control_source_set (csource, 4 * GST_SECOND, - &val_float); - fail_unless (res, NULL); - - g_object_unref (csource); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 2.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, -2.0)); /* now pull in values for some timestamps and see if clipping works */ /* 200.0 */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 100.0); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 100.0); /* 100.0 */ - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 100.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 100.0); /* 50.0 */ - gst_controller_sync_values (ctrl, 1 * GST_SECOND + 500 * GST_MSECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 50.0); + gst_object_sync_values (GST_OBJECT (elem), + 1 * GST_SECOND + 500 * GST_MSECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 50.0); /* 0.0 */ - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0); /* -100.0 */ - gst_controller_sync_values (ctrl, 3 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0); /* -200.0 */ - gst_controller_sync_values (ctrl, 4 * GST_SECOND); - fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_float, 0.0); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } @@ -1243,248 +702,182 @@ GST_END_TEST; GST_START_TEST (controller_interpolation_linear_default_values) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); - - g_value_init (&val_ulong, G_TYPE_ULONG); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); /* Should fail if no value was set yet * FIXME: will not fail, as interpolation assumes val[0]=default_value if * nothing else is set. - fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource), - 1 * GST_SECOND, &val_ulong)); + fail_if (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, &val_int)); */ /* set control values */ - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 1 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 3 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_set (tvcs, 1 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 3 * GST_SECOND, 1.0)); /* now pull in values for some timestamps */ /* should give the value of the first control point for timestamps before it */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 3 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); /* set control values */ - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); /* unset the old ones */ - res = gst_interpolation_control_source_unset (csource, 1 * GST_SECOND); - fail_unless (res, NULL); - res = gst_interpolation_control_source_unset (csource, 3 * GST_SECOND); - fail_unless (res, NULL); + fail_unless (gst_timed_value_control_source_unset (tvcs, 1 * GST_SECOND)); + fail_unless (gst_timed_value_control_source_unset (tvcs, 3 * GST_SECOND)); /* now pull in values for some timestamps */ /* should now give our value for timestamp 0 */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - - g_object_unref (G_OBJECT (csource)); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test gst_controller_set_disabled() with linear interpolation */ -GST_START_TEST (controller_interpolate_linear_disabled) +GST_START_TEST (controller_interpolation_linear_disabled) { - GstController *ctrl; - GstInterpolationControlSource *csource, *csource2; + GstControlSource *cs1, *cs2; + GstTimedValueControlSource *tvcs1, *tvcs2; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, } - , val_double = { - 0,}; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new interpolation control source */ + cs1 = gst_interpolation_control_source_new (); + tvcs1 = (GstTimedValueControlSource *) cs1; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "double", NULL); - fail_unless (ctrl != NULL, NULL); + cs2 = gst_interpolation_control_source_new (); + tvcs2 = (GstTimedValueControlSource *) cs2; - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); - csource2 = gst_interpolation_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); - fail_unless (csource2 != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "double", - GST_CONTROL_SOURCE (csource2))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs1))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "double", cs2))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); - fail_unless (gst_interpolation_control_source_set_interpolation_mode - (csource2, GST_INTERPOLATE_LINEAR)); + g_object_set (cs1, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); + g_object_set (cs2, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); + + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs1, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs1, 2 * GST_SECOND, 1.0)); /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource)); - -/* set control values */ - g_value_init (&val_double, G_TYPE_DOUBLE); - g_value_set_double (&val_double, 2.0); - res = - gst_interpolation_control_source_set (csource2, 0 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - g_value_set_double (&val_double, 4.0); - res = - gst_interpolation_control_source_set (csource2, 2 * GST_SECOND, - &val_double); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource2)); + fail_unless (gst_timed_value_control_source_set (tvcs2, 0 * GST_SECOND, 0.2)); + fail_unless (gst_timed_value_control_source_set (tvcs2, 2 * GST_SECOND, 0.4)); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0); /* now pull in values for some timestamps, prop double disabled */ - GST_TEST_MONO_SOURCE (elem)->val_ulong = 0; - GST_TEST_MONO_SOURCE (elem)->val_double = 0.0; - gst_controller_set_property_disabled (ctrl, "double", TRUE); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); + GST_TEST_OBJ (elem)->val_int = 0; + GST_TEST_OBJ (elem)->val_double = 0.0; + gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", TRUE); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); /* now pull in values for some timestamps, after enabling double again */ - GST_TEST_MONO_SOURCE (elem)->val_ulong = 0; - GST_TEST_MONO_SOURCE (elem)->val_double = 0.0; - gst_controller_set_property_disabled (ctrl, "double", FALSE); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL); + GST_TEST_OBJ (elem)->val_int = 0; + GST_TEST_OBJ (elem)->val_double = 0.0; + gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", FALSE); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0); /* now pull in values for some timestamps, after disabling all props */ - GST_TEST_MONO_SOURCE (elem)->val_ulong = 0; - GST_TEST_MONO_SOURCE (elem)->val_double = 0.0; - gst_controller_set_disabled (ctrl, TRUE); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL); + GST_TEST_OBJ (elem)->val_int = 0; + GST_TEST_OBJ (elem)->val_double = 0.0; + gst_object_set_control_bindings_disabled (GST_OBJECT (elem), TRUE); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 0.0); /* now pull in values for some timestamps, enabling double again */ - GST_TEST_MONO_SOURCE (elem)->val_ulong = 0; - GST_TEST_MONO_SOURCE (elem)->val_double = 0.0; - gst_controller_set_property_disabled (ctrl, "double", FALSE); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL); + GST_TEST_OBJ (elem)->val_int = 0; + GST_TEST_OBJ (elem)->val_double = 0.0; + gst_object_set_control_binding_disabled (GST_OBJECT (elem), "double", FALSE); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0); /* now pull in values for some timestamps, enabling all */ - GST_TEST_MONO_SOURCE (elem)->val_ulong = 0; - GST_TEST_MONO_SOURCE (elem)->val_double = 0.0; - gst_controller_set_disabled (ctrl, FALSE); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL); - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL); - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + GST_TEST_OBJ (elem)->val_int = 0; + GST_TEST_OBJ (elem)->val_double = 0.0; + gst_object_set_control_bindings_disabled (GST_OBJECT (elem), FALSE); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 20.0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 30.0); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + fail_unless_equals_float (GST_TEST_OBJ (elem)->val_double, 40.0); + + gst_object_unref (cs1); + gst_object_unref (cs2); gst_object_unref (elem); } @@ -1493,761 +886,609 @@ GST_END_TEST; GST_START_TEST (controller_interpolation_set_from_list) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstTimedValue *tval; GstElement *elem; GSList *list = NULL; - gst_controller_init (NULL, NULL); - /* test that an invalid timestamp throws a warning of some sort */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); /* set control value */ tval = g_new0 (GstTimedValue, 1); tval->timestamp = GST_CLOCK_TIME_NONE; - g_value_init (&tval->value, G_TYPE_ULONG); - g_value_set_ulong (&tval->value, 0); + tval->value = 0.0; list = g_slist_append (list, tval); - fail_if (gst_interpolation_control_source_set_from_list (csource, list)); + fail_if (gst_timed_value_control_source_set_from_list (tvcs, list)); /* try again with a valid stamp, should work now */ tval->timestamp = 0; - fail_unless (gst_interpolation_control_source_set_from_list (csource, list)); - - g_object_unref (csource); + fail_unless (gst_timed_value_control_source_set_from_list (tvcs, list)); /* allocated GstTimedValue now belongs to the controller, but list not */ - g_value_unset (&tval->value); g_free (tval); g_slist_free (list); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with sine waveform */ -GST_START_TEST (controller_lfo_sine) + +/* test linear interpolation for ts < first control point */ +GST_START_TEST (controller_interpolation_linear_before_ts0) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + /* set interpolation mode */ + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 0.0)); - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE, - "frequency", 1.0, "timeshift", (GstClockTime) 0, - "amplitude", &, "offset", &off, NULL); + /* now pull in values for some timestamps after first control point */ + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); - g_object_unref (G_OBJECT (csource)); + /* now pull in values for some timestamps before first control point */ + GST_TEST_OBJ (elem)->val_int = 25; + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); - /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with sine waveform and timeshift */ -GST_START_TEST (controller_lfo_sine_timeshift) +/* test linear interpolation of enums */ +GST_START_TEST (controller_interpolation_linear_enums) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - - gst_controller_init (NULL, NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + elem = gst_element_factory_make ("testobj", NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "enum", cs))); - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); - - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); + /* set interpolation mode */ + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE, - "frequency", 1.0, "timeshift", 250 * GST_MSECOND, - "amplitude", &, "offset", &off, NULL); - - g_object_unref (G_OBJECT (csource)); - -/* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_set (tvcs, 4 * GST_SECOND, 1.0)); + + /* now pull in values going over the enum values */ + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V0); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V10); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V11); + gst_object_sync_values (GST_OBJECT (elem), 3 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V12); + gst_object_sync_values (GST_OBJECT (elem), 4 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_enum, ENUM_V255); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with square waveform */ -GST_START_TEST (controller_lfo_square) +/* test timed value counts */ +GST_START_TEST (controller_timed_value_count) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); + /* new interpolation control source */ + cs = gst_interpolation_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); - - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SQUARE, - "frequency", 1.0, "timeshift", (GstClockTime) 0, - "amplitude", &, "offset", &off, NULL); + /* set interpolation mode */ + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_NONE, NULL); - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_timed_value_control_source_get_count (tvcs) == 0); - /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0)); + fail_unless (gst_timed_value_control_source_get_count (tvcs) == 1); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); + fail_unless (gst_timed_value_control_source_get_count (tvcs) == 2); + + /* unset control values */ + fail_unless (gst_timed_value_control_source_unset (tvcs, 2 * GST_SECOND)); + fail_unless (gst_timed_value_control_source_get_count (tvcs) == 1); + fail_unless (gst_timed_value_control_source_unset (tvcs, 0 * GST_SECOND)); + fail_unless (gst_timed_value_control_source_get_count (tvcs) == 0); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with saw waveform */ -GST_START_TEST (controller_lfo_saw) + +/* test lfo control source with sine waveform */ +GST_START_TEST (controller_lfo_sine) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); - - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); - - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); - - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SAW, + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_SINE, "frequency", 1.0, "timeshift", (GstClockTime) 0, - "amplitude", &, "offset", &off, NULL); - - g_object_unref (G_OBJECT (csource)); + "amplitude", 0.5, "offset", 0.5, NULL); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with reverse saw waveform */ -GST_START_TEST (controller_lfo_rsaw) +/* test lfo control source with sine waveform and timeshift */ +GST_START_TEST (controller_lfo_sine_timeshift) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); + + /* new lfo control source */ + cs = gst_lfo_control_source_new (); + + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_SINE, + "frequency", 1.0, "timeshift", 250 * GST_MSECOND, + "amplitude", 0.5, "offset", 0.5, NULL); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + /* now pull in values for some timestamps */ + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + + gst_object_unref (cs); + gst_object_unref (elem); +} - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); +GST_END_TEST; - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); +/* test lfo control source with square waveform */ +GST_START_TEST (controller_lfo_square) +{ + GstControlSource *cs; + GstElement *elem; - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); + elem = gst_element_factory_make ("testobj", NULL); - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_REVERSE_SAW, - "frequency", 1.0, "timeshift", (GstClockTime) 0, - "amplitude", &, "offset", &off, NULL); + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - g_object_unref (G_OBJECT (csource)); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); + + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_SQUARE, + "frequency", 1.0, "timeshift", (GstClockTime) 0, + "amplitude", 0.5, "offset", 0.5, NULL); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; /* test lfo control source with saw waveform */ -GST_START_TEST (controller_lfo_triangle) +GST_START_TEST (controller_lfo_saw) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; GstElement *elem; - GValue amp = { 0, } - , off = { - 0,}; - - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* set amplitude and offset values */ - g_value_init (&, G_TYPE_ULONG); - g_value_init (&off, G_TYPE_ULONG); - g_value_set_ulong (&, 100); - g_value_set_ulong (&off, 100); - - /* set waveform mode */ - g_object_set (csource, "waveform", GST_LFO_WAVEFORM_TRIANGLE, + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_SAW, "frequency", 1.0, "timeshift", (GstClockTime) 0, - "amplitude", &, "offset", &off, NULL); - - g_object_unref (G_OBJECT (csource)); + "amplitude", 0.5, "offset", 0.5, NULL); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test lfo control source with nothing set */ -GST_START_TEST (controller_lfo_none) +/* test lfo control source with reverse saw waveform */ +GST_START_TEST (controller_lfo_rsaw) { - GstController *ctrl; - GstLFOControlSource *csource; + GstControlSource *cs; GstElement *elem; - gst_controller_init (NULL, NULL); - - elem = gst_element_factory_make ("testmonosource", "test_source"); - - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - /* Get interpolation control source */ - csource = gst_lfo_control_source_new (); + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - g_object_unref (G_OBJECT (csource)); + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_REVERSE_SAW, + "frequency", 1.0, "timeshift", (GstClockTime) 0, + "amplitude", 0.5, "offset", 0.5, NULL); /* now pull in values for some timestamps */ - gst_controller_sync_values (ctrl, 0 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 2000 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1250 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1500 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - gst_controller_sync_values (ctrl, 1750 * GST_MSECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 25); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 75); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* tests if we can run helper methods against any GObject */ -GST_START_TEST (controller_helper_any_gobject) +/* test lfo control source with saw waveform */ +GST_START_TEST (controller_lfo_triangle) { + GstControlSource *cs; GstElement *elem; - gboolean res; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); + + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - elem = gst_element_factory_make ("bin", "test_elem"); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* that element is not controllable */ - res = gst_object_sync_values (G_OBJECT (elem), 0LL); - /* Syncing should still succeed as there's nothing to sync */ - fail_unless (res == TRUE, NULL); + /* configure lfo */ + g_object_set (cs, "waveform", GST_LFO_WAVEFORM_TRIANGLE, + "frequency", 1.0, "timeshift", (GstClockTime) 0, + "amplitude", 0.5, "offset", 0.5, NULL); + /* now pull in values for some timestamps */ + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -GST_START_TEST (controller_refcount_new_list) +/* test lfo control source with nothing set */ +GST_START_TEST (controller_lfo_none) { - GstController *ctrl, *ctrl2; + GstControlSource *cs; GstElement *elem; - GList *list = NULL; - - gst_controller_init (NULL, NULL); - - /* that property should exist and should be controllable */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - list = g_list_append (NULL, (char *) "ulong"); - ctrl = gst_controller_new_list (G_OBJECT (elem), list); - fail_unless (ctrl != NULL, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1); - g_list_free (list); - g_object_unref (ctrl); - gst_object_unref (elem); - /* try the same property twice, make sure the refcount is still 1 */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - list = g_list_append (NULL, (char *) "ulong"); - list = g_list_append (list, (char *) "ulong"); - ctrl = gst_controller_new_list (G_OBJECT (elem), list); - fail_unless (ctrl != NULL, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1); - g_list_free (list); - g_object_unref (ctrl); - gst_object_unref (elem); + elem = gst_element_factory_make ("testobj", NULL); - /* try two properties, make sure the refcount is still 1 */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - list = g_list_append (NULL, (char *) "ulong"); - list = g_list_append (list, (char *) "boolean"); - ctrl = gst_controller_new_list (G_OBJECT (elem), list); - fail_unless (ctrl != NULL, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1); - g_list_free (list); - g_object_unref (ctrl); - gst_object_unref (elem); + /* new lfo control source */ + cs = gst_lfo_control_source_new (); - /* try _new_list with existing controller */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - list = g_list_append (NULL, (char *) "ulong"); - ctrl2 = gst_controller_new_list (G_OBJECT (elem), list); - fail_unless (ctrl2 != NULL, NULL); - fail_unless (ctrl == ctrl2, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2); - g_list_free (list); - g_object_unref (ctrl); - g_object_unref (ctrl2); - gst_object_unref (elem); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* try _new_list first and then _new */ - elem = gst_element_factory_make ("testmonosource", "test_source"); - list = g_list_append (NULL, (char *) "ulong"); - ctrl = gst_controller_new_list (G_OBJECT (elem), list); - fail_unless (ctrl != NULL, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - ctrl2 = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl2 != NULL, NULL); - fail_unless (ctrl == ctrl2, NULL); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2); - g_list_free (list); - g_object_unref (ctrl); - g_object_unref (ctrl2); + /* now pull in values for some timestamps */ + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 2000 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1250 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1500 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + gst_object_sync_values (GST_OBJECT (elem), 1750 * GST_MSECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test linear interpolation for ts < first control point */ -GST_START_TEST (controller_interpolate_linear_before_ts0) +/* test timed value handling in trigger mode */ +GST_START_TEST (controller_trigger_exact) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; + gdouble raw_val; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new interpolation control source */ + cs = gst_trigger_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + fail_if (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val)); - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.5)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); - /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR)); + /* now pull in values for some timestamps */ + fail_unless (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val)); - /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 4 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - - g_object_unref (G_OBJECT (csource)); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); - /* now pull in values for some timestamps after first control point */ - gst_controller_sync_values (ctrl, 2 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100); - gst_controller_sync_values (ctrl, 3 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 4 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); + GST_TEST_OBJ (elem)->val_int = 0; + fail_if (gst_control_source_get_value (cs, 1 * GST_SECOND, &raw_val)); + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); - /* now pull in values for some timestamps before first control point */ - gst_controller_sync_values (ctrl, 1 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50); - gst_controller_sync_values (ctrl, 0 * GST_SECOND); - fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0); + fail_unless (gst_control_source_get_value (cs, 2 * GST_SECOND, &raw_val)); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + gst_object_unref (cs); gst_object_unref (elem); } GST_END_TEST; -/* test control-point handling in interpolation control source */ -GST_START_TEST (controller_interpolation_cp_count) +GST_START_TEST (controller_trigger_tolerance) { - GstController *ctrl; - GstInterpolationControlSource *csource; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; GstElement *elem; - gboolean res; - GValue val_ulong = { 0, }; + gdouble raw_val; - gst_controller_init (NULL, NULL); + elem = gst_element_factory_make ("testobj", NULL); - elem = gst_element_factory_make ("testmonosource", "test_source"); + /* new interpolation control source */ + cs = gst_trigger_control_source_new (); + tvcs = (GstTimedValueControlSource *) cs; - /* that property should exist and should be controllable */ - ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL); - fail_unless (ctrl != NULL, NULL); + fail_unless (gst_object_add_control_binding (GST_OBJECT (elem), + gst_direct_control_binding_new (GST_OBJECT (elem), "int", cs))); - /* Get interpolation control source */ - csource = gst_interpolation_control_source_new (); + g_object_set (cs, "tolerance", G_GINT64_CONSTANT (10), NULL); - fail_unless (csource != NULL); - fail_unless (gst_controller_set_control_source (ctrl, "ulong", - GST_CONTROL_SOURCE (csource))); + fail_if (gst_control_source_get_value (cs, 0 * GST_SECOND, &raw_val)); - /* set interpolation mode */ - fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_NONE)); + /* set control values */ + fail_unless (gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.5)); + fail_unless (gst_timed_value_control_source_set (tvcs, 2 * GST_SECOND, 1.0)); - fail_unless (gst_interpolation_control_source_get_count (csource) == 0); + /* now pull in values for some timestamps */ + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); + gst_object_sync_values (GST_OBJECT (elem), 0 * GST_SECOND + 5); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 50); - /* set control values */ - g_value_init (&val_ulong, G_TYPE_ULONG); - g_value_set_ulong (&val_ulong, 0); - res = - gst_interpolation_control_source_set (csource, 0 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 1); - g_value_set_ulong (&val_ulong, 100); - res = - gst_interpolation_control_source_set (csource, 2 * GST_SECOND, - &val_ulong); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 2); - - /* now unset control values */ - res = gst_interpolation_control_source_unset (csource, 2 * GST_SECOND); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 1); - - res = gst_interpolation_control_source_unset (csource, 0 * GST_SECOND); - fail_unless (res, NULL); - fail_unless (gst_interpolation_control_source_get_count (csource) == 0); - - g_object_unref (G_OBJECT (csource)); - - GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count); - g_object_unref (ctrl); + GST_TEST_OBJ (elem)->val_int = 0; + gst_object_sync_values (GST_OBJECT (elem), 1 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 0); + + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND - 5); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + gst_object_sync_values (GST_OBJECT (elem), 2 * GST_SECOND); + fail_unless_equals_int (GST_TEST_OBJ (elem)->val_int, 100); + + gst_object_unref (cs); gst_object_unref (elem); } @@ -2261,34 +1502,23 @@ gst_controller_suite (void) TCase *tc = tcase_create ("general"); suite_add_tcase (s, tc); - tcase_add_test (tc, controller_init); - tcase_add_test (tc, controller_refcount_new_list); - tcase_add_test (tc, controller_new_fail1); - tcase_add_test (tc, controller_new_fail2); - tcase_add_test (tc, controller_new_fail3); - tcase_add_test (tc, controller_new_fail4); - tcase_add_test (tc, controller_new_fail5); - tcase_add_test (tc, controller_new_okay1); - tcase_add_test (tc, controller_new_okay2); - tcase_add_test (tc, controller_new_okay3); - tcase_add_test (tc, controller_param_twice); - tcase_add_test (tc, controller_finalize); - tcase_add_test (tc, controller_controlsource_refcounts); + tcase_add_checked_fixture (tc, setup, teardown); tcase_add_test (tc, controller_controlsource_empty1); tcase_add_test (tc, controller_controlsource_empty2); - tcase_add_test (tc, controller_interpolate_none); - tcase_add_test (tc, controller_interpolate_trigger); - tcase_add_test (tc, controller_interpolate_linear); - tcase_add_test (tc, controller_interpolate_cubic); - tcase_add_test (tc, controller_interpolate_cubic_too_few_cp); - tcase_add_test (tc, controller_interpolate_unimplemented); + tcase_add_test (tc, controller_interpolation_none); + tcase_add_test (tc, controller_interpolation_linear); + tcase_add_test (tc, controller_interpolation_cubic); + tcase_add_test (tc, controller_interpolation_cubic_too_few_cp); tcase_add_test (tc, controller_interpolation_unset); tcase_add_test (tc, controller_interpolation_unset_all); tcase_add_test (tc, controller_interpolation_linear_value_array); tcase_add_test (tc, controller_interpolation_linear_invalid_values); tcase_add_test (tc, controller_interpolation_linear_default_values); - tcase_add_test (tc, controller_interpolate_linear_disabled); + tcase_add_test (tc, controller_interpolation_linear_disabled); tcase_add_test (tc, controller_interpolation_set_from_list); + tcase_add_test (tc, controller_interpolation_linear_before_ts0); + tcase_add_test (tc, controller_interpolation_linear_enums); + tcase_add_test (tc, controller_timed_value_count); tcase_add_test (tc, controller_lfo_sine); tcase_add_test (tc, controller_lfo_sine_timeshift); tcase_add_test (tc, controller_lfo_square); @@ -2296,9 +1526,8 @@ gst_controller_suite (void) tcase_add_test (tc, controller_lfo_rsaw); tcase_add_test (tc, controller_lfo_triangle); tcase_add_test (tc, controller_lfo_none); - tcase_add_test (tc, controller_helper_any_gobject); - tcase_add_test (tc, controller_interpolate_linear_before_ts0); - tcase_add_test (tc, controller_interpolation_cp_count); + tcase_add_test (tc, controller_trigger_exact); + tcase_add_test (tc, controller_trigger_tolerance); return s; } |