1 page.title=Audio Latency Measurements 2 @jd:body 3 4 <!-- 5 Copyright 2015 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 article gives round-trip audio latency measurements for select devices and 29 platform versions. 30 </p> 31 32 <h2 id="definition">Definition</h2> 33 34 <p> 35 <a href="http://en.wikipedia.org/wiki/Latency_%28engineering%29">Latency</a> 36 is an important system performance metric. There are many kinds 37 of <a href="latency.html">audio latency</a> 38 metrics. One useful and well-understood metric is 39 <a href="latency_measure.html#measuringRoundTrip">round-trip latency</a>. 40 Round-trip latency is defined as the time it takes for 41 an audio signal to enter the input of a mobile device, be processed 42 by an app running on the application processor, and exit the output. 43 </p> 44 45 <img src="images/round_trip_on_device.png" alt="Round-trip audio latency on device" id="figure1" /> 46 <p class="img-caption"> 47 <strong>Figure 1.</strong> Round-trip audio latency on device: T<sub>output</sub> - T<sub>input</sub> 48 </p> 49 50 <h2 id="why">Why we measure latency</h2> 51 52 <p> 53 We measure and report latency so Android 54 app developers will have the data they need to make informed decisions about available 55 latency on actual devices. By sharing these numbers for select Nexus devices, we also hope to 56 encourage the entire Android community to measure, publish, and reduce 57 latency on <i>all</i> devices. 58 Please join us in our commitment to reducing audio latency. 59 </p> 60 61 <h2 id="app">Application impact on latency</h2> 62 63 <p> 64 There are two kinds of delays that a signal processing stage can add to latency: 65 algorithmic delay and computational delay. 66 Algorithmic delay is inherent and does not vary with the CPU. 67 An example is the delay added by a 68 <a href="http://en.wikipedia.org/wiki/Finite_impulse_response">finite impulse response</a> 69 (FIR) filter. 70 Computational delay is related to the number of CPU cycles required. 71 For example, attenuation of a signal is usually done by a multiplication operation, 72 and this multiplication will take a varying number of cycles depending on the CPU. 73 </p> 74 75 <h2 id="how">How we measure</h2> 76 77 <p> 78 The measurements below were taken with the 79 <a href="loopback.html">Dr. Rick O'Rang audio loopback dongle</a> 80 and an 81 <a href="latency_measure.html#larsenTest">audio feedback (Larsen effect) test</a>. 82 </p> 83 84 <p> 85 For our measurements, we assume the application signal processing 86 adds zero algorithmic delay and near zero computational delay. 87 </p> 88 89 <p> 90 We measure round-trip latency via the headset connector for several reasons: 91 </p> 92 <ul> 93 <li> 94 There are important music applications, such as guitar and voice processing, 95 that use the headset connector. 96 </li> 97 <li> 98 Measuring round-trip latency of the on-device microphone and speaker can 99 be cumbersome, as it is difficult to keep a feedback loop in open air from entering 100 uncontrolled oscillation. 101 </li> 102 <li> 103 The on-device transducers are small and sacrifice frequency response 104 to achieve their small size. To compensate, digital signal processing is 105 applied but increases algorithmic delay for the on-device path. 106 </li> 107 </ul> 108 109 <p> 110 There are cases where on-device microphone and speaker latencies 111 <i>do</i> 112 matter, but they are usually for one direction, not round-trip. 113 Techniques for measuring unidirectional latency are described at 114 <a href="latency_measure.html#measuringOutput">Measuring Output Latency</a> 115 and 116 <a href="latency_measure.html#measuringInput">Measuring Input Latency</a>. 117 </p> 118 119 <img src="images/round_trip_via_headset_connector.png" alt="Round-trip latency via headset connector" id="figure2" /> 120 <p class="img-caption"> 121 <strong>Figure 2.</strong> Round-trip latency via headset connector: T<sub>output</sub> - T<sub>input</sub> 122 </p> 123 124 <h2 id="measurements">Example measurements</h2> 125 126 <p> 127 The measurements shown are specific to a 128 <a href="{@docRoot}source/build-numbers.html">build number</a>. 129 Devices are listed in approximate order of initial release and within device by platform version. 130 The test application uses the Android native audio API based on OpenSL ES. 131 </p> 132 133 <table> 134 <tr> 135 <th>Model</th> 136 <th>Platform<br />version</th> 137 <th>Build<br />number</th> 138 <th>Sample rate<br />(Hz)</th> 139 <th>Buffer size<br />(frames)</th> 140 <th>Buffer size<br />(ms)</th> 141 <th>Round-trip<br />latency (ms)<br />± one buffer</th> 142 </tr> 143 144 <tr> 145 <td>Nexus One</td> 146 <td>2.3.6</td> 147 <td>GRK39F</td> 148 <td>44100</td> 149 <td>768</td> 150 <td>17.4</td> 151 <td>345</td> 152 </tr> 153 154 <tr> 155 <td>Nexus S</td> 156 <td>2.3.6</td> 157 <td>GRK39F</td> 158 <td>44100</td> 159 <td>1024</td> 160 <td>23.2</td> 161 <td>260</td> 162 </tr> 163 164 <tr> 165 <td>Nexus S</td> 166 <td>4.0.4</td> 167 <td>IMM76D</td> 168 <td>44100</td> 169 <td>1024</td> 170 <td>23.2</td> 171 <td>260</td> 172 </tr> 173 174 <tr> 175 <td>Nexus S</td> 176 <td>4.1.2</td> 177 <td>JZO54K</td> 178 <td>44100</td> 179 <td>880</td> 180 <td>20</td> 181 <td>210</td> 182 </tr> 183 184 <tr> 185 <td>Galaxy Nexus</td> 186 <td>4.0.1</td> 187 <td>ITL41D</td> 188 <td>44100</td> 189 <td>976</td> 190 <td>22.1</td> 191 <td>270</td> 192 </tr> 193 194 <tr> 195 <td>Galaxy Nexus</td> 196 <td>4.3</td> 197 <td>JWR66Y</td> 198 <td>44100</td> 199 <td>144</td> 200 <td>3.3</td> 201 <td>130</td> 202 </tr> 203 204 <tr> 205 <td>Nexus 4</td> 206 <td>4.2.2</td> 207 <td>JDQ39E</td> 208 <td>48000</td> 209 <td>240</td> 210 <td>5</td> 211 <td>195</td> 212 </tr> 213 214 <tr> 215 <td>Nexus 4</td> 216 <td>5.1</td> 217 <td>LMY47O</td> 218 <td>48000</td> 219 <td>240</td> 220 <td>5</td> 221 <td>58</td> 222 </tr> 223 224 <tr> 225 <td>Nexus 10</td> 226 <td>5.0.2</td> 227 <td>LRX22G</td> 228 <td>44100</td> 229 <td>256</td> 230 <td>5.8</td> 231 <td>36</td> 232 </tr> 233 234 <tr> 235 <td>Nexus 10</td> 236 <td>5.1</td> 237 <td>LMY47D</td> 238 <td>44100</td> 239 <td>256</td> 240 <td>5.8</td> 241 <td>35</td> 242 </tr> 243 244 <tr> 245 <td>Nexus 7<br />2013</td> 246 <td>4.3</td> 247 <td>JSR78D</td> 248 <td>48000</td> 249 <td>240</td> 250 <td>5</td> 251 <td>149</td> 252 </tr> 253 254 <tr> 255 <td>Nexus 7<br />2013</td> 256 <td>4.4</td> 257 <td>KRT16S</td> 258 <td>48000</td> 259 <td>240</td> 260 <td>5</td> 261 <td>85</td> 262 </tr> 263 264 <tr> 265 <td>Nexus 7<br />2013</td> 266 <td>5.0.2</td> 267 <td>LRX22G</td> 268 <td>48000</td> 269 <td>240</td> 270 <td>5</td> 271 <td>64</td> 272 </tr> 273 274 <tr> 275 <td>Nexus 7<br />2013</td> 276 <td>5.1</td> 277 <td>LMY47O</td> 278 <td>48000</td> 279 <td>240</td> 280 <td>5</td> 281 <td>55</td> 282 </tr> 283 284 <tr> 285 <td>Nexus 7<br />2013</td> 286 <td>6.0</td> 287 <td>MRA58K</td> 288 <td>48000</td> 289 <td>240</td> 290 <td>5</td> 291 <td>55</td> 292 </tr> 293 294 <tr> 295 <td>Nexus 5</td> 296 <td>4.4.4</td> 297 <td>KTU84P</td> 298 <td>48000</td> 299 <td>240</td> 300 <td>5</td> 301 <td>95</td> 302 </tr> 303 304 <tr> 305 <td>Nexus 5</td> 306 <td>5.0.0</td> 307 <td>LRX21O</td> 308 <td>48000</td> 309 <td>240</td> 310 <td>5</td> 311 <td>47</td> 312 </tr> 313 314 <tr> 315 <td>Nexus 5</td> 316 <td>5.1</td> 317 <td>LMY47I</td> 318 <td>48000</td> 319 <td>240</td> 320 <td>5</td> 321 <td>42</td> 322 </tr> 323 324 <tr> 325 <td>Nexus 5</td> 326 <td>6.0</td> 327 <td>MRA58K</td> 328 <td>48000</td> 329 <td>192</td> 330 <td>4</td> 331 <td>38</td> 332 </tr> 333 334 <tr> 335 <td>Nexus 9</td> 336 <td>5.0.0</td> 337 <td>LRX21L</td> 338 <td>48000</td> 339 <td>256</td> 340 <td>5.3</td> 341 <td>35</td> 342 </tr> 343 344 <tr> 345 <td>Nexus 9</td> 346 <td>5.0.1</td> 347 <td>LRX22C</td> 348 <td>48000</td> 349 <td>256</td> 350 <td>5.3</td> 351 <td>38</td> 352 </tr> 353 354 <tr> 355 <td>Nexus 9</td> 356 <td>5.1.1</td> 357 <td>LMY47X</td> 358 <td>48000</td> 359 <td>256</td> 360 <td>5.3</td> 361 <td>32</td> 362 </tr> 363 364 <tr> 365 <td>Nexus 9</td> 366 <td>6.0</td> 367 <td>MRA58K</td> 368 <td>48000</td> 369 <td>128</td> 370 <td>2.6</td> 371 <td>15</td> 372 </tr> 373 374 <tr> 375 <td>Nexus 6</td> 376 <td>5.0.1</td> 377 <td>LRX22C</td> 378 <td>48000</td> 379 <td>240</td> 380 <td>5</td> 381 <td>65</td> 382 </tr> 383 384 <tr> 385 <td>Nexus 6</td> 386 <td>5.1</td> 387 <td>LMY47I</td> 388 <td>48000</td> 389 <td>240</td> 390 <td>5</td> 391 <td>42</td> 392 </tr> 393 394 <tr> 395 <td>Nexus 6</td> 396 <td>6.0</td> 397 <td>MRA58K</td> 398 <td>48000</td> 399 <td>192</td> 400 <td>4</td> 401 <td>33</td> 402 </tr> 403 404 <tr> 405 <td>Nexus 5X</td> 406 <td>6.0</td> 407 <td>MDA89E</td> 408 <td>48000</td> 409 <td>192</td> 410 <td>4</td> 411 <td>18</td> 412 </tr> 413 414 <tr> 415 <td>Nexus 6P</td> 416 <td>6.0</td> 417 <td>MDA89D</td> 418 <td>48000</td> 419 <td>192</td> 420 <td>4</td> 421 <td>18</td> 422 </tr> 423 424 </table> 425 426 <p></p> 427 <p></p> 428 429 <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1.1','packages':['bar']}]}"></script> 430 <script type="text/javascript"> 431 432 433 google.setOnLoadCallback(drawChart); 434 function drawChart() { 435 var data = google.visualization.arrayToDataTable([ 436 ['Device', '2.3', '4.0', '4.1', '4.2', '4.3', '4.4', '5.0', '5.1', '6.0'], 437 ['Nexus One', 345, null, null, null, null, null, null, null, null,], 438 ['Nexus S', 260, 260, 210, null, null, null, null, null, null,], 439 ['Galaxy Nexus', null, 270, null, null, 130, null, null, null, null,], 440 ['Nexus 4', null, null, null, 195, null, null, null, 58, null,], 441 ['Nexus 10', null, null, null, null, null, null, 36, 35, null,], 442 ['Nexus 7 2013', null, null, null, null, 149, 85, 64, 55, 55,], 443 ['Nexus 5', null, null, null, null, null, 95, 47, 42, 38,], 444 ['Nexus 9', null, null, null, null, null, null, 38, 32, 15,], 445 ['Nexus 6', null, null, null, null, null, null, 65, 42, 33,], 446 ['Nexus 5X', null, null, null, null, null, null, null, null, 18,], 447 ['Nexus 6P', null, null, null, null, null, null, null, null, 18,] 448 ]); 449 450 var options = { 451 chart: { 452 title: 'Round Trip Audio Latency', 453 subtitle: 'Over headset, using native APIs', 454 }, 455 bars: 'horizontal', // Required for Material Bar Charts. 456 bar: {groupWidth: '100%'}, 457 hAxis: { 458 title: 'Milliseconds' 459 }, 460 height: 800, 461 width: 600 462 }; 463 464 var chart = new google.charts.Bar(document.getElementById('chart_div')); 465 466 chart.draw(data, google.charts.Bar.convertOptions(options)); 467 468 } 469 </script> 470 471 <div id="chart_div"></div> 472 <p></p> 473 <p class="img-caption"> 474 <strong>Figure 3.</strong> Round trip latencies.</p>