controller: move GValue handling from control-sources to -binding
[platform/upstream/gstreamer.git] / tests / examples / controller / control-sources.c
1 /* 
2  * control-sources.c
3  *
4  * Generates a datafile for various control sources.
5  *
6  * Needs gnuplot for plotting.
7  * plot "ctrl_interpolation.dat" using 1:2 with points title 'none', "" using 1:3 with points title 'linear', "" using 1:4 with points title 'cubic'
8  * plot "ctrl_lfo.dat" using 1:2 with points title 'sine', "" using 1:3 with points title 'saw', "" using 1:4 with points title 'square', "" using 1:5 with points title 'triangle'
9  */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include <gst/gst.h>
15 #include <gst/controller/gstinterpolationcontrolsource.h>
16 #include <gst/controller/gstlfocontrolsource.h>
17
18 /* local test element */
19
20 enum
21 {
22   PROP_INT = 1,
23   PROP_FLOAT,
24   PROP_DOUBLE,
25   PROP_BOOLEAN,
26   PROP_COUNT
27 };
28
29 #define GST_TYPE_TEST_OBJ            (gst_test_obj_get_type ())
30 #define GST_TEST_OBJ(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_OBJ, GstTestObj))
31 #define GST_TEST_OBJ_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_OBJ, GstTestObjClass))
32 #define GST_IS_TEST_OBJ(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_OBJ))
33 #define GST_IS_TEST_OBJ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_OBJ))
34 #define GST_TEST_OBJ_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_OBJ, GstTestObjClass))
35
36 typedef struct _GstTestObj GstTestObj;
37 typedef struct _GstTestObjClass GstTestObjClass;
38
39 struct _GstTestObj
40 {
41   GstElement parent;
42   gint val_int;
43   gfloat val_float;
44   gdouble val_double;
45   gboolean val_boolean;
46 };
47 struct _GstTestObjClass
48 {
49   GstElementClass parent_class;
50 };
51
52 static GType gst_test_obj_get_type (void);
53
54 static void
55 gst_test_obj_get_property (GObject * object,
56     guint property_id, GValue * value, GParamSpec * pspec)
57 {
58   GstTestObj *self = GST_TEST_OBJ (object);
59
60   switch (property_id) {
61     case PROP_INT:
62       g_value_set_int (value, self->val_int);
63       break;
64     case PROP_FLOAT:
65       g_value_set_float (value, self->val_float);
66       break;
67     case PROP_DOUBLE:
68       g_value_set_double (value, self->val_double);
69       break;
70     case PROP_BOOLEAN:
71       g_value_set_boolean (value, self->val_boolean);
72       break;
73     default:
74       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
75       break;
76   }
77 }
78
79 static void
80 gst_test_obj_set_property (GObject * object,
81     guint property_id, const GValue * value, GParamSpec * pspec)
82 {
83   GstTestObj *self = GST_TEST_OBJ (object);
84
85   switch (property_id) {
86     case PROP_INT:
87       self->val_int = g_value_get_int (value);
88       GST_DEBUG ("test value int=%d", self->val_int);
89       break;
90     case PROP_FLOAT:
91       self->val_float = g_value_get_float (value);
92       GST_DEBUG ("test value float=%f", self->val_float);
93       break;
94     case PROP_DOUBLE:
95       self->val_double = g_value_get_double (value);
96       GST_DEBUG ("test value double=%f", self->val_double);
97       break;
98     case PROP_BOOLEAN:
99       self->val_boolean = g_value_get_boolean (value);
100       GST_DEBUG ("test value boolean=%d", self->val_boolean);
101       break;
102     default:
103       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
104       break;
105   }
106 }
107
108 static void
109 gst_test_obj_class_init (GstTestObjClass * klass)
110 {
111   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
112
113   gobject_class->set_property = gst_test_obj_set_property;
114   gobject_class->get_property = gst_test_obj_get_property;
115
116   g_object_class_install_property (gobject_class, PROP_INT,
117       g_param_spec_int ("int",
118           "int prop",
119           "int number parameter for the TEST_OBJ",
120           0, 100, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
121
122   g_object_class_install_property (gobject_class, PROP_FLOAT,
123       g_param_spec_float ("float",
124           "float prop",
125           "float number parameter for the TEST_OBJ",
126           0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
127
128   g_object_class_install_property (gobject_class, PROP_DOUBLE,
129       g_param_spec_double ("double",
130           "double prop",
131           "double number parameter for the TEST_OBJ",
132           0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
133
134   g_object_class_install_property (gobject_class, PROP_BOOLEAN,
135       g_param_spec_boolean ("boolean",
136           "boolean prop",
137           "boolean parameter for the TEST_OBJ",
138           FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
139 }
140
141 static void
142 gst_test_obj_base_init (GstTestObjClass * klass)
143 {
144   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
145
146   gst_element_class_set_details_simple (element_class,
147       "test object for unit tests",
148       "Test", "Use in unit tests", "Stefan Sauer <ensonic@users.sf.net>");
149 }
150
151 static GType
152 gst_test_obj_get_type (void)
153 {
154   static volatile gsize TEST_OBJ_type = 0;
155
156   if (g_once_init_enter (&TEST_OBJ_type)) {
157     GType type;
158     static const GTypeInfo info = {
159       (guint16) sizeof (GstTestObjClass),
160       (GBaseInitFunc) gst_test_obj_base_init,   // base_init
161       NULL,                     // base_finalize
162       (GClassInitFunc) gst_test_obj_class_init, // class_init
163       NULL,                     // class_finalize
164       NULL,                     // class_data
165       (guint16) sizeof (GstTestObj),
166       0,                        // n_preallocs
167       NULL,                     // instance_init
168       NULL                      // value_table
169     };
170     type = g_type_register_static (GST_TYPE_ELEMENT, "GstTestObj", &info, 0);
171     g_once_init_leave (&TEST_OBJ_type, type);
172   }
173   return TEST_OBJ_type;
174 }
175
176 static void
177 test_interpolation (void)
178 {
179   GstObject *e;
180   GstInterpolationControlSource *ics;
181   GstTimedValueControlSource *tvcs;
182   GstControlSource *cs;
183   gint t, i1, i2, i3;
184   FILE *f;
185
186   e = (GstObject *) gst_element_factory_make ("testobj", NULL);
187
188   ics = gst_interpolation_control_source_new ();
189   tvcs = (GstTimedValueControlSource *) ics;
190   cs = (GstControlSource *) ics;
191
192   gst_object_set_control_source (e, "int", cs);
193
194   gst_timed_value_control_source_set (tvcs, 0 * GST_SECOND, 0.0);
195   gst_timed_value_control_source_set (tvcs, 10 * GST_SECOND, 1.0);
196   gst_timed_value_control_source_set (tvcs, 20 * GST_SECOND, 0.5);
197   gst_timed_value_control_source_set (tvcs, 30 * GST_SECOND, 0.2);
198
199   if (!(f = fopen ("ctrl_interpolation.dat", "w")))
200     exit (-1);
201   fprintf (f, "# Time None Linear Cubic\n");
202
203   for (t = 0; t < 40; t++) {
204     g_object_set (ics, "mode", GST_INTERPOLATION_MODE_NONE, NULL);
205     gst_object_sync_values (e, t * GST_SECOND);
206     i1 = GST_TEST_OBJ (e)->val_int;
207
208     g_object_set (ics, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
209     gst_object_sync_values (e, t * GST_SECOND);
210     i2 = GST_TEST_OBJ (e)->val_int;
211
212     g_object_set (ics, "mode", GST_INTERPOLATION_MODE_CUBIC, NULL);
213     gst_object_sync_values (e, t * GST_SECOND);
214     i3 = GST_TEST_OBJ (e)->val_int;
215
216     fprintf (f, "%d %d %d %d\n", t, i1, i2, i3);
217   }
218
219   fclose (f);
220
221   gst_object_unref (e);
222 }
223
224 static void
225 test_lfo (void)
226 {
227   GstObject *e;
228   GstLFOControlSource *lfocs;
229   GstControlSource *cs;
230   gint t, i1, i2, i3, i4;
231   FILE *f;
232
233   e = (GstObject *) gst_element_factory_make ("testobj", NULL);
234
235   lfocs = gst_lfo_control_source_new ();
236   cs = (GstControlSource *) lfocs;
237
238   gst_object_set_control_source (e, "int", cs);
239
240   g_object_set (lfocs,
241       "frequency", (gdouble) 0.05,
242       "timeshift", (GstClockTime) 0,
243       "amplitude", (gdouble) 0.5, "offset", (gdouble) 0.5, NULL);
244
245   if (!(f = fopen ("ctrl_lfo.dat", "w")))
246     exit (-1);
247   fprintf (f, "# Time Sine Saw Square Triangle\n");
248
249   for (t = 0; t < 40; t++) {
250     g_object_set (lfocs, "waveform", GST_LFO_WAVEFORM_SINE, NULL);
251     gst_object_sync_values (e, t * GST_SECOND);
252     i1 = GST_TEST_OBJ (e)->val_int;
253
254     g_object_set (lfocs, "waveform", GST_LFO_WAVEFORM_SAW, NULL);
255     gst_object_sync_values (e, t * GST_SECOND);
256     i2 = GST_TEST_OBJ (e)->val_int;
257
258     g_object_set (lfocs, "waveform", GST_LFO_WAVEFORM_SQUARE, NULL);
259     gst_object_sync_values (e, t * GST_SECOND);
260     i3 = GST_TEST_OBJ (e)->val_int;
261
262     g_object_set (lfocs, "waveform", GST_LFO_WAVEFORM_TRIANGLE, NULL);
263     gst_object_sync_values (e, t * GST_SECOND);
264     i4 = GST_TEST_OBJ (e)->val_int;
265
266     fprintf (f, "%d %d %d %d %d\n", t, i1, i2, i3, i4);
267   }
268
269   fclose (f);
270
271   gst_object_unref (e);
272 }
273
274
275 gint
276 main (gint argc, gchar ** argv)
277 {
278   gst_init (&argc, &argv);
279
280   gst_element_register (NULL, "testobj", GST_RANK_NONE, GST_TYPE_TEST_OBJ);
281
282   test_interpolation ();
283   test_lfo ();
284
285   return 0;
286 }