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