mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 16:26:39 +00:00
c161e29307
Original commit message from CVS: * docs/libs/gst-plugins-base-libs-sections.txt: * ext/alsa/gstalsamixer.c: * ext/alsa/gstalsamixer.h: * ext/alsa/gstalsamixerelement.c: * ext/alsa/gstalsamixertrack.c: * gst-libs/gst/interfaces/mixer.c: * gst-libs/gst/interfaces/mixer.h: * gst-libs/gst/interfaces/mixeroptions.c: * gst-libs/gst/interfaces/mixeroptions.h: * gst-libs/gst/interfaces/mixertrack.c: * gst-libs/gst/interfaces/mixertrack.h: * tests/check/Makefile.am: * tests/check/libs/mixer.c: Patch By: Marc-Andre Lureau <marcandre.lureau@gmail.com> Fixes: #152864 Add support for notifying mixer changes on the message bus, and implement it in alsamixer. API: gst_mixer_get_mixer_flags API: gst_mixer_message_parse_mute_toggled API: gst_mixer_message_parse_record_toggled API: gst_mixer_message_parse_volume_changed API: gst_mixer_message_parse_option_changed API: GstMixerMessageType API: GstMixerFlags
222 lines
6.2 KiB
C
222 lines
6.2 KiB
C
/* GStreamer
|
|
*
|
|
* unit tests for audio support library
|
|
*
|
|
* Copyright (C) 2007 Jan Schmidt <thaytan@noraisin.net>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <gst/check/gstcheck.h>
|
|
|
|
#include <gst/interfaces/mixer.h>
|
|
|
|
#include <string.h>
|
|
|
|
#define TEST_ELEMENT_TYPE (test_element_get_type())
|
|
|
|
typedef struct TestElement TestElement;
|
|
typedef struct TestElementClass TestElementClass;
|
|
|
|
struct TestElement
|
|
{
|
|
GstElement parent;
|
|
};
|
|
|
|
struct TestElementClass
|
|
{
|
|
GstElementClass parent_class;
|
|
};
|
|
|
|
static void init_interface (GType type);
|
|
static void gst_implements_interface_init (GstImplementsInterfaceClass * klass);
|
|
|
|
GST_BOILERPLATE_FULL (TestElement, test_element, GstElement, GST_TYPE_ELEMENT,
|
|
init_interface);
|
|
|
|
static void
|
|
test_element_mixer_interface_init (GstMixerClass * klass)
|
|
{
|
|
/* Not actually implementing any interfaces for this test atm */
|
|
}
|
|
|
|
static void
|
|
init_interface (GType type)
|
|
{
|
|
static const GInterfaceInfo mixer_iface_info = {
|
|
(GInterfaceInitFunc) test_element_mixer_interface_init,
|
|
NULL,
|
|
NULL,
|
|
};
|
|
static const GInterfaceInfo implements_iface_info = {
|
|
(GInterfaceInitFunc) gst_implements_interface_init,
|
|
NULL,
|
|
NULL,
|
|
};
|
|
|
|
g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE,
|
|
&implements_iface_info);
|
|
g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info);
|
|
}
|
|
|
|
static void
|
|
test_element_base_init (gpointer klass)
|
|
{
|
|
}
|
|
|
|
static void
|
|
test_element_class_init (TestElementClass * klass)
|
|
{
|
|
}
|
|
|
|
static gboolean
|
|
test_element_interface_supported (TestElement * this, GType interface_type)
|
|
{
|
|
if (interface_type == GST_TYPE_MIXER)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
gst_implements_interface_init (GstImplementsInterfaceClass * klass)
|
|
{
|
|
klass->supported = (gpointer) test_element_interface_supported;
|
|
}
|
|
|
|
static void
|
|
test_element_init (TestElement * this, TestElementClass * klass)
|
|
{
|
|
}
|
|
|
|
GST_START_TEST (test_messages)
|
|
{
|
|
/* Create an empty GstElement that has a GstMixer interface and then
|
|
* send some notifications and validate them */
|
|
GstElement *test_element =
|
|
(GstElement *) g_object_new (TEST_ELEMENT_TYPE, NULL);
|
|
GstBus *bus = gst_bus_new ();
|
|
GstMixerTrack *mtrack = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
|
|
GstMixerOptions *mopts = g_object_new (GST_TYPE_MIXER_OPTIONS, NULL);
|
|
GstMixerTrack *t;
|
|
GstMixerOptions *o;
|
|
gint vols_in[2] = { 50, 75 };
|
|
gboolean mute, record;
|
|
gint *vols_out;
|
|
gint n_chans, i;
|
|
const gchar *val;
|
|
GstMessage *message;
|
|
|
|
mtrack->num_channels = 2;
|
|
mtrack->flags = GST_MIXER_TRACK_MUTE | GST_MIXER_TRACK_RECORD;
|
|
|
|
gst_element_set_bus (test_element, bus);
|
|
|
|
/* Test mute-toggled */
|
|
gst_mixer_mute_toggled (GST_MIXER (test_element), mtrack, TRUE);
|
|
message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
|
|
fail_if (message == NULL);
|
|
fail_unless (gst_mixer_message_get_type (message) ==
|
|
GST_MIXER_MESSAGE_MUTE_TOGGLED);
|
|
/* Test that we can pass NULL args */
|
|
gst_mixer_message_parse_mute_toggled (message, NULL, NULL);
|
|
/* Test the parsing */
|
|
gst_mixer_message_parse_mute_toggled (message, &t, &mute);
|
|
fail_unless (t == mtrack);
|
|
fail_unless (mute == TRUE);
|
|
gst_message_unref (message);
|
|
|
|
/* Test record-toggled */
|
|
gst_mixer_record_toggled (GST_MIXER (test_element), mtrack, TRUE);
|
|
message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
|
|
fail_if (message == NULL);
|
|
fail_unless (gst_mixer_message_get_type (message) ==
|
|
GST_MIXER_MESSAGE_RECORD_TOGGLED);
|
|
gst_mixer_message_parse_record_toggled (message, NULL, NULL);
|
|
gst_mixer_message_parse_record_toggled (message, &t, &record);
|
|
fail_unless (t == mtrack);
|
|
fail_unless (record == TRUE);
|
|
gst_message_unref (message);
|
|
|
|
/* Test volume-changed */
|
|
gst_mixer_volume_changed (GST_MIXER (test_element), mtrack, vols_in);
|
|
message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
|
|
fail_if (message == NULL);
|
|
fail_unless (gst_mixer_message_get_type (message) ==
|
|
GST_MIXER_MESSAGE_VOLUME_CHANGED);
|
|
gst_mixer_message_parse_volume_changed (message, NULL, NULL, NULL);
|
|
gst_mixer_message_parse_volume_changed (message, NULL, NULL, &n_chans);
|
|
fail_unless (n_chans == 2);
|
|
gst_mixer_message_parse_volume_changed (message, &t, &vols_out, &n_chans);
|
|
fail_unless (mtrack == t);
|
|
for (i = 0; i < n_chans; i++)
|
|
fail_unless (vols_out[i] == vols_in[i]);
|
|
|
|
gst_message_unref (message);
|
|
g_free (vols_out);
|
|
|
|
/* Test options-changed */
|
|
gst_mixer_option_changed (GST_MIXER (test_element), mopts, "TESTING");
|
|
message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, GST_CLOCK_TIME_NONE);
|
|
fail_if (message == NULL);
|
|
fail_unless (gst_mixer_message_get_type (message) ==
|
|
GST_MIXER_MESSAGE_OPTION_CHANGED);
|
|
gst_mixer_message_parse_option_changed (message, NULL, NULL);
|
|
gst_mixer_message_parse_option_changed (message, &o, &val);
|
|
fail_unless (o == mopts);
|
|
fail_unless (g_str_equal (val, "TESTING"));
|
|
gst_message_unref (message);
|
|
|
|
gst_object_unref (mtrack);
|
|
gst_object_unref (mopts);
|
|
gst_object_unref (bus);
|
|
gst_object_unref (test_element);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
static Suite *
|
|
mixer_suite (void)
|
|
{
|
|
Suite *s = suite_create ("mixer interface");
|
|
TCase *tc_chain = tcase_create ("notifications");
|
|
|
|
suite_add_tcase (s, tc_chain);
|
|
tcase_add_test (tc_chain, test_messages);
|
|
|
|
return s;
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
int nf;
|
|
|
|
Suite *s = mixer_suite ();
|
|
SRunner *sr = srunner_create (s);
|
|
|
|
gst_check_init (&argc, &argv);
|
|
|
|
srunner_run_all (sr, CK_NORMAL);
|
|
nf = srunner_ntests_failed (sr);
|
|
srunner_free (sr);
|
|
|
|
return nf;
|
|
}
|