blob: a85c77d7c87e5186879644feee519da011935f81 [file] [log] [blame]
page.title=Audio Latency Measurements
@jd:body
<!--
Copyright 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
<ol id="auto-toc">
</ol>
</div>
</div>
<p>
This article gives round-trip audio latency measurements for select devices and
platform versions.
</p>
<h2 id="definition">Definition</h2>
<p>
<a href="http://en.wikipedia.org/wiki/Latency_%28engineering%29">Latency</a>
is an important system performance metric. There are many kinds
of <a href="latency.html">audio latency</a>
metrics. One useful and well-understood metric is
<a href="latency_measure.html#measuringRoundTrip">round-trip latency</a>.
Round-trip latency is defined as the time it takes for
an audio signal to enter the input of a mobile device, be processed
by an app running on the application processor, and exit the output.
</p>
<img src="images/round_trip_on_device.png" alt="Round-trip audio latency on device" id="figure1" />
<p class="img-caption">
<strong>Figure 1.</strong> Round-trip audio latency on device: T<sub>output</sub> - T<sub>input</sub>
</p>
<h2 id="why">Why we measure latency</h2>
<p>
We measure and report latency so Android
app developers will have the data they need to make informed decisions about available
latency on actual devices. By sharing these numbers for select Nexus devices, we also hope to
encourage the entire Android community to measure, publish, and reduce
latency on <i>all</i> devices.
Please join us in our commitment to reducing audio latency.
</p>
<h2 id="app">Application impact on latency</h2>
<p>
There are two kinds of delays that a signal processing stage can add to latency:
algorithmic delay and computational delay.
Algorithmic delay is inherent and does not vary with the CPU.
An example is the delay added by a
<a href="http://en.wikipedia.org/wiki/Finite_impulse_response">finite impulse response</a>
(FIR) filter.
Computational delay is related to the number of CPU cycles required.
For example, attenuation of a signal is usually done by a multiplication operation,
and this multiplication will take a varying number of cycles depending on the CPU.
</p>
<h2 id="how">How we measure</h2>
<p>
The measurements below were taken with the
<a href="loopback.html">Dr. Rick ORang audio loopback dongle</a>
and an
<a href="latency_measure.html#larsenTest">audio feedback (Larsen effect) test</a>.
</p>
<p>
For our measurements, we assume the application signal processing
adds zero algorithmic delay and near zero computational delay.
</p>
<p>
We measure round-trip latency via the headset connector for several reasons:
</p>
<ul>
<li>
There are important music applications, such as guitar and voice processing,
that use the headset connector.
</li>
<li>
Measuring round-trip latency of the on-device microphone and speaker can
be cumbersome, as it is difficult to keep a feedback loop in open air from entering
uncontrolled oscillation.
</li>
<li>
The on-device transducers are small and sacrifice frequency response
to achieve their small size. To compensate, digital signal processing is
applied but increases algorithmic delay for the on-device path.
</li>
</ul>
<p>
There are cases where on-device microphone and speaker latencies
<i>do</i>
matter, but they are usually for one direction, not round-trip.
Techniques for measuring unidirectional latency are described at
<a href="latency_measure.html#measuringOutput">Measuring Output Latency</a>
and
<a href="latency_measure.html#measuringInput">Measuring Input Latency</a>.
</p>
<img src="images/round_trip_via_headset_connector.png" alt="Round-trip latency via headset connector" id="figure2" />
<p class="img-caption">
<strong>Figure 2.</strong> Round-trip latency via headset connector: T<sub>output</sub> - T<sub>input</sub>
</p>
<h2 id="measurements">Example measurements</h2>
<p>
The measurements shown are specific to a
<a href="{@docRoot}source/build-numbers.html">build number</a>.
Devices are listed in approximate order of initial release and within device by platform version.
The test application uses the Android native audio API based on OpenSL ES.
</p>
<table>
<tr>
<th>Model</th>
<th>Platform<br />version</th>
<th>Build<br />number</th>
<th>Sample rate<br />(Hz)</th>
<th>Buffer size<br />(frames)</th>
<th>Buffer size<br />(ms)</th>
<th>Round-trip<br />latency (ms)<br />&plusmn; one buffer</th>
</tr>
<tr>
<td>Nexus One</td>
<td>2.3.6</td>
<td>GRK39F</td>
<td>44100</td>
<td>768</td>
<td>17.4</td>
<td>345</td>
</tr>
<tr>
<td>Nexus S</td>
<td>2.3.6</td>
<td>GRK39F</td>
<td>44100</td>
<td>1024</td>
<td>23.2</td>
<td>260</td>
</tr>
<tr>
<td>Nexus S</td>
<td>4.0.4</td>
<td>IMM76D</td>
<td>44100</td>
<td>1024</td>
<td>23.2</td>
<td>260</td>
</tr>
<tr>
<td>Nexus S</td>
<td>4.1.2</td>
<td>JZO54K</td>
<td>44100</td>
<td>880</td>
<td>20</td>
<td>210</td>
</tr>
<tr>
<td>Galaxy Nexus</td>
<td>4.0.1</td>
<td>ITL41D</td>
<td>44100</td>
<td>976</td>
<td>22.1</td>
<td>270</td>
</tr>
<tr>
<td>Galaxy Nexus</td>
<td>4.3</td>
<td>JWR66Y</td>
<td>44100</td>
<td>144</td>
<td>3.3</td>
<td>130</td>
</tr>
<tr>
<td>Nexus 4</td>
<td>4.2.2</td>
<td>JDQ39E</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>195</td>
</tr>
<tr>
<td>Nexus 4</td>
<td>5.1</td>
<td>LMY47R</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>58</td>
</tr>
<tr>
<td>Nexus 10</td>
<td>5.0.2</td>
<td>LRX22G</td>
<td>44100</td>
<td>256</td>
<td>5.8</td>
<td>36</td>
</tr>
<tr>
<td>Nexus 10</td>
<td>5.1</td>
<td>LMY47D</td>
<td>44100</td>
<td>256</td>
<td>5.8</td>
<td>35</td>
</tr>
<tr>
<td>Nexus 7<br />2013</td>
<td>4.3</td>
<td>JSR78D</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>149</td>
</tr>
<tr>
<td>Nexus 7<br />2013</td>
<td>4.4</td>
<td>KRT16S</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>85</td>
</tr>
<tr>
<td>Nexus 7<br />2013</td>
<td>5.0.2</td>
<td>LRX22G</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>64</td>
</tr>
<tr>
<td>Nexus 7<br />2013</td>
<td>5.1.1</td>
<td>LMY47W</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>55</td>
</tr>
<tr>
<td>Nexus 5</td>
<td>4.4.4</td>
<td>KTU84P</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>95</td>
</tr>
<tr>
<td>Nexus 5</td>
<td>5.0.0_r3.0.1</td>
<td>LRX21O</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>47</td>
</tr>
<tr>
<td>Nexus 5</td>
<td>5.1</td>
<td>LMY47M</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>42</td>
</tr>
<tr>
<td>Nexus 9</td>
<td>5.0.0</td>
<td>LRX21L</td>
<td>48000</td>
<td>256</td>
<td>5.3</td>
<td>35</td>
</tr>
<tr>
<td>Nexus 9</td>
<td>5.0.1</td>
<td>LRX22C</td>
<td>48000</td>
<td>256</td>
<td>5.3</td>
<td>38</td>
</tr>
<tr>
<td>Nexus 9</td>
<td>5.1.1</td>
<td>LMY47S</td>
<td>48000</td>
<td>256</td>
<td>5.3</td>
<td>32</td>
</tr>
<tr>
<td>Nexus 6</td>
<td>5.0.1</td>
<td>LRX22C</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>65</td>
</tr>
<tr>
<td>Nexus 6</td>
<td>5.1</td>
<td>LMY47I</td>
<td>48000</td>
<td>240</td>
<td>5</td>
<td>42</td>
</tr>
</table>
<img src="images/round_trip_bar_graph.png" alt="Round-trip latency bar graph" id="figure3" />
<p class="img-caption">
<strong>Figure 3.</strong> Round-trip latency bar graph
</p>