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