3 * unit tests for audio support library
5 * Copyright (C) 2007 Jan Schmidt <thaytan@noraisin.net>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
27 #include <gst/check/gstcheck.h>
29 #include <gst/interfaces/mixer.h>
33 #define TEST_ELEMENT_TYPE (test_element_get_type())
35 typedef struct TestElement TestElement;
36 typedef struct TestElementClass TestElementClass;
43 struct TestElementClass
45 GstElementClass parent_class;
48 static void init_interface (GType type);
49 static void gst_implements_interface_init (GstImplementsInterfaceClass * klass);
51 GST_BOILERPLATE_FULL (TestElement, test_element, GstElement, GST_TYPE_ELEMENT,
55 test_element_mixer_interface_init (GstMixerClass * klass)
57 /* Not actually implementing any interfaces for this test atm */
61 init_interface (GType type)
63 static const GInterfaceInfo mixer_iface_info = {
64 (GInterfaceInitFunc) test_element_mixer_interface_init,
68 static const GInterfaceInfo implements_iface_info = {
69 (GInterfaceInitFunc) gst_implements_interface_init,
74 g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE,
75 &implements_iface_info);
76 g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info);
80 test_element_base_init (gpointer klass)
85 test_element_class_init (TestElementClass * klass)
90 test_element_interface_supported (GstImplementsInterface * ifacE,
93 if (interface_type == GST_TYPE_MIXER)
100 gst_implements_interface_init (GstImplementsInterfaceClass * klass)
102 klass->supported = test_element_interface_supported;
106 test_element_init (TestElement * this, TestElementClass * klass)
110 GST_START_TEST (test_messages)
112 /* Create an empty GstElement that has a GstMixer interface and then
113 * send some notifications and validate them */
114 GstElement *test_element =
115 (GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
116 GstBus *bus = gst_bus_new ();
117 GstMixerTrack *mtrack = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
118 GstMixerOptions *mopts = g_object_new (GST_TYPE_MIXER_OPTIONS, NULL);
121 gint vols_in[2] = { 50, 75 };
122 gboolean mute, record;
128 mtrack->num_channels = 2;
129 mtrack->flags = GST_MIXER_TRACK_MUTE | GST_MIXER_TRACK_RECORD;
131 gst_element_set_bus (test_element, bus);
133 /* Test mute-toggled */
134 gst_mixer_mute_toggled (GST_MIXER (test_element), mtrack, TRUE);
135 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
136 fail_if (message == NULL);
137 fail_unless (gst_mixer_message_get_type (message) ==
138 GST_MIXER_MESSAGE_MUTE_TOGGLED);
139 /* Test that we can pass NULL args */
140 gst_mixer_message_parse_mute_toggled (message, NULL, NULL);
141 /* Test the parsing */
142 gst_mixer_message_parse_mute_toggled (message, &t, &mute);
143 fail_unless (t == mtrack);
144 fail_unless (mute == TRUE);
145 gst_message_unref (message);
147 /* Test record-toggled */
148 gst_mixer_record_toggled (GST_MIXER (test_element), mtrack, TRUE);
149 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
150 fail_if (message == NULL);
151 fail_unless (gst_mixer_message_get_type (message) ==
152 GST_MIXER_MESSAGE_RECORD_TOGGLED);
153 gst_mixer_message_parse_record_toggled (message, NULL, NULL);
154 gst_mixer_message_parse_record_toggled (message, &t, &record);
155 fail_unless (t == mtrack);
156 fail_unless (record == TRUE);
157 gst_message_unref (message);
159 /* Test volume-changed */
160 gst_mixer_volume_changed (GST_MIXER (test_element), mtrack, vols_in);
161 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
162 fail_if (message == NULL);
163 fail_unless (gst_mixer_message_get_type (message) ==
164 GST_MIXER_MESSAGE_VOLUME_CHANGED);
165 gst_mixer_message_parse_volume_changed (message, NULL, NULL, NULL);
166 gst_mixer_message_parse_volume_changed (message, NULL, NULL, &n_chans);
167 fail_unless (n_chans == 2);
168 gst_mixer_message_parse_volume_changed (message, &t, &vols_out, &n_chans);
169 fail_unless (mtrack == t);
170 for (i = 0; i < n_chans; i++)
171 fail_unless (vols_out[i] == vols_in[i]);
173 gst_message_unref (message);
176 /* Test option-changed */
177 gst_mixer_option_changed (GST_MIXER (test_element), mopts, "TESTING");
178 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
179 fail_if (message == NULL);
180 fail_unless (gst_mixer_message_get_type (message) ==
181 GST_MIXER_MESSAGE_OPTION_CHANGED);
182 gst_mixer_message_parse_option_changed (message, NULL, NULL);
183 gst_mixer_message_parse_option_changed (message, &o, &val);
184 fail_unless (o == mopts);
185 fail_unless (g_str_equal (val, "TESTING"));
186 gst_message_unref (message);
188 /* Test options-list-changed */
189 gst_mixer_options_list_changed (GST_MIXER (test_element), mopts);
190 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
191 fail_if (message == NULL);
192 fail_unless (gst_mixer_message_get_type (message) ==
193 GST_MIXER_MESSAGE_OPTIONS_LIST_CHANGED);
194 gst_mixer_message_parse_options_list_changed (message, &o);
195 fail_unless (o == mopts);
196 gst_message_unref (message);
198 /* Test mixer-changed */
199 gst_mixer_mixer_changed (GST_MIXER (test_element));
200 message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
201 fail_if (message == NULL);
202 fail_unless (gst_mixer_message_get_type (message) ==
203 GST_MIXER_MESSAGE_MIXER_CHANGED);
204 gst_message_unref (message);
206 gst_object_unref (mtrack);
207 gst_object_unref (mopts);
208 gst_object_unref (bus);
209 gst_object_unref (test_element);
217 Suite *s = suite_create ("mixer interface");
218 TCase *tc_chain = tcase_create ("notifications");
220 suite_add_tcase (s, tc_chain);
221 tcase_add_test (tc_chain, test_messages);
227 main (int argc, char **argv)
231 Suite *s = mixer_suite ();
232 SRunner *sr = srunner_create (s);
234 gst_check_init (&argc, &argv);
236 srunner_run_all (sr, CK_NORMAL);
237 nf = srunner_ntests_failed (sr);