1 page.title=Audio Latency for App Developers 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 20 <div id="qv-wrapper"> 21 <div id="qv"> 22 <h2>In this document</h2> 23 <ol id="auto-toc"> 24 </ol> 25 </div> 26 </div> 27 28 <p>For the lowest audio latency possible, we recommend you use Android native audio 29 based on OpenSL ES 1.0.1.</p> 30 31 <h2 id="implementation">Implementation checklist</h2> 32 33 <p>To use Android native audio:</p> 34 35 <ol> 36 37 <li> 38 Download and install the 39 <a href="https://developer.android.com/tools/sdk/ndk/index.html">Android NDK</a>. 40 In the rest of this document, we'll assume <code>NDKroot</code> is the 41 directory where you installed NDK. 42 </li> 43 44 <li> 45 Read the <a href="#supporting">supporting documentation.</a> 46 </li> 47 48 <li> 49 Check for API level 9 or higher. 50 </li> 51 52 <li> 53 Check for feature 54 <a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features">android.hardware.audio.low_latency.</a> 55 </li> 56 57 <li> 58 Use the recommended native buffer size and sample rate returned by 59 <a href="http://developer.android.com/reference/android/media/AudioManager.html#getProperty(java.lang.String)">android.media.AudioManager.getProperty(java.lang.String)</a> 60 <p> <strong>Note</strong>: the same buffer size and sample rate should also be used for input.</p> 61 </li> 62 63 <li> 64 Usually an OpenSL ES buffer count of 1 is sufficient. 65 </li> 66 67 <li> 68 Keep your callback handlers short, without bursty CPU usage or unbounded blocking. Avoid 69 <a href="avoiding_pi.html">priority inversion.</a> 70 </li> 71 72 <li> 73 Consider using 74 <a href="avoiding_pi.html#nonBlockingAlgorithms">non-blocking algorithms</a> 75 to communicate between input and output callback handlers, 76 and between the callback handlers and the rest of your application. 77 </li> 78 79 </ol> 80 81 <h2 id="supporting">Supporting documentation</h2> 82 83 <h3 id="opensl_es_1_0_1">OpenSL ES 1.0.1</h3> 84 85 <p> 86 Use a PDF viewer to review the 87 <a href="https://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf">OpenSL 1.0.1 Specification.</a> 88 This is a rather long reference, and not all of it will be relevant to you; but you 89 will need to consult it for details on the API. 90 </p> 91 92 <p class="note"> 93 <strong>Note</strong>: this document describes the full OpenSL ES 1.0.1, but Android 94 native audio is actually based on a subset of OpenSL ES 1.0.1 with some Android-specific extensions. 95 </p> 96 97 <p> 98 Documents describing later versions of OpenSL ES, such as 1.1, 99 are not relevant to Android. 100 </p> 101 102 <h3 id="opensl_es_for_android">OpenSL ES for Android</h3> 103 104 <p> 105 The document "OpenSL ES for Android" is provided in the NDK installation, 106 and is not currently available online. Open this link in a browser: 107 </p> 108 109 <pre> 110 NDKroot/docs/Additional_library_docs/opensles/index.html 111 </pre> 112 113 <p> 114 You'll want to skim the whole 115 document, but pay special attention to the "Performance" subsection of the 116 "Programming notes" section. 117 </p> 118 119 <p> 120 Section "Supported features from OpenSL ES 1.0.1" 121 describes the subset supported by Android. 122 </p> 123 124 <p> 125 Section "Android extensions" describes Android-specific extensions 126 that aren't included in base OpenSL ES 1.0.1. 127 </p> 128 129 <h3 id="relationship">Relationship with OpenSL ES 1.0.1</h3> 130 131 <p> 132 This Venn diagram shows the relationship between 133 Android native audio and OpenSL ES 1.0.1. 134 </p> 135 136 <img src="images/venn.png" alt="Venn diagram" id="figure1" /> 137 <p class="img-caption"> 138 <strong>Figure 1.</strong> Venn diagram 139 </p> 140 141 <h2 id="resources">Other resources</h2> 142 143 <h3 id="source_android_com">source.android.com</h3> 144 145 <p> 146 The site <a href="{@docRoot}">source.android.com</a> 147 is primarily designed for OEMs building Android 148 devices, and the SoC vendors who supply components to these OEMs. 149 </p> 150 151 <p> 152 However, there is a wealth of useful information about latency at this site, so 153 you may want to review it. See the articles at 154 <a href="latency.html">Audio Latency.</a> 155 </p> 156 157 <h3 id="android_ndk">android-ndk</h3> 158 159 <p> 160 If you have questions about how to use Android native audio, you can ask at the discussion group 161 <a href="https://groups.google.com/forum/#!forum/android-ndk">android-ndk.</a> 162 </p> 163 164 <h3 id="videos">Videos</h3> 165 166 <dl> 167 168 <dt><a href="https://youtu.be/d3kfEeMZ65c">High performance audio on Android</a> 169 (Google I/O 2013)</dt> 170 <dd>The whole video is about latency.</dd> 171 172 <dt><a href="https://youtu.be/92fgcUNCHic">Building great multi-media experiences on Android</a> 173 (Google I/O 2014)</dt> 174 <dd>The first 14 minutes are about audio in general and input latency in particular.</dd> 175 176 <dt><a href="https://youtu.be/PnDK17zP9BI">Audio latency: buffer sizes</a> 177 (100 Days of Google Dev)</dt> 178 <dd>Describes the relationship between audio latency, buffer sizes, and task scheduling.</dd> 179 180 </dl> 181