This introduces a new test for audio going through display connectors.
It currently contains a single subtest for HDMI signal integrity, but
other test cases will be added later on.

The test setup consists in using an HDMI-VGA bridge that separates the
audio out (via a 3.5 mm jack) and feeding this back to the DUT's line-in
where it can be recorded by ALSA with controls correctly configured.

The audio test makes use of the audio and ALSA igt libraries helpers.

Signed-off-by: Paul Kocialkowski <paul.kocialkow...@linux.intel.com>
---
 README            |   6 ++
 configure.ac      |  18 ++++++
 tests/Makefile.am |  12 ++++
 tests/audio.c     | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 210 insertions(+)
 create mode 100644 tests/audio.c

diff --git a/README b/README
index d1ea9529..c3ddf768 100644
--- a/README
+++ b/README
@@ -153,6 +153,12 @@ The following dependencies are required for building 
chamelium support
        libglib2.0-dev
        libgsl-dev
 
+The following dependencies are requires for building audio support
+(package names may vary):
+
+       libasound2-dev
+       libgsl-dev
+
 Releases for maintainers
 ------------------------
 
diff --git a/configure.ac b/configure.ac
index e66273a4..41ec4d26 100644
--- a/configure.ac
+++ b/configure.ac
@@ -222,6 +222,23 @@ fi
 PKG_CHECK_MODULES(ALSA, [alsa], [alsa=yes], [alsa=no])
 AM_CONDITIONAL(HAVE_ALSA, [test "x$alsa" = xyes])
 
+# for audio
+AC_ARG_ENABLE(audio, AS_HELP_STRING([--enable-audio],
+             [Enable building of audio tests (default: no)]),
+             [if test x$enableval = xyes; then enable_audio=yes; fi],
+             [enable_audio=no])
+AM_CONDITIONAL(HAVE_AUDIO, [test "x$enable_audio" = xyes])
+if test "x$enable_audio" = xyes; then
+       if test x"$alsa" != xyes; then
+               AC_MSG_ERROR([Failed to find ALSA, required by audio.])
+       fi
+       if test x"$gsl" != xyes; then
+               AC_MSG_ERROR([Failed to find gsl, required by audio.])
+       fi
+
+       AC_DEFINE(HAVE_AUDIO, 1, [Enable Audio support])
+fi
+
 # -----------------------------------------------------------------------------
 #                      Configuration options
 # -----------------------------------------------------------------------------
@@ -420,6 +437,7 @@ echo ""
 echo " • Tests:"
 echo "       Build tests        : ${BUILD_TESTS}"
 echo "       Chamelium tests    : ${enable_chamelium}"
+echo "       Audio tests        : ${enable_audio}"
 echo "       Compile prime tests: ${NOUVEAU}"
 echo "       Print stack traces : ${with_libunwind}"
 echo "       Debug flags        : ${DEBUG_CFLAGS}"
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f9d11e6c..471f3818 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -20,6 +20,15 @@ TESTS_progs += \
        $(NULL)
 endif
 
+if HAVE_ALSA
+if HAVE_GSL
+TESTS_progs += \
+       audio \
+       $(NULL)
+endif
+endif
+
+
 if BUILD_TESTS
 test-list.txt: Makefile.sources
        @echo TESTLIST > $@
@@ -134,6 +143,9 @@ vc4_wait_seqno_LDADD = $(LDADD) $(DRM_VC4_LIBS)
 chamelium_CFLAGS = $(AM_CFLAGS) $(XMLRPC_CFLAGS) $(LIBUDEV_CFLAGS)
 chamelium_LDADD = $(LDADD) $(XMLRPC_LIBS) $(LIBUDEV_LIBS)
 
+audio_CFLAGS = $(AM_CFLAGS) $(ALSA_CFLAGS)
+audio_LDADD = $(LDADD) $(ALSA_LIBS)
+
 amdgpu_amd_basic_CFLAGS = $(AM_CFLAGS) $(DRM_AMDGPU_CFLAGS)
 amdgpu_amd_basic_LDADD = $(LDADD) $(DRM_AMDGPU_LIBS)
 amdgpu_amd_cs_nop_CFLAGS = $(AM_CFLAGS) $(DRM_AMDGPU_CFLAGS)
