blob: a4e6b7f0fee878d97ebf8061a3fb9adf3c9322a0 [file] [log] [blame]
Clay Murphy47b1d3f2013-10-03 10:02:22 -07001page.title=Audio
2@jd:body
3
4<!--
Clay Murphy768b82a2013-11-12 11:32:41 -08005 Copyright 2013 The Android Open Source Project
Clay Murphy47b1d3f2013-10-03 10:02:22 -07006
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 page exlains how to implement the audio Hardware Abstraction Layer (HAL)
29and configure the shared library.
30</p>
31
32<h2 id="implementing">
33 Implementing the HAL
34</h2>
35<p>
36 The audio HAL is composed of three different interfaces that you must implement:
37</p>
38<ul>
39 <li>
40 <code>hardware/libhardware/include/hardware/audio.h</code> - represents the main functions of
41 an audio device.
42 </li>
43 <li>
44 <code>hardware/libhardware/include/hardware/audio_policy.h</code> - represents the audio policy
45 manager, which handles things like audio routing and volume control policies.
46 </li>
47 <li>
48 <code>hardware/libhardware/include/hardware/audio_effect.h</code> - represents effects that can
49 be applied to audio such as downmixing, echo, or noise suppression.
50 </li>
51</ul>
52<p>See the implementation for the Galaxy Nexus at <code>device/samsung/tuna/audio</code> for an example.</p>
53
54<p>In addition to implementing the HAL, you need to create a
55 <code>device/&lt;company_name&gt;/&lt;device_name&gt;/audio/audio_policy.conf</code> file
56 that declares the audio devices present on your product. For an example, see the file for
57 the Galaxy Nexus audio hardware in <code>device/samsung/tuna/audio/audio_policy.conf</code>.
58Also, see
59 the <code>system/core/include/system/audio.h</code> and <code>system/core/include/system/audio_policy.h</code>
60 header files for a reference of the properties that you can define.
61</p>
62<h3 id="multichannel">Multi-channel support</h3>
63<p>If your hardware and driver supports multichannel audio via HDMI, you can output the audio stream
64 directly to the audio hardware. This bypasses the AudioFlinger mixer so it doesn't get downmixed to two channels.
65
66 <p>
67 The audio HAL must expose whether an output stream profile supports multichannel audio capabilities.
68 If the HAL exposes its capabilities, the default policy manager allows multichannel playback over
69 HDMI.</p>
70 <p>For more implementation details, see the
71<code>device/samsung/tuna/audio/audio_hw.c</code> in the Android 4.1 release.</p>
72
73 <p>
74 To specify that your product contains a multichannel audio output, edit the <code>audio_policy.conf</code> file to describe the multichannel
75 output for your product. The following is an example from the Galaxy Nexus that shows a "dynamic" channel mask, which means the audio policy manager
76 queries the actual channel masks supported by the HDMI sink after connection. You can also specify a static channel mask like <code>AUDIO_CHANNEL_OUT_5POINT1</code>
77 </p>
78<pre>
79audio_hw_modules {
80 primary {
81 outputs {
82 ...
83 hdmi {
84 sampling_rates 44100|48000
85 channel_masks dynamic
86 formats AUDIO_FORMAT_PCM_16_BIT
87 devices AUDIO_DEVICE_OUT_AUX_DIGITAL
88 flags AUDIO_OUTPUT_FLAG_DIRECT
89 }
90 ...
91 }
92 ...
93 }
94 ...
95}
96</pre>
97
98
99 <p>AudioFlinger's mixer downmixes the content to stereo
100 automatically when sent to an audio device that does not support multichannel audio.</p>
101</p>
102
103<h3 id="codecs">Media codecs</h3>
104
105<p>Ensure the audio codecs your hardware and drivers support are properly declared for your product. See
106 <a href="media.html#expose"> Exposing Codecs to the Framework</a> for information on how to do this.
107</p>
108
109<h2 id="configuring">
110 Configuring the shared library
111</h2>
112<p>
113 You need to package the HAL implementation into a shared library and copy it to the
114 appropriate location by creating an <code>Android.mk</code> file:
115</p>
116<ol>
117 <li>Create a <code>device/&lt;company_name&gt;/&lt;device_name&gt;/audio</code> directory
118 to contain your library's source files.
119 </li>
120 <li>Create an <code>Android.mk</code> file to build the shared library. Ensure that the
121 Makefile contains the following line:
122<pre>
123LOCAL_MODULE := audio.primary.&lt;device_name&gt;
124</pre>
125 <p>
126 Notice your library must be named <code>audio_primary.&lt;device_name&gt;.so</code> so
127 that Android can correctly load the library. The "<code>primary</code>" portion of this
128 filename indicates that this shared library is for the primary audio hardware located on the
129 device. The module names <code>audio.a2dp.&lt;device_name&gt;</code> and
130 <code>audio.usb.&lt;device_name&gt;</code> are also available for bluetooth and USB audio
131 interfaces. Here is an example of an <code>Android.mk</code> from the Galaxy
132 Nexus audio hardware:
133 </p>
134 <pre>
135LOCAL_PATH := $(call my-dir)
136
137include $(CLEAR_VARS)
138
139LOCAL_MODULE := audio.primary.tuna
140LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
141LOCAL_SRC_FILES := audio_hw.c ril_interface.c
142LOCAL_C_INCLUDES += \
143 external/tinyalsa/include \
144 $(call include-path-for, audio-utils) \
145 $(call include-path-for, audio-effects)
146LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils libdl
147LOCAL_MODULE_TAGS := optional
148
149include $(BUILD_SHARED_LIBRARY)
150</pre>
151 </li>
152 <li>If your product supports low latency audio as specified by the Android CDD, copy the
153 corresponding XML feature file into your product. For example, in your product's
154 <code>device/&lt;company_name&gt;/&lt;device_name&gt;/device.mk</code>
155 Makefile:
156 <pre>
157PRODUCT_COPY_FILES := ...
158
159PRODUCT_COPY_FILES += \
160frameworks/native/data/etc/android.android.hardware.audio.low_latency.xml:system/etc/permissions/android.hardware.audio.low_latency.xml \
161</pre>
162 </li>
163
164 <li>Copy the <code>audio_policy.conf</code> file that you created earlier to the <code>system/etc/</code> directory
165 in your product's <code>device/&lt;company_name&gt;/&lt;device_name&gt;/device.mk</code>
166 Makefile. For example:
167 <pre>
168PRODUCT_COPY_FILES += \
169 device/samsung/tuna/audio/audio_policy.conf:system/etc/audio_policy.conf
170</pre>
171 </li>
172 <li>Declare the shared modules of your audio HAL that are required by your product in the product's
173 <code>device/&lt;company_name&gt;/&lt;device_name&gt;/device.mk</code> Makefile. For example, the
174 Galaxy Nexus requires the primary and bluetooth audio HAL modules:
175<pre>
176PRODUCT_PACKAGES += \
177 audio.primary.tuna \
178 audio.a2dp.default
179</pre>
180 </li>
181</ol>
182
183<h2 id="preprocessing">Audio pre-processing effects</h2>
184<p>
185The Android platform provides audio effects on supported devices in the
186<a href="http://developer.android.com/reference/android/media/audiofx/package-summary.html">audiofx</a>
187package, which is available for developers to access. For example, on the Nexus 10, the following pre-processing effects are supported: </p>
188<ul>
189 <li><a
190href="http://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html">Acoustic Echo Cancellation</a></li>
191 <li><a
192href="http://developer.android.com/reference/android/media/audiofx/AutomaticGainControl.html">Automatic Gain Control</a></li>
193 <li><a
194href="http://developer.android.com/reference/android/media/audiofx/NoiseSuppressor.html">Noise Suppression</a></li>
195</ul>
196</p>
197
198
199<p>Pre-processing effects are always paired with the use case mode in which the pre-processing is requested. In Android
200app development, a use case is referred to as an <code>AudioSource</code>; and app developers
201request to use the <code>AudioSource</code> abstraction instead of the actual audio hardware device.
202The Android Audio Policy Manager maps an <code>AudioSource</code> to the actual hardware with <code>AudioPolicyManagerBase::getDeviceForInputSource(int
203inputSource)</code>. The following sources are exposed to developers:
204</p>
205<ul>
206<code><li>android.media.MediaRecorder.AudioSource.CAMCORDER</li></code>
207<code><li>android.media.MediaRecorder.AudioSource.VOICE_COMMUNICATION</li></code>
208<code><li>android.media.MediaRecorder.AudioSource.VOICE_CALL</li></code>
209<code><li>android.media.MediaRecorder.AudioSource.VOICE_DOWNLINK</li></code>
210<code><li>android.media.MediaRecorder.AudioSource.VOICE_UPLINK</li></code>
211<code><li>android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION</li></code>
212<code><li>android.media.MediaRecorder.AudioSource.MIC</li></code>
213<code><li>android.media.MediaRecorder.AudioSource.DEFAULT</li></code>
214</ul>
215
216<p>The default pre-processing effects that are applied for each <code>AudioSource</code> are
217specified in the <code>/system/etc/audio_effects.conf</code> file. To specify
218your own default effects for every <code>AudioSource</code>, create a <code>/system/vendor/etc/audio_effects.conf</code> file
219and specify any pre-processing effects that you need to turn on. For an example,
220see the implementation for the Nexus 10 in <code>device/samsung/manta/audio_effects.conf</code></p>
221
222<p class="warning"><strong>Warning:</strong> For the <code>VOICE_RECOGNITION</code> use case, do not enable
223the noise suppression pre-processing effect. It should not be turned on by default when recording from this audio source,
224and you should not enable it in your own audio_effects.conf file. Turning on the effect by default will cause the device to fail
225the <a href="/compatibility/index.html">compatibility requirement</a> regardless of whether this was on by default due to
226configuration file, or the audio HAL implementation's default behavior.</p>
227
228<p>The following example enables pre-processing for the VoIP <code>AudioSource</code> and Camcorder <code>AudioSource</code>.
229By declaring the <code>AudioSource</code> configuration in this manner, the
230framework will automatically request from the audio HAL the use of those
231effects.</p>
232
233<pre>
234pre_processing {
235 voice_communication {
236 aec {}
237 ns {}
238 }
239 camcorder {
240 agc {}
241 }
242}
243</pre>
244
245<h3 id="tuning">Source tuning</h3>
246<p>For <code>AudioSource</code> tuning, there are no explicit requirements on audio gain or audio processing
247with the exception of voice recognition (<code>VOICE_RECOGNITION</code>).</p>
248
249<p>The following are the requirements for voice recognition:</p>
250
251<ul>
252<li>"flat" frequency response (+/- 3dB) from 100Hz to 4kHz</li>
253<li>close-talk config: 90dB SPL reads RMS of 2500 (16bit samples)</li>
254<li>level tracks linearly from -18dB to +12dB relative to 90dB SPL</li>
255<li>THD < 1% (90dB SPL in 100 to 4000Hz range)</li>
256<li>8kHz sampling rate (anti-aliasing)</li>
257<li>Effects / pre-processing must be disabled by default</li>
258</ul>
259
260<p>Examples of tuning different effects for different sources are:</p>
261
262<ul>
263 <li>Noise Suppressor
264 <ul>
265 <li>Tuned for wind noise suppressor for <code>CAMCORDER</code></li>
266 <li>Tuned for stationary noise suppressor for <code>VOICE_COMMUNICATION</code></li>
267 </ul>
268 </li>
269 <li>Automatic Gain Control
270 <ul>
271 <li>Tuned for close-talk for <code>VOICE_COMMUNICATION</code> and main phone mic</li>
272 <li>Tuned for far-talk for <code>CAMCORDER</code></li>
273 </ul>
274 </li>
275</ul>
276
277<h3 id="more">More information</h3>
278<p>For more information, see:</p>
279<ul>
280<li>Android documentation for <a href="http://developer.android.com/reference/android/media/audiofx/package-summary.html">audiofx
281package</a>
282
283<li>Android documentation for <a href="http://developer.android.com/reference/android/media/audiofx/NoiseSuppressor.html">Noise Suppression audio effect</a></li>
284<li><code>device/samsung/manta/audio_effects.conf</code> file for the Nexus 10</li>
285</ul>