147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphypage.title=Audio Latency
247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy@jd:body
347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<!--
5768b82a9dfbdd8504eae2736d283a60a37c7a547Clay Murphy    Copyright 2013 The Android Open Source Project
647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    Licensed under the Apache License, Version 2.0 (the "License");
847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    you may not use this file except in compliance with the License.
947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    You may obtain a copy of the License at
1047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
1147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy        http://www.apache.org/licenses/LICENSE-2.0
1247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
1347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    Unless required by applicable law or agreed to in writing, software
1447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    distributed under the License is distributed on an "AS IS" BASIS,
1547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    See the License for the specific language governing permissions and
1747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    limitations under the License.
1847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy-->
1947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<div id="qv-wrapper">
2047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <div id="qv">
2147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    <h2>In this document</h2>
2247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    <ol id="auto-toc">
2347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy    </ol>
2447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </div>
2547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</div>
2647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
2747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
2847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  This page describes common methods for measuring input and output latency.
2947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
3047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
3147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
3247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
3347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h2 id="measuringOutput">Measuring Output Latency</h2>
3447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
3547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
3647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  There are several techniques available to measure output latency,
3747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  with varying degrees of accuracy and ease of running, described below. Also
3847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphysee the <a href="testing_circuit.html">Testing circuit</a> for an example test environment.
3947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
4047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
4147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h3>LED and oscilloscope test</h3>
4247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
4347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay MurphyThis test measures latency in relation to the device's LED indicator.
4447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay MurphyIf your production device does not have an LED, you can install the
4547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  LED on a prototype form factor device. For even better accuracy
4647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  on prototype devices with exposed circuity, connect one
4747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  oscilloscope probe to the LED directly to bypass the light
4847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  sensor latency.
4947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </p>
5047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
5147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
5247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  If you cannot install an LED on either your production or prototype device,
5347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  try the following workarounds:
5447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
5547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
5647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<ul>
5747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Use a General Purpose Input/Output (GPIO) pin for the same purpose.</li>
5847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Use JTAG or another debugging port.</li>
5947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Use the screen backlight. This might be risky as the
6047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  backlight may have a non-neglible latency, and can contribute to
6147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  an inaccurate latency reading.
6247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </li>
6347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</ul>
6447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
6547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>To conduct this test:</p>
6647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
6747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<ol>
6847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Run an app that periodically pulses the LED at
6947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  the same time it outputs audio. 
7047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
7147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <p class="note"><b>Note:</b> To get useful results, it is crucial to use the correct
7247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  APIs in the test app so that you're exercising the fast audio output path.
7347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  See <a href="latency_design.html">Design For Reduced Latency</a> for
7447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  background.
7547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </p>
7647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </li>
7747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Place a light sensor next to the LED.</li>
7847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Connect the probes of a dual-channel oscilloscope to both the wired headphone
7947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  jack (line output) and light sensor.</li>
8047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Use the oscilloscope to measure
8147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  the time difference between observing the line output signal versus the light
8247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  sensor signal.</li>
8347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</ol>
8447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
8547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <p>The difference in time is the approximate audio output latency,
8647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  assuming that the LED latency and light sensor latency are both zero.
8747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Typically, the LED and light sensor each have a relatively low latency
8847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  on the order of one millisecond or less, which is sufficiently low enough
8947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  to ignore.</p>
9047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
9147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h3>Larsen test</h3>
9247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
9347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  One of the easiest latency tests is an audio feedback
9447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  (Larsen effect) test. This provides a crude measure of combined output
9547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  and input latency by timing an impulse response loop. This test is not very useful
9647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  by itself because of the nature of the test, but it can be useful for calibrating 
9747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  other tests</p>
9847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
9947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>To conduct this test:</p>
10047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<ol>
10147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Run an app that captures audio from the microphone and immediately plays the
10247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  captured data back over the speaker.</li>
10347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Create a sound externally,
10447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  such as tapping a pencil by the microphone. This noise generates a feedback loop.</li>
10547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Measure the time between feedback pulses to get the sum of the output latency, input latency, and application overhead.</li>
10647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</ol>
10747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
10847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <p>This method does not break down the
10947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  component times, which is important when the output latency
11047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  and input latency are independent. So this method is not recommended for measuring output latency, but might be useful
11147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  to help measure output latency.</p>
11247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
11347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h2 id="measuringInput">Measuring Input Latency</h2>
11447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
11547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
11647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Input latency is more difficult to measure than output latency. The following
11747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  tests might help.
11847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
11947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
12047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
12147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay MurphyOne approach is to first determine the output latency
12247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  using the LED and oscilloscope method and then use
12347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  the audio feedback (Larsen) test to determine the sum of output
12447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  latency and input latency. The difference between these two
12547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  measurements is the input latency.
12647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
12747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
12847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
12947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Another technique is to use a GPIO pin on a prototype device.
13047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Externally, pulse a GPIO input at the same time that you present
13147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  an audio signal to the device.  Run an app that compares the
13247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  difference in arrival times of the GPIO signal and audio data.
13347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
13447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
13547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h2 id="reducing">Reducing Latency</h2>
13647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
13747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>To achieve low audio latency, pay special attention throughout the
13847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphysystem to scheduling, interrupt handling, power management, and device
13947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphydriver design. Your goal is to prevent any part of the platform from
14047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphyblocking a <code>SCHED_FIFO</code> audio thread for more than a couple
14147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphyof milliseconds. By adopting such a systematic approach, you can reduce
14247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphyaudio latency and get the side benefit of more predictable performance
14347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphyoverall.
14447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
14547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
14647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
14747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy <p>
14847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Audio underruns, when they do occur, are often detectable only under certain
14947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  conditions or only at the transitions. Try stressing the system by launching
15047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  new apps and scrolling quickly through various displays. But be aware
15147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  that some test conditions are so stressful as to be beyond the design
15247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  goals. For example, taking a bugreport puts such enormous load on the
15347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  system that it may be acceptable to have an underrun in that case.
15447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
15547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
15647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
15747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  When testing for underruns:
15847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
15947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <ul>
16047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Configure any DSP after the app processor so that it adds
16147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  minimal latency.</li>
16247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Run tests under different conditions
16347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  such as having the screen on or off, USB plugged in or unplugged,
16447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  WiFi on or off, Bluetooth on or off, and telephony and data radios
16547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  on or off.</li>
16647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Select relatively quiet music that you're very familiar with, and which is easy
16747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  to hear underruns in.</li>
16847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Use wired headphones for extra sensitivity.</li>
16947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <li>Give yourself breaks so that you don't experience "ear fatigue."</li>
17047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  </ul>
17147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
17247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
17347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Once you find the underlying causes of underruns, reduce
17447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  the buffer counts and sizes to take advantage of this.
17547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  The eager approach of reducing buffer counts and sizes <i>before</i>
17647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  analyzing underruns and fixing the causes of underruns only
17747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  results in frustration.
17847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
17947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
18047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<h3 id="tools">Tools</h3>
18147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
18247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  <code>systrace</code> is an excellent general-purpose tool
18347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  for diagnosing system-level performance glitches.
18447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
18547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy
18647b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy<p>
18747b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  The output of <code>dumpsys media.audio_flinger</code> also contains a
18847b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  useful section called "simple moving statistics." This has a summary
18947b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  of the variability of elapsed times for each audio mix and I/O cycle.
19047b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  Ideally, all the time measurements should be about equal to the mean or
19147b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  nominal cycle time. If you see a very low minimum or high maximum, this is an
19247b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  indication of a problem, likely a high scheduling latency or interrupt
19347b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  disable time. The <i>tail</i> part of the output is especially helpful,
19447b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy  as it highlights the variability beyond +/- 3 standard deviations.
19547b1d3f8ffd20344e0d17eac97a9ceee2108b3a5Clay Murphy</p>
196