| # 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])) |