Home | History | Annotate | Download | only in devices
      1 page.title=Audio Latency
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2013 The Android Open Source Project
      6 
      7     Licensed under the Apache License, Version 2.0 (the "License");
      8     you may not use this file except in compliance with the License.
      9     You may obtain a copy of the License at
     10 
     11         http://www.apache.org/licenses/LICENSE-2.0
     12 
     13     Unless required by applicable law or agreed to in writing, software
     14     distributed under the License is distributed on an "AS IS" BASIS,
     15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16     See the License for the specific language governing permissions and
     17     limitations under the License.
     18 -->
     19 <div id="qv-wrapper">
     20   <div id="qv">
     21     <h2>In this document</h2>
     22     <ol id="auto-toc">
     23     </ol>
     24   </div>
     25 </div>
     26 
     27 <p>
     28   This page describes common methods for measuring input and output latency.
     29 </p>
     30 
     31 
     32 
     33 <h2 id="measuringOutput">Measuring Output Latency</h2>
     34 
     35 <p>
     36   There are several techniques available to measure output latency,
     37   with varying degrees of accuracy and ease of running, described below. Also
     38 see the <a href="testing_circuit.html">Testing circuit</a> for an example test environment.
     39 </p>
     40 
     41 <h3>LED and oscilloscope test</h3>
     42 <p>
     43 This test measures latency in relation to the device's LED indicator.
     44 If your production device does not have an LED, you can install the
     45   LED on a prototype form factor device. For even better accuracy
     46   on prototype devices with exposed circuity, connect one
     47   oscilloscope probe to the LED directly to bypass the light
     48   sensor latency.
     49   </p>
     50 
     51 <p>
     52   If you cannot install an LED on either your production or prototype device,
     53   try the following workarounds:
     54 </p>
     55 
     56 <ul>
     57   <li>Use a General Purpose Input/Output (GPIO) pin for the same purpose.</li>
     58   <li>Use JTAG or another debugging port.</li>
     59   <li>Use the screen backlight. This might be risky as the
     60   backlight may have a non-neglible latency, and can contribute to
     61   an inaccurate latency reading.
     62   </li>
     63 </ul>
     64 
     65 <p>To conduct this test:</p>
     66 
     67 <ol>
     68   <li>Run an app that periodically pulses the LED at
     69   the same time it outputs audio. 
     70 
     71   <p class="note"><b>Note:</b> To get useful results, it is crucial to use the correct
     72   APIs in the test app so that you're exercising the fast audio output path.
     73   See <a href="latency_design.html">Design For Reduced Latency</a> for
     74   background.
     75   </p>
     76   </li>
     77   <li>Place a light sensor next to the LED.</li>
     78   <li>Connect the probes of a dual-channel oscilloscope to both the wired headphone
     79   jack (line output) and light sensor.</li>
     80   <li>Use the oscilloscope to measure
     81   the time difference between observing the line output signal versus the light
     82   sensor signal.</li>
     83 </ol>
     84 
     85   <p>The difference in time is the approximate audio output latency,
     86   assuming that the LED latency and light sensor latency are both zero.
     87   Typically, the LED and light sensor each have a relatively low latency
     88   on the order of one millisecond or less, which is sufficiently low enough
     89   to ignore.</p>
     90 
     91 <h3>Larsen test</h3>
     92 <p>
     93   One of the easiest latency tests is an audio feedback
     94   (Larsen effect) test. This provides a crude measure of combined output
     95   and input latency by timing an impulse response loop. This test is not very useful
     96   by itself because of the nature of the test, but it can be useful for calibrating 
     97   other tests</p>
     98 
     99 <p>To conduct this test:</p>
    100 <ol>
    101   <li>Run an app that captures audio from the microphone and immediately plays the
    102   captured data back over the speaker.</li>
    103   <li>Create a sound externally,
    104   such as tapping a pencil by the microphone. This noise generates a feedback loop.</li>
    105   <li>Measure the time between feedback pulses to get the sum of the output latency, input latency, and application overhead.</li>
    106 </ol>
    107 
    108   <p>This method does not break down the
    109   component times, which is important when the output latency
    110   and input latency are independent. So this method is not recommended for measuring output latency, but might be useful
    111   to help measure output latency.</p>
    112 
    113 <h2 id="measuringInput">Measuring Input Latency</h2>
    114 
    115 <p>
    116   Input latency is more difficult to measure than output latency. The following
    117   tests might help.
    118 </p>
    119 
    120 <p>
    121 One approach is to first determine the output latency
    122   using the LED and oscilloscope method and then use
    123   the audio feedback (Larsen) test to determine the sum of output
    124   latency and input latency. The difference between these two
    125   measurements is the input latency.
    126 </p>
    127 
    128 <p>
    129   Another technique is to use a GPIO pin on a prototype device.
    130   Externally, pulse a GPIO input at the same time that you present
    131   an audio signal to the device.  Run an app that compares the
    132   difference in arrival times of the GPIO signal and audio data.
    133 </p>
    134 
    135 <h2 id="reducing">Reducing Latency</h2>
    136 
    137 <p>To achieve low audio latency, pay special attention throughout the
    138 system to scheduling, interrupt handling, power management, and device
    139 driver design. Your goal is to prevent any part of the platform from
    140 blocking a <code>SCHED_FIFO</code> audio thread for more than a couple
    141 of milliseconds. By adopting such a systematic approach, you can reduce
    142 audio latency and get the side benefit of more predictable performance
    143 overall.
    144 </p>
    145 
    146 
    147  <p>
    148   Audio underruns, when they do occur, are often detectable only under certain
    149   conditions or only at the transitions. Try stressing the system by launching
    150   new apps and scrolling quickly through various displays. But be aware
    151   that some test conditions are so stressful as to be beyond the design
    152   goals. For example, taking a bugreport puts such enormous load on the
    153   system that it may be acceptable to have an underrun in that case.
    154 </p>
    155 
    156 <p>
    157   When testing for underruns:
    158 </p>
    159   <ul>
    160   <li>Configure any DSP after the app processor so that it adds
    161   minimal latency.</li>
    162   <li>Run tests under different conditions
    163   such as having the screen on or off, USB plugged in or unplugged,
    164   WiFi on or off, Bluetooth on or off, and telephony and data radios
    165   on or off.</li>
    166   <li>Select relatively quiet music that you're very familiar with, and which is easy
    167   to hear underruns in.</li>
    168   <li>Use wired headphones for extra sensitivity.</li>
    169   <li>Give yourself breaks so that you don't experience "ear fatigue."</li>
    170   </ul>
    171 
    172 <p>
    173   Once you find the underlying causes of underruns, reduce
    174   the buffer counts and sizes to take advantage of this.
    175   The eager approach of reducing buffer counts and sizes <i>before</i>
    176   analyzing underruns and fixing the causes of underruns only
    177   results in frustration.
    178 </p>
    179 
    180 <h3 id="tools">Tools</h3>
    181 <p>
    182   <code>systrace</code> is an excellent general-purpose tool
    183   for diagnosing system-level performance glitches.
    184 </p>
    185 
    186 <p>
    187   The output of <code>dumpsys media.audio_flinger</code> also contains a
    188   useful section called "simple moving statistics." This has a summary
    189   of the variability of elapsed times for each audio mix and I/O cycle.
    190   Ideally, all the time measurements should be about equal to the mean or
    191   nominal cycle time. If you see a very low minimum or high maximum, this is an
    192   indication of a problem, likely a high scheduling latency or interrupt
    193   disable time. The <i>tail</i> part of the output is especially helpful,
    194   as it highlights the variability beyond +/- 3 standard deviations.
    195 </p>
    196