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