# Copyright (c) 2012 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 logging from autotest_lib.client.bin import test from autotest_lib.client.common_lib import error from autotest_lib.client.cros.audio import audio_helper from autotest_lib.client.cros.audio import cras_utils _DEFAULT_VOLUME_LEVEL = 100 _DEFAULT_CAPTURE_GAIN = 2500 _LATENCY_DIFF_LIMIT_US = 3000 _NOISE_THRESHOLD = 1600 class audio_LoopbackLatency(test.test): """Verifies if the measured latency is as accurate as reported""" version = 1 def initialize(self, default_volume_level=_DEFAULT_VOLUME_LEVEL, default_capture_gain=_DEFAULT_CAPTURE_GAIN): """Setup the deps for the test. Args: default_volume_level: The default volume level. defalut_capture_gain: The default capture gain. Raises: error.TestError if the deps can't be run """ self._volume_level = default_volume_level self._capture_gain = default_capture_gain super(audio_LoopbackLatency, self).initialize() def run_once(self): """Entry point of this test""" audio_helper.set_volume_levels(self._volume_level, self._capture_gain) success = False # Run loopback latency check once, which takes at most 1 sec to # complete and parse the latency values measured in loopback path # and reported by system. Assert the difference is within # acceptable range. result = audio_helper.loopback_latency_check(n=_NOISE_THRESHOLD) if result: diff = abs(result[0] - result[1]) logging.info('Tested latency with threshold %d.\nMeasured %d,' 'reported %d uS, diff %d us\n', _NOISE_THRESHOLD, result[0], result[1], diff) perf_value_description = 'loopback_latency' if cras_utils.get_selected_output_device_type() == 'USB': perf_value_description += '_usb' self.output_perf_value( description=perf_value_description, value=result[0], units='uS', higher_is_better=False) # Difference between measured and reported latency should # within _LATENCY_DIFF_LIMIT_US. if diff < _LATENCY_DIFF_LIMIT_US: success = True else: # Raise error if audio is not detected at all in the loopback path. raise error.TestError('Audio not detected at threshold %d' % _NOISE_THRESHOLD) if not success: # Test fails when latency difference is greater then the limit. raise error.TestFail('Latency difference too much, diff limit ' '%d us, measured %d us, reported %d us' % (_LATENCY_DIFF_LIMIT_US, result[0], result[1]))