diff --git a/tests/audio.c b/tests/audio.c
new file mode 100644
index 00000000..7fb91c97
--- /dev/null
+++ b/tests/audio.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright © 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *  Paul Kocialkowski <paul.kocialkow...@linux.intel.com>
+ */
+
+#include "config.h"
+#include "igt.h"
+
+#define PLAYBACK_CHANNELS      2
+#define PLAYBACK_FRAMES                1024
+
+#define CAPTURE_SAMPLE_RATE    48000
+#define CAPTURE_CHANNELS       2
+#define CAPTURE_DEVICE_NAME    "default"
+#define CAPTURE_FRAMES         2048
+
+#define RUN_TIMEOUT            2000
+
+struct test_data {
+       struct alsa *alsa;
+       struct audio_signal *signal;
+
+       int streak;
+};
+
+static int sampling_rates[] = {
+       32000,
+       44100,
+       48000,
+       88200,
+       96000,
+       176400,
+       192000,
+};
+
+static int sampling_rates_count = sizeof(sampling_rates) / sizeof(int);
+
+static int test_frequencies[] = {
+       300,
+       600,
+       1200,
+       80000,
+       10000,
+};
+
+static int test_frequencies_count = sizeof(test_frequencies) / sizeof(int);
+
+static int output_callback(void *data, short *buffer, int frames)
+{
+       struct test_data *test_data = (struct test_data *) data;
+
+       audio_signal_fill(test_data->signal, buffer, frames);
+
+       return 0;
+}
+
+static int input_callback(void *data, short *buffer, int frames)
+{
+       struct test_data *test_data = (struct test_data *) data;
+       bool detect;
+
+       detect = audio_signal_detect(test_data->signal, CAPTURE_CHANNELS,
+                                    CAPTURE_SAMPLE_RATE, buffer, frames);
+       if (detect)
+               test_data->streak++;
+       else
+               test_data->streak = 0;
+
+       /* A streak of 3 gives confidence that the signal is good. */
+       if (test_data->streak == 3)
+               return 1;
+
+       return 0;
+}
+
+static void test_integrity(const char *device_name)
+{
+       struct test_data data;
+       int sampling_rate;
+       bool run = false;
+       bool test;
+       int i, j;
+       int ret;
+
+       data.alsa = alsa_init();
+       igt_assert(data.alsa);
+
+       ret = alsa_open_input(data.alsa, CAPTURE_DEVICE_NAME);
+       igt_assert(ret >= 0);
+
+       alsa_configure_input(data.alsa, CAPTURE_CHANNELS,
+                            CAPTURE_SAMPLE_RATE);
+
+       alsa_register_input_callback(data.alsa, input_callback, &data,
+                                    CAPTURE_FRAMES);
+
+       for (i = 0; i < sampling_rates_count; i++) {
+               ret = alsa_open_output(data.alsa, device_name);
+               igt_assert(ret >= 0);
+
+               sampling_rate = sampling_rates[i];
+
+               test = alsa_test_output_configuration(data.alsa,
+                                                     PLAYBACK_CHANNELS,
+                                                     sampling_rate);
+               if (!test) {
+                       alsa_close_output(data.alsa);
+                       continue;
+               }
+
+               igt_debug("Testing with sampling rate %d\n", sampling_rate);
+
+               alsa_configure_output(data.alsa, PLAYBACK_CHANNELS,
+                                      sampling_rate);
+
+               data.signal = audio_signal_init(PLAYBACK_CHANNELS,
+                                               sampling_rate);
+               igt_assert(data.signal);
+
+               for (j = 0; j < test_frequencies_count; j++)
+                       audio_signal_add_frequency(data.signal,
+                                                  test_frequencies[j]);
+
+               audio_signal_synthesize(data.signal);
+
+               alsa_register_output_callback(data.alsa, output_callback,
+                                             &data, PLAYBACK_FRAMES);
+
+               data.streak = 0;
+
+               ret = alsa_run(data.alsa, RUN_TIMEOUT);
+               igt_assert(ret > 0);
+
+               audio_signal_clean(data.signal);
+               free(data.signal);
+
+               alsa_close_output(data.alsa);
+
+               run = true;
+       }
+
+       /* Make sure we tested at least one frequency */
+       igt_assert(run);
+
+       alsa_close_input(data.alsa);
+       free(data.alsa);
+}
+
+igt_main
+{
+       igt_subtest("hdmi-integrity")
+               test_integrity("HDMI");
+}
-- 
2.14.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to