gst_plugins_base/tests/check/elements/audiotestsrc.c
changeset 0 0e761a78d257
equal deleted inserted replaced
-1:000000000000 0:0e761a78d257
       
     1 /* GStreamer
       
     2  *
       
     3  * unit test for audiotestsrc
       
     4  *
       
     5  * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
       
     6  *
       
     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.
       
    11  *
       
    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.
       
    16  *
       
    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.
       
    21  */
       
    22 
       
    23 #include <unistd.h>
       
    24 
       
    25 #include <gst/check/gstcheck.h>
       
    26 
       
    27 /* For ease of programming we use globals to keep refs for our floating
       
    28  * src and sink pads we create; otherwise we always have to do get_pad,
       
    29  * get_peer, and then remove references in every test function */
       
    30 static GstPad *mysinkpad;
       
    31 
       
    32 
       
    33 #define CAPS_TEMPLATE_STRING            \
       
    34     "audio/x-raw-int, "                 \
       
    35     "channels = (int) 1, "              \
       
    36     "rate = (int) [ 1,  MAX ], "        \
       
    37     "endianness = (int) BYTE_ORDER, "   \
       
    38     "width = (int) 16, "                \
       
    39     "depth = (int) 16, "                \
       
    40     "signed = (bool) TRUE"
       
    41 
       
    42 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
       
    43     GST_PAD_SINK,
       
    44     GST_PAD_ALWAYS,
       
    45     GST_STATIC_CAPS (CAPS_TEMPLATE_STRING)
       
    46     );
       
    47 
       
    48 static GstElement *
       
    49 setup_audiotestsrc (void)
       
    50 {
       
    51   GstElement *audiotestsrc;
       
    52 
       
    53   GST_DEBUG ("setup_audiotestsrc");
       
    54   audiotestsrc = gst_check_setup_element ("audiotestsrc");
       
    55   mysinkpad = gst_check_setup_sink_pad (audiotestsrc, &sinktemplate, NULL);
       
    56   gst_pad_set_active (mysinkpad, TRUE);
       
    57 
       
    58   return audiotestsrc;
       
    59 }
       
    60 
       
    61 static void
       
    62 cleanup_audiotestsrc (GstElement * audiotestsrc)
       
    63 {
       
    64   GST_DEBUG ("cleanup_audiotestsrc");
       
    65 
       
    66   g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
       
    67   g_list_free (buffers);
       
    68   buffers = NULL;
       
    69 
       
    70   gst_pad_set_active (mysinkpad, FALSE);
       
    71   gst_check_teardown_sink_pad (audiotestsrc);
       
    72   gst_check_teardown_element (audiotestsrc);
       
    73 }
       
    74 
       
    75 GST_START_TEST (test_all_waves)
       
    76 {
       
    77   GstElement *audiotestsrc;
       
    78   GObjectClass *oclass;
       
    79   GParamSpec *property;
       
    80   GEnumValue *values;
       
    81   guint j = 0;
       
    82 
       
    83   audiotestsrc = setup_audiotestsrc ();
       
    84   oclass = G_OBJECT_GET_CLASS (audiotestsrc);
       
    85   property = g_object_class_find_property (oclass, "wave");
       
    86   fail_unless (G_IS_PARAM_SPEC_ENUM (property));
       
    87   values = G_ENUM_CLASS (g_type_class_ref (property->value_type))->values;
       
    88 
       
    89 
       
    90   while (values[j].value_name) {
       
    91     GST_DEBUG_OBJECT (audiotestsrc, "testing wave %s", values[j].value_name);
       
    92 
       
    93     fail_unless (gst_element_set_state (audiotestsrc,
       
    94             GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
       
    95         "could not set to playing");
       
    96 
       
    97     g_mutex_lock (check_mutex);
       
    98     while (g_list_length (buffers) < 10)
       
    99       g_cond_wait (check_cond, check_mutex);
       
   100     g_mutex_unlock (check_mutex);
       
   101 
       
   102     gst_element_set_state (audiotestsrc, GST_STATE_READY);
       
   103 
       
   104     g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
       
   105     g_list_free (buffers);
       
   106     buffers = NULL;
       
   107     ++j;
       
   108   }
       
   109 
       
   110   /* cleanup */
       
   111   cleanup_audiotestsrc (audiotestsrc);
       
   112 }
       
   113 
       
   114 GST_END_TEST;
       
   115 
       
   116 static Suite *
       
   117 audiotestsrc_suite (void)
       
   118 {
       
   119   Suite *s = suite_create ("audiotestsrc");
       
   120   TCase *tc_chain = tcase_create ("general");
       
   121 
       
   122   suite_add_tcase (s, tc_chain);
       
   123   tcase_add_test (tc_chain, test_all_waves);
       
   124 
       
   125   return s;
       
   126 }
       
   127 
       
   128 int
       
   129 main (int argc, char **argv)
       
   130 {
       
   131   int nf;
       
   132 
       
   133   Suite *s = audiotestsrc_suite ();
       
   134   SRunner *sr = srunner_create (s);
       
   135 
       
   136   gst_check_init (&argc, &argv);
       
   137 
       
   138   srunner_run_all (sr, CK_NORMAL);
       
   139   nf = srunner_ntests_failed (sr);
       
   140   srunner_free (sr);
       
   141 
       
   142   return nf;
       
   143 }