Home | History | Annotate | Download | only in audio
      1 page.title=Design For Reduced Latency
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2013 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 The Android 4.1 release introduced internal framework changes for
     29 a <a href="http://en.wikipedia.org/wiki/Low_latency">lower latency</a>
     30 audio output path. There were minimal public client API
     31 or HAL API changes. This document describes the initial design,
     32 which has continued to evolve over time.
     33 Having a good understanding of this design should help device OEM and
     34 SoC vendors implement the design correctly on their particular devices
     35 and chipsets.  This article is not intended for application developers.
     36 </p>
     37 
     38 <h2 id="trackCreation">Track Creation</h2>
     39 
     40 <p>
     41 The client can optionally set bit <code>AUDIO_OUTPUT_FLAG_FAST</code> in the
     42 <code>audio_output_flags_t</code> parameter of AudioTrack C++ constructor or
     43 <code>AudioTrack::set()</code>. Currently the only clients that do so are:
     44 </p>
     45 
     46 <ul>
     47 <li>Android native audio based on OpenSL ES</li>
     48 <li><a href="http://developer.android.com/reference/android/media/SoundPool.html">android.media.SoundPool</a></li>
     49 <li><a href="http://developer.android.com/reference/android/media/ToneGenerator.html">android.media.ToneGenerator</a></li>
     50 </ul>
     51 
     52 <p>
     53 The AudioTrack C++ implementation reviews the <code>AUDIO_OUTPUT_FLAG_FAST</code>
     54 request and may optionally deny the request at client level. If it
     55 decides to pass the request on, it does so using <code>TRACK_FAST</code> bit of
     56 the <code>track_flags_t</code> parameter of the <code>IAudioTrack</code> factory method
     57 <code>IAudioFlinger::createTrack()</code>.
     58 </p>
     59 
     60 <p>
     61 The AudioFlinger audio server reviews the <code>TRACK_FAST</code> request and may
     62 optionally deny the request at server level. It informs the client
     63 whether or not the request was accepted, via bit <code>CBLK_FAST</code> of the
     64 shared memory control block.
     65 </p>
     66 
     67 <p>
     68 The factors that impact the decision include:
     69 </p>
     70 
     71 <ul>
     72 <li>Presence of a fast mixer thread for this output (see below)</li>
     73 <li>Track sample rate</li>
     74 <li>Presence of a client thread to execute callback handlers for this track</li>
     75 <li>Track buffer size</li>
     76 <li>Available fast track slots (see below)</li>
     77 </ul>
     78 
     79 <p>
     80 If the client's request was accepted, it is called a "fast track."
     81 Otherwise it's called a "normal track."
     82 </p>
     83 
     84 <h2 id="mixerThreads">Mixer Threads</h2>
     85 
     86 <p>
     87 At the time AudioFlinger creates a normal mixer thread, it decides
     88 whether or not to also create a fast mixer thread. Both the normal
     89 mixer and fast mixer are not associated with a particular track,
     90 but rather with a set of tracks. There is always a normal mixer
     91 thread. The fast mixer thread, if it exists, is subservient to the
     92 normal mixer thread and acts under its control.
     93 </p>
     94 
     95 <h3 id="fastMixer">Fast mixer</h3>
     96 
     97 <h4>Features</h4>
     98 
     99 <p>
    100 The fast mixer thread provides these features:
    101 </p>
    102 
    103 <ul>
    104 <li>Mixing of the normal mixer's sub-mix and up to 7 client fast tracks</li>
    105 <li>Per track attenuation</li>
    106 </ul>
    107 
    108 <p>
    109 Omitted features:
    110 </p>
    111 
    112 <ul>
    113 <li>Per track sample rate conversion</li>
    114 <li>Per track effects</li>
    115 <li>Per mix effects</li>
    116 </ul>
    117 
    118 <h4>Period</h4>
    119 
    120 <p>
    121 The fast mixer runs periodically, with a recommended period of two
    122 to three milliseconds (ms), or a slightly higher period of five ms if needed for scheduling stability.
    123 This number was chosen so that, accounting for the complete
    124 buffer pipeline, the total latency is on the order of 10 ms. Smaller
    125 values are possible but may result in increased power consumption
    126 and chance of glitches depending on CPU scheduling predictability.
    127 Larger values are possible, up to 20 ms, but result in degraded
    128 total latency and so should be avoided.
    129 </p>
    130 
    131 <h4>Scheduling</h4>
    132 
    133 <p>
    134 The fast mixer runs at elevated <code>SCHED_FIFO</code> priority. It needs very
    135 little CPU time, but must run often and with low scheduling jitter.
    136 <a href="http://en.wikipedia.org/wiki/Jitter">Jitter</a>
    137 expresses the variation in cycle time: it is the difference between the
    138 actual cycle time versus the expected cycle time.
    139 Running too late will result in glitches due to underrun. Running
    140 too early will result in glitches due to pulling from a fast track
    141 before the track has provided data.
    142 </p>
    143 
    144 <h4>Blocking</h4>
    145 
    146 <p>
    147 Ideally the fast mixer thread never blocks, other than at HAL
    148 <code>write()</code>. Other occurrences of blocking within the fast mixer are
    149 considered bugs. In particular, mutexes are avoided.
    150 Instead, <a href="http://en.wikipedia.org/wiki/Non-blocking_algorithm">non-blocking algorithms</a>
    151 (also known as lock-free algorithms) are used.
    152 See <a href="avoiding_pi.html">Avoiding Priority Inversion</a> for more on this topic.
    153 </p>
    154 
    155 <h4>Relationship to other components</h4>
    156 
    157 <p>
    158 The fast mixer has little direct interaction with clients. In
    159 particular, it does not see binder-level operations, but it does
    160 access the client's shared memory control block.
    161 </p>
    162 
    163 <p>
    164 The fast mixer receives commands from the normal mixer via a state queue.
    165 </p>
    166 
    167 <p>
    168 Other than pulling track data, interaction with clients is via the normal mixer.
    169 </p>
    170 
    171 <p>
    172 The fast mixer's primary sink is the audio HAL.
    173 </p>
    174 
    175 <h3 id="normalMixer">Normal mixer</h3>
    176 
    177 <h4>Features</h4>
    178 
    179 <p>
    180 All features are enabled:
    181 </p>
    182 
    183 <ul>
    184 <li>Up to 32 tracks</li>
    185 <li>Per track attenuation</li>
    186 <li>Per track sample rate conversion</li>
    187 <li>Effects processing</li>
    188 </ul>
    189 
    190 <h4>Period</h4>
    191 
    192 <p>
    193 The period is computed to be the first integral multiple of the
    194 fast mixer period that is >= 20 ms.
    195 </p>
    196 
    197 <h4>Scheduling</h4>
    198 
    199 <p>
    200 The normal mixer runs at elevated <code>SCHED_OTHER</code> priority.
    201 </p>
    202 
    203 <h4>Blocking</h4>
    204 
    205 <p>
    206 The normal mixer is permitted to block, and often does so at various
    207 mutexes as well as at a blocking pipe to write its sub-mix.
    208 </p>
    209 
    210 <h4>Relationship to other components</h4>
    211 
    212 <p>
    213 The normal mixer interacts extensively with the outside world,
    214 including binder threads, audio policy manager, fast mixer thread,
    215 and client tracks.
    216 </p>
    217 
    218 <p>
    219 The normal mixer's sink is a blocking pipe to the fast mixer's track 0.
    220 </p>
    221 
    222 <h2 id="flags">Flags</h2>
    223 
    224 <p>
    225 <code>AUDIO_OUTPUT_FLAG_FAST</code> bit is a hint. There's no guarantee the
    226 request will be fulfilled.
    227 </p>
    228 
    229 <p>
    230 <code>AUDIO_OUTPUT_FLAG_FAST</code> is a client-level concept. It does not appear
    231 in server.
    232 </p>
    233 
    234 <p>
    235 <code>TRACK_FAST</code> is a client -&gt; server concept.
    236 </p>
    237