[Intel-gfx] [PATCH i-g-t v2 3/3] tests: Introduce audio tests, starting with HDMI signal integrity

Paul Kocialkowski paul.kocialkowski at linux.intel.com
Mon Aug 21 15:27:20 UTC 2017


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.kocialkowski at 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.kocialkowski at 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



More information about the Intel-gfx mailing list