Tizen 2.0 Release
[framework/multimedia/gst-plugins-good0.10.git] / tests / check / elements / audioiirfilter.c
1 /* GStreamer
2  *
3  * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation; either version 2.1 of
8  * the License, or (at your option) any later version.
9  * 
10  * This library is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  * 
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301 USA
19  */
20
21 #include <gst/gst.h>
22 #include <gst/check/gstcheck.h>
23
24 static gboolean have_eos = FALSE;
25
26 static gboolean
27 on_message (GstBus * bus, GstMessage * message, gpointer user_data)
28 {
29   GMainLoop *loop = (GMainLoop *) user_data;
30
31   switch (GST_MESSAGE_TYPE (message)) {
32     case GST_MESSAGE_ERROR:
33     case GST_MESSAGE_WARNING:
34       g_assert_not_reached ();
35       g_main_loop_quit (loop);
36       break;
37
38     case GST_MESSAGE_EOS:
39       have_eos = TRUE;
40       g_main_loop_quit (loop);
41       break;
42     default:
43       break;
44   }
45
46   return TRUE;
47 }
48
49 static void
50 on_rate_changed (GstElement * element, gint rate, gpointer user_data)
51 {
52   GValueArray *va;
53   GValue v = { 0, };
54
55   fail_unless (rate > 0);
56
57   va = g_value_array_new (6);
58
59   g_value_init (&v, G_TYPE_DOUBLE);
60   g_value_set_double (&v, 0.0);
61   g_value_array_append (va, &v);
62   g_value_reset (&v);
63   g_value_set_double (&v, 0.0);
64   g_value_array_append (va, &v);
65   g_value_reset (&v);
66   g_value_set_double (&v, 0.0);
67   g_value_array_append (va, &v);
68   g_value_reset (&v);
69   g_value_set_double (&v, 0.0);
70   g_value_array_append (va, &v);
71   g_value_reset (&v);
72   g_value_set_double (&v, 0.0);
73   g_value_array_append (va, &v);
74   g_value_reset (&v);
75   g_value_set_double (&v, 1.0);
76   g_value_array_append (va, &v);
77   g_value_reset (&v);
78
79   g_object_set (G_OBJECT (element), "a", va, NULL);
80
81   g_value_array_free (va);
82
83   va = g_value_array_new (6);
84
85   g_value_set_double (&v, 0.0);
86   g_value_array_append (va, &v);
87   g_value_reset (&v);
88
89   g_object_set (G_OBJECT (element), "b", va, NULL);
90
91   g_value_array_free (va);
92 }
93
94 static gboolean have_data = FALSE;
95
96 static void
97 on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad,
98     gpointer user_data)
99 {
100   if (!have_data) {
101     gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer);
102
103     fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble));
104     fail_unless (data[0] == 0.0);
105     fail_unless (data[1] == 0.0);
106     fail_unless (data[2] == 0.0);
107     fail_unless (data[3] == 0.0);
108     fail_unless (data[4] == 0.0);
109     fail_unless (data[5] != 0.0);
110     have_data = TRUE;
111   }
112 }
113
114 GST_START_TEST (test_pipeline)
115 {
116   GstElement *pipeline, *src, *filter, *sink;
117   GstBus *bus;
118   GMainLoop *loop;
119
120   have_data = FALSE;
121   have_eos = FALSE;
122
123   pipeline = gst_element_factory_make ("pipeline", NULL);
124   fail_unless (pipeline != NULL);
125
126   src = gst_element_factory_make ("audiotestsrc", NULL);
127   fail_unless (src != NULL);
128   g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL);
129
130   filter = gst_element_factory_make ("audioiirfilter", NULL);
131   fail_unless (filter != NULL);
132   g_signal_connect (G_OBJECT (filter), "rate-changed",
133       G_CALLBACK (on_rate_changed), NULL);
134
135   sink = gst_element_factory_make ("fakesink", NULL);
136   fail_unless (sink != NULL);
137   g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
138   g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL);
139
140   gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL);
141   fail_unless (gst_element_link_many (src, filter, sink, NULL));
142
143   loop = g_main_loop_new (NULL, FALSE);
144
145   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
146   gst_bus_add_signal_watch (bus);
147   g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
148   gst_object_unref (GST_OBJECT (bus));
149
150   fail_if (gst_element_set_state (pipeline,
151           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
152
153   g_main_loop_run (loop);
154
155   fail_unless (have_data);
156   fail_unless (have_eos);
157
158   fail_unless (gst_element_set_state (pipeline,
159           GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
160
161   g_main_loop_unref (loop);
162   gst_object_unref (pipeline);
163 }
164
165 GST_END_TEST;
166
167 static Suite *
168 audioiirfilter_suite (void)
169 {
170   Suite *s = suite_create ("audioiirfilter");
171   TCase *tc_chain = tcase_create ("general");
172
173   suite_add_tcase (s, tc_chain);
174   tcase_add_test (tc_chain, test_pipeline);
175
176   return s;
177 }
178
179 GST_CHECK_MAIN (audioiirfilter);