From 7775f1562ca348f0c1a21388053172368055c5f1 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 23 Apr 2019 16:04:57 +0300 Subject: tests/kms_chamelium: test audio channels are not mixed up Send a different signal to each channel and make sure captured audio channels are not swapped or mixed up. The Chamelium device has a bug and already swaps the left and right channels. For this reason, clients need to retrieve the Chamelium channel mapping and accomodate for this. See https://crbug.com/950922 for a discussion about this. Signed-off-by: Simon Ser Reviewed-by: Martin Peres --- lib/igt_chamelium.c | 34 ++++++++++++++++++++++++++++++++++ lib/igt_chamelium.h | 3 +++ 2 files changed, 37 insertions(+) (limited to 'lib') diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c index 7c9030d1..6ac7b722 100644 --- a/lib/igt_chamelium.c +++ b/lib/igt_chamelium.c @@ -930,6 +930,40 @@ int chamelium_get_captured_frame_count(struct chamelium *chamelium) return ret; } +/** + * chamelium_get_audio_channel_mapping: + * @chamelium: the Chamelium instance + * @port: the audio port + * @mapping: will be filled with the channel mapping + * + * Obtains the channel mapping for an audio port. + * + * Audio channels are not guaranteed not to be swapped. Users can use the + * channel mapping to match an input channel to a capture channel. + * + * The mapping contains one element per capture channel. Each element indicates + * which input channel the capture channel is mapped to. As a special case, -1 + * means that the channel isn't mapped. + */ +void chamelium_get_audio_channel_mapping(struct chamelium *chamelium, + struct chamelium_port *port, + int mapping[static 8]) +{ + xmlrpc_value *res, *res_channel; + int res_len, i; + + res = chamelium_rpc(chamelium, port, "GetAudioChannelMapping", "(i)", + port->id); + res_len = xmlrpc_array_size(&chamelium->env, res); + igt_assert(res_len == 8); + for (i = 0; i < res_len; i++) { + xmlrpc_array_read_item(&chamelium->env, res, i, &res_channel); + xmlrpc_read_int(&chamelium->env, res_channel, &mapping[i]); + xmlrpc_DECREF(res_channel); + } + xmlrpc_DECREF(res); +} + /** * chamelium_start_capturing_audio: * @chamelium: the Chamelium instance diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h index 047f8c5d..728d16ea 100644 --- a/lib/igt_chamelium.h +++ b/lib/igt_chamelium.h @@ -106,6 +106,9 @@ void chamelium_start_capture(struct chamelium *chamelium, void chamelium_stop_capture(struct chamelium *chamelium, int frame_count); void chamelium_capture(struct chamelium *chamelium, struct chamelium_port *port, int x, int y, int w, int h, int frame_count); +void chamelium_get_audio_channel_mapping(struct chamelium *chamelium, + struct chamelium_port *port, + int mapping[static 8]); void chamelium_start_capturing_audio(struct chamelium *chamelium, struct chamelium_port *port, bool save_to_file); struct chamelium_audio_file *chamelium_stop_capturing_audio(struct chamelium *chamelium, -- cgit v1.2.3