blob: 4702d401cea6bd007f701facb1273c54bc1405b8 [file] [log] [blame]
# 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]))