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