| /* GStreamer |
| * |
| * unit test for wavenc |
| * |
| * Copyright (C) <2010> Stefan Kost <ensonic@users.sf.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., 51 Franklin St, Fifth Floor, |
| * Boston, MA 02110-1301, USA. |
| */ |
| |
| /* FIXME 0.11: suppress warnings for deprecated API such as GValueArray |
| * with newer GLib versions (>= 2.31.0) */ |
| #define GLIB_DISABLE_DEPRECATION_WARNINGS |
| |
| #include <gst/check/gstcheck.h> |
| #include <gst/audio/audio.h> |
| #include <gst/audio/audio-enumtypes.h> |
| |
| static gboolean |
| bus_handler (GstBus * bus, GstMessage * message, gpointer data) |
| { |
| GMainLoop *loop = (GMainLoop *) data; |
| |
| switch (message->type) { |
| case GST_MESSAGE_EOS: |
| g_main_loop_quit (loop); |
| break; |
| case GST_MESSAGE_WARNING: |
| case GST_MESSAGE_ERROR:{ |
| GError *gerror; |
| gchar *debug; |
| |
| gst_message_parse_error (message, &gerror, &debug); |
| gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); |
| gst_message_unref (message); |
| g_error_free (gerror); |
| g_free (debug); |
| g_main_loop_quit (loop); |
| break; |
| } |
| default: |
| break; |
| } |
| |
| return TRUE; |
| } |
| |
| /* |
| * gst-launch-1.0 \ |
| * audiotestsrc freq=440 num-buffers=100 ! interleave name=i ! audioconvert ! wavenc ! filesink location=/tmp/mc.wav \ |
| * audiotestsrc freq=880 num-buffers=100 ! i. |
| * ... |
| * |
| * http://www.microsoft.com/whdc/device/audio/multichaud.mspx |
| */ |
| |
| static void |
| make_n_channel_wav (const gint channels, const GValueArray * arr) |
| { |
| GstElement *pipeline; |
| GstElement **audiotestsrc, *interleave, *wavenc, *conv, *fakesink; |
| GstBus *bus; |
| GMainLoop *loop; |
| guint i; |
| guint bus_watch = 0; |
| |
| audiotestsrc = g_new0 (GstElement *, channels); |
| |
| pipeline = gst_pipeline_new ("pipeline"); |
| fail_unless (pipeline != NULL); |
| |
| interleave = gst_element_factory_make ("interleave", NULL); |
| fail_unless (interleave != NULL); |
| g_object_set (interleave, "channel-positions", arr, NULL); |
| gst_bin_add (GST_BIN (pipeline), interleave); |
| |
| if (G_BYTE_ORDER == G_BIG_ENDIAN) { |
| /* we're not here to test orc; audioconvert misbehaves on ppc32 */ |
| g_setenv ("ORC_CODE", "backup", 1); |
| conv = gst_element_factory_make ("audioconvert", NULL); |
| } else { |
| conv = gst_element_factory_make ("identity", NULL); |
| } |
| fail_unless (conv != NULL); |
| gst_bin_add (GST_BIN (pipeline), conv); |
| fail_unless (gst_element_link (interleave, conv)); |
| |
| wavenc = gst_element_factory_make ("wavenc", NULL); |
| fail_unless (wavenc != NULL); |
| gst_bin_add (GST_BIN (pipeline), wavenc); |
| fail_unless (gst_element_link (conv, wavenc)); |
| |
| fakesink = gst_element_factory_make ("fakesink", NULL); |
| fail_unless (fakesink != NULL); |
| gst_bin_add (GST_BIN (pipeline), fakesink); |
| fail_unless (gst_element_link (wavenc, fakesink)); |
| |
| for (i = 0; i < channels; i++) { |
| audiotestsrc[i] = gst_element_factory_make ("audiotestsrc", NULL); |
| fail_unless (audiotestsrc[i] != NULL); |
| g_object_set (G_OBJECT (audiotestsrc[i]), "wave", 0, "freq", |
| 440.0 * (i + 1), "num-buffers", 100, NULL); |
| gst_bin_add (GST_BIN (pipeline), audiotestsrc[i]); |
| fail_unless (gst_element_link (audiotestsrc[i], interleave)); |
| } |
| |
| loop = g_main_loop_new (NULL, TRUE); |
| fail_unless (loop != NULL); |
| |
| bus = gst_element_get_bus (pipeline); |
| fail_unless (bus != NULL); |
| bus_watch = gst_bus_add_watch (bus, bus_handler, loop); |
| gst_object_unref (bus); |
| |
| gst_element_set_state (pipeline, GST_STATE_PLAYING); |
| g_main_loop_run (loop); |
| gst_element_set_state (pipeline, GST_STATE_NULL); |
| |
| gst_object_unref (pipeline); |
| g_free (audiotestsrc); |
| |
| g_main_loop_unref (loop); |
| g_source_remove (bus_watch); |
| } |
| |
| GST_START_TEST (test_encode_stereo) |
| { |
| GValueArray *arr; |
| GValue val = { 0, }; |
| |
| arr = g_value_array_new (2); |
| g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); |
| g_value_array_append (arr, &val); |
| g_value_unset (&val); |
| |
| make_n_channel_wav (2, arr); |
| g_value_array_free (arr); |
| } |
| |
| GST_END_TEST; |
| |
| #if 0 |
| GST_START_TEST (test_encode_multichannel) |
| { |
| GValueArray *arr; |
| GValue val = { 0, }; |
| |
| arr = g_value_array_new (6); |
| g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_LFE); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT); |
| g_value_array_append (arr, &val); |
| g_value_reset (&val); |
| g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT); |
| g_value_array_append (arr, &val); |
| g_value_unset (&val); |
| |
| make_n_channel_wav (6); |
| } |
| |
| GST_END_TEST; |
| #endif |
| |
| static Suite * |
| wavenc_suite (void) |
| { |
| Suite *s = suite_create ("wavenc"); |
| TCase *tc_chain = tcase_create ("general"); |
| |
| suite_add_tcase (s, tc_chain); |
| tcase_add_test (tc_chain, test_encode_stereo); |
| /* FIXME: improve wavenc |
| tcase_add_test (tc_chain, test_encode_multichannel); |
| */ |
| |
| return s; |
| } |
| |
| GST_CHECK_MAIN (wavenc); |