summaryrefslogtreecommitdiffstats
path: root/tests/icles
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2008-05-22 16:33:25 +0000
committerTim-Philipp Müller <tim@centricular.net>2008-05-22 16:33:25 +0000
commit464df32d53bd1a4ab570276d3af6da4da1b4321a (patch)
tree2d1217bc7730f2918b71efdd366b7a58851ee7ee /tests/icles
parent80ef4ca4d7449550b2c5aa05d55d7c697a7c1fab (diff)
downloadgst-plugins-bad-464df32d53bd1a4ab570276d3af6da4da1b4321a.tar.gz
gst-plugins-bad-464df32d53bd1a4ab570276d3af6da4da1b4321a.tar.bz2
gst-plugins-bad-464df32d53bd1a4ab570276d3af6da4da1b4321a.zip
tests/icles/: Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all tha...
Original commit message from CVS: * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/test-oss4.c: (opt_show_mixer_messages), (WAIT_TIME), (show_mixer_messages), (probe_mixer_tracks), (probe_pad), (probe_details), (probe_element), (main): Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all that. Also allows testing of mixer change messages on the bus.
Diffstat (limited to 'tests/icles')
-rw-r--r--tests/icles/.gitignore2
-rw-r--r--tests/icles/Makefile.am12
-rw-r--r--tests/icles/test-oss4.c251
3 files changed, 263 insertions, 2 deletions
diff --git a/tests/icles/.gitignore b/tests/icles/.gitignore
index aa8e2e41..73381301 100644
--- a/tests/icles/.gitignore
+++ b/tests/icles/.gitignore
@@ -1,5 +1,5 @@
equalizer-test
metadata_editor
output-selector-test
+test-oss4
pitch-test
-
diff --git a/tests/icles/Makefile.am b/tests/icles/Makefile.am
index db5a16c1..f2755a3f 100644
--- a/tests/icles/Makefile.am
+++ b/tests/icles/Makefile.am
@@ -1,3 +1,9 @@
+if USE_OSS4
+OSS4_TESTS=test-oss4
+else
+OSS4_TESTS=
+endif
+
if USE_SOUNDTOUCH
GST_SOUNDTOUCH_TESTS = pitch-test
@@ -40,6 +46,10 @@ equalizer_test_CFLAGS = $(GST_CFLAGS)
equalizer_test_LDADD = $(GST_LIBS)
equalizer_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+test_oss4_SOURCES = test-oss4.c
+test_oss4_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+test_oss4_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_LIBS)
+test_oss4_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
output_selector_test_SOURCES = output-selector-test.c
output_selector_test_CFLAGS = $(GST_CFLAGS)
@@ -47,6 +57,6 @@ output_selector_test_LDADD = $(GST_LIBS)
output_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-noinst_PROGRAMS = $(GST_SOUNDTOUCH_TESTS) $(GST_METADATA_TESTS) \
+noinst_PROGRAMS = $(GST_SOUNDTOUCH_TESTS) $(GST_METADATA_TESTS) $(OSS4_TESTS) \
equalizer-test output-selector-test
diff --git a/tests/icles/test-oss4.c b/tests/icles/test-oss4.c
new file mode 100644
index 00000000..60943879
--- /dev/null
+++ b/tests/icles/test-oss4.c
@@ -0,0 +1,251 @@
+/* GStreamer OSS4 audio tests
+ * Copyright (C) 2007-2008 Tim-Philipp Müller <tim centricular 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 <string.h>
+
+#include <gst/gst.h>
+#include <gst/interfaces/propertyprobe.h>
+#include <gst/interfaces/mixer.h>
+
+static gboolean opt_show_mixer_messages = FALSE;
+
+#define WAIT_TIME 60.0 /* in seconds */
+
+static void
+show_mixer_messages (GstElement * element)
+{
+ GstMessage *msg;
+ GstBus *bus;
+ GTimer *t;
+
+ t = g_timer_new ();
+
+ bus = gst_bus_new ();
+ gst_element_set_bus (element, bus);
+
+ g_print ("\nShowing mixer messages for %u seconds ...\n", (guint) WAIT_TIME);
+
+ while (g_timer_elapsed (t, NULL) < WAIT_TIME) {
+ gdouble remaining = WAIT_TIME - g_timer_elapsed (t, NULL);
+ gint64 maxwait =
+ GST_SECOND * gst_util_gdouble_to_guint64 (MAX (0.0, remaining));
+ gchar *s = NULL;
+
+ msg = gst_bus_timed_pop (bus, maxwait);
+ if (!msg)
+ break;
+
+ if (msg->structure)
+ s = gst_structure_to_string (msg->structure);
+ g_print ("%s message: %s\n", GST_MESSAGE_TYPE_NAME (msg), s);
+ gst_message_unref (msg);
+ g_free (s);
+ }
+
+ gst_element_set_bus (element, NULL);
+ gst_object_unref (bus);
+ g_timer_destroy (t);
+}
+
+static void
+probe_mixer_tracks (GstElement * element)
+{
+ const GList *tracks, *t;
+ GstMixer *mixer;
+ guint count;
+
+ if (!GST_IS_MIXER (element))
+ return;
+
+ mixer = GST_MIXER (element);
+ tracks = gst_mixer_list_tracks (mixer);
+ count = g_list_length ((GList *) tracks);
+ g_print (" %d mixer tracks%c\n", count, (count == 0) ? '.' : ':');
+
+ for (t = tracks; t != NULL; t = t->next) {
+ GstMixerTrack *track;
+ gchar *label = NULL;
+ guint flags = 0;
+
+ track = GST_MIXER_TRACK (t->data);
+ g_object_get (track, "label", &label, "flags", &flags, NULL);
+
+ if (GST_IS_MIXER_OPTIONS (track)) {
+ GString *s;
+ GList *vals, *v;
+
+ vals = gst_mixer_options_get_values (GST_MIXER_OPTIONS (track));
+ s = g_string_new ("options: ");
+ for (v = vals; v != NULL; v = v->next) {
+ if (v->prev != NULL)
+ g_string_append (s, ", ");
+ g_string_append (s, (const gchar *) v->data);
+ }
+
+ g_print (" [%s] flags=0x%08x, %s\n", label, flags, s->str);
+ g_string_free (s, TRUE);
+ } else if (track->num_channels == 0) {
+ g_print (" [%s] flags=0x%08x, switch\n", label, flags);
+ } else if (track->num_channels > 0) {
+ g_print (" [%s] flags=0x%08x, slider (%d channels)\n", label, flags,
+ track->num_channels);
+ } else {
+ g_print (" [%s] flags=0x%08x, UNKNOWN TYPE\n", label, flags);
+ }
+
+ g_free (label);
+ }
+
+ /* for testing the mixer watch thread / auto-notifications */
+ if (strstr (GST_ELEMENT_NAME (element), "mixer") != NULL &&
+ opt_show_mixer_messages) {
+ show_mixer_messages (element);
+ }
+}
+
+static void
+probe_pad (GstElement * element, const gchar * pad_name)
+{
+ GstCaps *caps = NULL;
+ GstPad *pad;
+ guint i;
+
+ pad = gst_element_get_static_pad (element, pad_name);
+ if (pad == NULL)
+ return;
+
+ caps = gst_pad_get_caps (pad);
+ g_return_if_fail (caps != NULL);
+
+ for (i = 0; i < gst_caps_get_size (caps); ++i) {
+ gchar *s;
+
+ s = gst_structure_to_string (gst_caps_get_structure (caps, i));
+ g_print (" %4s[%d]: %s\n", GST_PAD_NAME (pad), i, s);
+ g_free (s);
+ }
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+}
+
+static void
+probe_details (GstElement * element)
+{
+ GstStateChangeReturn ret;
+
+ ret = gst_element_set_state (element, GST_STATE_READY);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_print ("Could not set element %s to READY.", GST_ELEMENT_NAME (element));
+ return;
+ }
+
+ probe_pad (element, "sink");
+ probe_pad (element, "src");
+
+ probe_mixer_tracks (element);
+
+ gst_element_set_state (element, GST_STATE_NULL);
+}
+
+static void
+probe_element (const gchar * name)
+{
+ GstPropertyProbe *probe;
+ GValueArray *arr;
+ GstElement *element;
+ gchar *devname = NULL;
+ gint i;
+
+ element = gst_element_factory_make (name, name);
+
+ /* make sure we don't deadlock on GST_ELEMENT_ERROR or do other silly things
+ * if we try to query the "device-name" property when the device isn't open */
+ g_object_set (element, "device", "/dev/does/not/exist", NULL);
+ g_object_get (element, "device-name", &devname, NULL);
+ g_assert (devname == NULL);
+
+ /* and now for real */
+
+ probe = GST_PROPERTY_PROBE (element);
+ arr = gst_property_probe_probe_and_get_values_name (probe, "device");
+
+ for (i = 0; arr != NULL && i < arr->n_values; ++i) {
+ GValue *val;
+ gchar *dev_name = NULL;
+
+ g_print ("\n");
+ /* we assume the element supports getting the device-name in NULL state */
+ val = g_value_array_get_nth (arr, i);
+ g_object_set (element, "device", g_value_get_string (val), NULL);
+ g_object_get (element, "device-name", &dev_name, NULL);
+ g_print ("%-10s device[%d] = %s (%s)\n", GST_OBJECT_NAME (element),
+ i, g_value_get_string (val), dev_name);
+ if (strstr (dev_name, "/usb")) {
+ g_print ("\n\nWARNING: going to probe USB audio device. OSS4 USB support"
+ " is still\npretty shaky, so bad things may happen (e.g. kernel "
+ "lockup).\nPress Control-C NOW if you don't want to continue. "
+ "(waiting 5secs)\n\n");
+ g_usleep (5 * G_USEC_PER_SEC);
+ }
+ g_free (dev_name);
+
+ probe_details (element);
+ }
+
+ if (arr) {
+ g_value_array_free (arr);
+ }
+
+ gst_object_unref (element);
+}
+
+int
+main (int argc, char **argv)
+{
+ GOptionEntry options[] = {
+ {"show-mixer-messages", 'm', 0, G_OPTION_ARG_NONE, &opt_show_mixer_messages,
+ "For mixer elements, wait 60 seconds and show any mixer messages "
+ "(for debugging auto-notifications)", NULL},
+ {NULL,}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+ g_option_context_free (ctx);
+
+ probe_element ("oss4sink");
+ probe_element ("oss4src");
+ probe_element ("oss4mixer");
+
+ return 0;
+}