Home | History | Annotate | Download | only in audio_LoopbackLatency
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 
      7 from autotest_lib.client.bin import test
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.cros.audio import audio_helper
     10 from autotest_lib.client.cros.audio import cras_utils
     11 
     12 _DEFAULT_VOLUME_LEVEL = 100
     13 _DEFAULT_CAPTURE_GAIN = 2500
     14 
     15 _LATENCY_DIFF_LIMIT_US = 3000
     16 _NOISE_THRESHOLD = 1600
     17 
     18 class audio_LoopbackLatency(test.test):
     19     """Verifies if the measured latency is as accurate as reported"""
     20     version = 1
     21 
     22     def initialize(self,
     23                    default_volume_level=_DEFAULT_VOLUME_LEVEL,
     24                    default_capture_gain=_DEFAULT_CAPTURE_GAIN):
     25         """Setup the deps for the test.
     26 
     27         Args:
     28             default_volume_level: The default volume level.
     29             defalut_capture_gain: The default capture gain.
     30 
     31         Raises: error.TestError if the deps can't be run
     32         """
     33         self._volume_level = default_volume_level
     34         self._capture_gain = default_capture_gain
     35 
     36         super(audio_LoopbackLatency, self).initialize()
     37 
     38     def run_once(self):
     39         """Entry point of this test"""
     40         audio_helper.set_volume_levels(self._volume_level, self._capture_gain)
     41         success = False
     42 
     43         # Run loopback latency check once, which takes at most 1 sec to
     44         # complete and parse the latency values measured in loopback path
     45         # and reported by system.  Assert the difference is within
     46         # acceptable range.
     47         result = audio_helper.loopback_latency_check(n=_NOISE_THRESHOLD)
     48         if result:
     49             diff = abs(result[0] - result[1])
     50             logging.info('Tested latency with threshold %d.\nMeasured %d,'
     51                          'reported %d uS, diff %d us\n', _NOISE_THRESHOLD,
     52                          result[0], result[1], diff)
     53 
     54             perf_value_description = 'loopback_latency'
     55             if cras_utils.get_selected_output_device_type() == 'USB':
     56                 perf_value_description += '_usb'
     57 
     58             self.output_perf_value(
     59                 description=perf_value_description, value=result[0],
     60                 units='uS', higher_is_better=False)
     61 
     62             # Difference between measured and reported latency should
     63             # within _LATENCY_DIFF_LIMIT_US.
     64             if diff < _LATENCY_DIFF_LIMIT_US:
     65                 success = True
     66         else:
     67             # Raise error if audio is not detected at all in the loopback path.
     68             raise error.TestError('Audio not detected at threshold %d' %
     69                                   _NOISE_THRESHOLD)
     70 
     71         if not success:
     72             # Test fails when latency difference is greater then the limit.
     73             raise error.TestFail('Latency difference too much, diff limit '
     74                                  '%d us, measured %d us, reported %d us' %
     75                                  (_LATENCY_DIFF_LIMIT_US, result[0], result[1]))
     76