blob: 6285ff9b28a03944af985b1ca80186025d21b92e [file] [log] [blame]
Glenn Kasten32517852015-03-30 11:57:01 -07001page.title=Measuring Audio Latency
Clay Murphy47b1d3f2013-10-03 10:02:22 -07002@jd:body
3
4<!--
Clay Murphy768b82a2013-11-12 11:32:41 -08005 Copyright 2013 The Android Open Source Project
Clay Murphy47b1d3f2013-10-03 10:02:22 -07006
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
38see the <a href="testing_circuit.html">Testing circuit</a> for an example test environment.
39</p>
40
Glenn Kasten978bec82014-12-23 15:15:20 -080041<h3 id="ledTest">LED and oscilloscope test</h3>
Clay Murphy47b1d3f2013-10-03 10:02:22 -070042<p>
43This test measures latency in relation to the device's LED indicator.
44If 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.
Bert McMeen3bb4b8f2015-05-06 17:21:27 -070070 <p class="note"><strong>Note:</strong> To get useful results, it is crucial to use the correct
Clay Murphy47b1d3f2013-10-03 10:02:22 -070071 APIs in the test app so that you're exercising the fast audio output path.
72 See <a href="latency_design.html">Design For Reduced Latency</a> for
Bert McMeen3bb4b8f2015-05-06 17:21:27 -070073 background.</p>
Clay Murphy47b1d3f2013-10-03 10:02:22 -070074 </li>
75 <li>Place a light sensor next to the LED.</li>
76 <li>Connect the probes of a dual-channel oscilloscope to both the wired headphone
77 jack (line output) and light sensor.</li>
78 <li>Use the oscilloscope to measure
79 the time difference between observing the line output signal versus the light
80 sensor signal.</li>
81</ol>
82
83 <p>The difference in time is the approximate audio output latency,
84 assuming that the LED latency and light sensor latency are both zero.
85 Typically, the LED and light sensor each have a relatively low latency
86 on the order of one millisecond or less, which is sufficiently low enough
87 to ignore.</p>
88
Glenn Kasten9f5130c2014-11-10 14:36:08 -080089<h2 id="measuringRoundTrip">Measuring Round-Trip Latency</h2>
90
91<p>
Glenn Kastene158b8e2015-02-06 09:48:11 -080092 <a href="http://en.wikipedia.org/wiki/Round-trip_delay_time">Round-trip latency</a>
93 is the sum of output latency and input latency.
Glenn Kasten9f5130c2014-11-10 14:36:08 -080094</p>
95
Glenn Kasten978bec82014-12-23 15:15:20 -080096<h3 id="larsenTest">Larsen test</h3>
Clay Murphy47b1d3f2013-10-03 10:02:22 -070097<p>
98 One of the easiest latency tests is an audio feedback
99 (Larsen effect) test. This provides a crude measure of combined output
100 and input latency by timing an impulse response loop. This test is not very useful
Glenn Kasten9f5130c2014-11-10 14:36:08 -0800101 for detailed analysis
Clay Murphyc9ea0002015-02-17 14:57:14 -0800102 by itself because of the nature of the test, but it can be useful for
103 calibrating other tests, and for establishing an upper bound.</p>
Clay Murphy47b1d3f2013-10-03 10:02:22 -0700104
105<p>To conduct this test:</p>
106<ol>
107 <li>Run an app that captures audio from the microphone and immediately plays the
108 captured data back over the speaker.</li>
109 <li>Create a sound externally,
Glenn Kasten9f5130c2014-11-10 14:36:08 -0800110 such as tapping a pencil by the microphone. This noise generates a feedback loop.
111 Alternatively, one can inject an impulse into the loop using software.</li>
Clay Murphy47b1d3f2013-10-03 10:02:22 -0700112 <li>Measure the time between feedback pulses to get the sum of the output latency, input latency, and application overhead.</li>
113</ol>
114
115 <p>This method does not break down the
116 component times, which is important when the output latency
Glenn Kasten9f5130c2014-11-10 14:36:08 -0800117 and input latency are independent. So this method is not recommended for measuring
118 precise output latency or input latency values in isolation, but might be useful
119 for establishing rough estimates.</p>
120
Glenn Kasten73512002015-01-15 10:06:31 -0800121<p>
122We have published an example implementation at
123<a href="https://android.googlesource.com/platform/frameworks/wilhelm/+/master/tests/examples/slesTestFeedback.cpp">slesTestFeedback.cpp</a>.
124This is a command-line app and is built using the platform build environment;
125however it should be straightforward to adopt the code for other environments.
126You will also need the <a href="avoiding_pi.html#nonBlockingAlgorithms">non-blocking</a> FIFO code
127located in the <code>audio_utils</code> library.
128</p>
129
Clay Murphyc9ea0002015-02-17 14:57:14 -0800130<h3 id="loopback">Audio Loopback Dongle</h3>
Glenn Kasten9f5130c2014-11-10 14:36:08 -0800131
132<p>
Clay Murphyc9ea0002015-02-17 14:57:14 -0800133 The <a href="loopback.html">Dr. Rick O'Rang audio loopback dongle</a> is handy for
Glenn Kasten9f5130c2014-11-10 14:36:08 -0800134 measuring round-trip latency over the headset connector.
135 The image below demonstrates the result of injecting an impulse
136 into the loop once, and then allowing the feedback loop to oscillate.
137 The period of the oscillations is the round-trip latency.
138 The specific device, software release, and
139 test conditions are not specified here. The results shown
140 should not be extrapolated.
141</p>
142
Clay Murphy1b77cc22014-12-17 18:20:06 -0800143<img src="images/round_trip.png" alt="round-trip measurement" id="figure1" />
144<p class="img-caption">
145 <strong>Figure 1.</strong> Round-trip measurement
146</p>
Clay Murphy47b1d3f2013-10-03 10:02:22 -0700147
148<h2 id="measuringInput">Measuring Input Latency</h2>
149
150<p>
151 Input latency is more difficult to measure than output latency. The following
152 tests might help.
153</p>
154
155<p>
156One approach is to first determine the output latency
157 using the LED and oscilloscope method and then use
158 the audio feedback (Larsen) test to determine the sum of output
159 latency and input latency. The difference between these two
160 measurements is the input latency.
161</p>
162
163<p>
164 Another technique is to use a GPIO pin on a prototype device.
165 Externally, pulse a GPIO input at the same time that you present
166 an audio signal to the device. Run an app that compares the
167 difference in arrival times of the GPIO signal and audio data.
168</p>
169
170<h2 id="reducing">Reducing Latency</h2>
171
172<p>To achieve low audio latency, pay special attention throughout the
173system to scheduling, interrupt handling, power management, and device
174driver design. Your goal is to prevent any part of the platform from
175blocking a <code>SCHED_FIFO</code> audio thread for more than a couple
176of milliseconds. By adopting such a systematic approach, you can reduce
177audio latency and get the side benefit of more predictable performance
178overall.
179</p>
180
181
182 <p>
183 Audio underruns, when they do occur, are often detectable only under certain
184 conditions or only at the transitions. Try stressing the system by launching
185 new apps and scrolling quickly through various displays. But be aware
186 that some test conditions are so stressful as to be beyond the design
187 goals. For example, taking a bugreport puts such enormous load on the
188 system that it may be acceptable to have an underrun in that case.
189</p>
190
191<p>
192 When testing for underruns:
193</p>
194 <ul>
195 <li>Configure any DSP after the app processor so that it adds
196 minimal latency.</li>
197 <li>Run tests under different conditions
198 such as having the screen on or off, USB plugged in or unplugged,
199 WiFi on or off, Bluetooth on or off, and telephony and data radios
200 on or off.</li>
201 <li>Select relatively quiet music that you're very familiar with, and which is easy
202 to hear underruns in.</li>
203 <li>Use wired headphones for extra sensitivity.</li>
204 <li>Give yourself breaks so that you don't experience "ear fatigue."</li>
205 </ul>
206
207<p>
208 Once you find the underlying causes of underruns, reduce
209 the buffer counts and sizes to take advantage of this.
210 The eager approach of reducing buffer counts and sizes <i>before</i>
211 analyzing underruns and fixing the causes of underruns only
212 results in frustration.
213</p>
214
215<h3 id="tools">Tools</h3>
216<p>
217 <code>systrace</code> is an excellent general-purpose tool
218 for diagnosing system-level performance glitches.
219</p>
220
221<p>
222 The output of <code>dumpsys media.audio_flinger</code> also contains a
223 useful section called "simple moving statistics." This has a summary
224 of the variability of elapsed times for each audio mix and I/O cycle.
225 Ideally, all the time measurements should be about equal to the mean or
226 nominal cycle time. If you see a very low minimum or high maximum, this is an
227 indication of a problem, likely a high scheduling latency or interrupt
228 disable time. The <i>tail</i> part of the output is especially helpful,
229 as it highlights the variability beyond +/- 3 standard deviations.
230</p>