1# Copyright (c) 2011 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging, os, time
6
7from autotest_lib.client.common_lib import error
8from autotest_lib.client.cros.audio import audio_helper
9from autotest_lib.client.cros.audio import audio_test_data
10from autotest_lib.client.cros.audio import alsa_utils
11from autotest_lib.client.cros.audio import cmd_utils
12from autotest_lib.client.cros.audio import cras_utils
13
14
15TEST_DURATION = 1
16
17class audio_AlsaLoopback(audio_helper.alsa_rms_test):
18    """Verifies audio playback and capture function."""
19    version = 1
20
21    def run_once(self):
22        """Entry point of this test."""
23
24        # Sine wav file lasts 5 seconds
25        wav_path = os.path.join(self.bindir, '5SEC.wav')
26        data_format = dict(file_type='wav', sample_format='S16_LE',
27                channel=2, rate=48000)
28        wav_file = audio_test_data.GenerateAudioTestData(
29            path=wav_path,
30            data_format=data_format,
31            duration_secs=5,
32            frequencies=[440, 440],
33            volume_scale=0.9)
34
35        recorded_file = os.path.join(self.resultsdir, 'hw_recorded.wav')
36
37        # Get selected input and output devices.
38        cras_input = cras_utils.get_selected_input_device_name()
39        cras_output = cras_utils.get_selected_output_device_name()
40        logging.debug("Selected input=%s, output=%s", cras_input, cras_output)
41        if cras_input is None:
42            raise error.TestFail("Fail to get selected input device.")
43        if cras_output is None:
44            raise error.TestFail("Fail to get selected output device.")
45        alsa_input = alsa_utils.convert_device_name(cras_input)
46        alsa_output = alsa_utils.convert_device_name(cras_output)
47
48        (output_type, input_type) = cras_utils.get_selected_node_types()
49        if 'MIC' not in input_type:
50            raise error.TestFail("Wrong input type=%s", input_type)
51        if 'HEADPHONE' not in output_type:
52            raise error.TestFail("Wrong output type=%s", output_type)
53
54        p = cmd_utils.popen(alsa_utils.playback_cmd(wav_file.path, device=alsa_output))
55        try:
56            # Wait one second to make sure the playback has been started.
57            time.sleep(1)
58            alsa_utils.record(recorded_file, duration=TEST_DURATION,
59                              device=alsa_input)
60
61            # Make sure the audio is still playing.
62            if p.poll() != None:
63                raise error.TestError('playback stopped')
64        finally:
65            cmd_utils.kill_or_log_returncode(p)
66            wav_file.delete()
67
68        rms_value = audio_helper.get_rms(recorded_file)[0]
69
70        self.write_perf_keyval({'rms_value': rms_value})
71
72