# Copyright (c) 2011 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import os from autotest_lib.client.bin import utils from autotest_lib.client.common_lib import error from autotest_lib.client.cros.audio import audio_helper from autotest_lib.client.cros.audio import audio_test_data from autotest_lib.client.cros.audio import cmd_utils from autotest_lib.client.cros.audio import cras_utils TEST_DURATION = 1 class audio_CrasLoopback(audio_helper.cras_rms_test): """Verifies audio playback and capture function.""" version = 1 @staticmethod def wait_for_active_stream_count(expected_count): utils.poll_for_condition( lambda: cras_utils.get_active_stream_count() == expected_count, exception=error.TestError( 'Timeout waiting active stream count to become %d' % expected_count)) def run_once(self): """Entry point of this test.""" # Generate sine raw file that lasts 5 seconds. raw_path = os.path.join(self.bindir, '5SEC.raw') data_format = dict(file_type='raw', sample_format='S16_LE', channel=2, rate=48000) raw_file = audio_test_data.GenerateAudioTestData( path=raw_path, data_format=data_format, duration_secs=5, frequencies=[440, 440], volume_scale=0.9) recorded_file = os.path.join(self.resultsdir, 'cras_recorded.raw') self.wait_for_active_stream_count(0) p = cmd_utils.popen(cras_utils.playback_cmd(raw_file.path)) try: self.wait_for_active_stream_count(1) cras_utils.capture(recorded_file, duration=TEST_DURATION) # Make sure the audio is still playing. if p.poll() != None: raise error.TestError('playback stopped') finally: cmd_utils.kill_or_log_returncode(p) raw_file.delete() rms_value = audio_helper.get_rms(recorded_file)[0] self.write_perf_keyval({'rms_value': rms_value})