blob: 82a3886d5053481cd7e6dae609aca2fc785ff158 [file] [log] [blame]
page.title=Audio
@jd:body
<!--
Copyright 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<img style="float: right; margin: 0px 15px 15px 15px;"
src="images/ape_fwk_hal_audio.png" alt="Android Audio HAL icon"/>
<p>
Android's audio Hardware Abstraction Layer (HAL) connects the higher-level,
audio-specific framework APIs in <a href="http://developer.android.com/reference/android/media/package-summary.html">android.media</a> to the underlying audio driver and
hardware. This section includes implementation instructions and tips for
improving performance.
</p>
<h2 id="Architecture">Audio Architecture</h2>
<p>
Android audio architecture defines how audio functionality is implemented and
points to the relevant source code involved in the implementation.
</p>
<img src="images/ape_fwk_audio.png" alt="Audio architecture" id="figure1" />
<p class="img-caption">
<strong>Figure 1.</strong> Android audio architecture
</p>
<dl>
<dt>
Application framework
</dt>
<dd>
The application framework includes the app code, which uses the <a href="http://developer.android.com/reference/android/media/package-summary.html">android.media</a> APIs to
interact with audio hardware. Internally, this code calls corresponding JNI glue
classes to access the native code that interacts with audio hardware.
</dd>
<dt>
JNI
</dt>
<dd>
The JNI code associated with <a href="http://developer.android.com/reference/android/media/package-summary.html">android.media</a> calls lower level native code to access audio
hardware. JNI is located in <code>frameworks/base/core/jni/</code> and
<code>frameworks/base/media/jni</code>.
</dd>
<dt>
Native framework
</dt>
<dd>
The native framework provides a native equivalent to the <a href="http://developer.android.com/reference/android/media/package-summary.html">android.media</a> package, calling
Binder IPC proxies to access the audio-specific services of the media server.
Native framework code is located in <code>frameworks/av/media/libmedia</code>.
</dd>
<dt>
Binder IPC
</dt>
<dd>
Binder IPC proxies facilitate communication over process boundaries. Proxies are
located in <code>frameworks/av/media/libmedia</code> and begin with the letter
"I".
</dd>
<dt>
Media server
</dt>
<dd>
The media server contains audio services, which are the actual code that
interacts with your HAL implementations. The media server is located in
<code>frameworks/av/services/audioflinger</code>.
</dd>
<dt>
HAL
</dt>
<dd>
The HAL defines the standard interface that audio services call into and that
you must implement for your audio hardware to function correctly. The audio HAL
interfaces are located in <code>hardware/libhardware/include/hardware</code>.
For details, see <a
href="{@docRoot}devices/halref/audio_8h_source.html">hardware/audio.h</a>.
</dd>
<dt>
Kernel driver
</dt>
<dd>
The audio driver interacts with your hardware and HAL implementation. You can
use Advanced Linux Sound Architecture (ALSA), Open Sound System (OSS), or a
custom driver (HAL is driver-agnostic).
<p class="note"><strong>Note</strong>: If you use ALSA, we recommend
<code>external/tinyalsa</code> for the user portion of the driver because of its
compatible licensing (the standard user-mode library is GPL-licensed).</p>
</dd>
<dt>
Android native audio based on Open SL ES <em>(not shown)</em>
</dt>
<dd>
This API is exposed as part of
<a href="https://developer.android.com/tools/sdk/ndk/index.html">Android NDK</a>
and is at the same architecture level as
<a href="http://developer.android.com/reference/android/media/package-summary.html">android.media</a>.
</dd>
</dl>