Android のオーディオ ハードウェア抽象化レイヤ(HAL)は、android.media の高レベルのオーディオ固有フレームワーク API を基盤となるオーディオ ドライバとハードウェアに接続します。このセクションでは、実装の手順とパフォーマンス改善のヒントについて説明します。
Android のオーディオ アーキテクチャでは、音声機能の実装方法の定義と、実装に関連するソースコードが示されます。
図 1. Android オーディオ アーキテクチャ
- アプリケーション フレームワーク
- アプリケーション フレームワークには、android.media API を利用してオーディオ ハードウェアと通信するアプリコードが含まれています。このコードは対応する JNI グルークラスを内部で呼び出して、オーディオ ハードウェアと通信するネイティブ コードにアクセスします。
- JNI
- 
android.mediaに関連づけられた JNI コードは、下位レベルのネイティブ コードを呼び出してオーディオ ハードウェアにアクセスします。JNI は frameworks/base/core/jni/とframeworks/base/media/jniにあります。
- ネイティブ フレームワーク
- 
ネイティブ フレームワークは、android.media パッケージに相当するネイティブのパッケージを提供し、Binder の IPC プロキシを呼び出して、メディア サーバーのオーディオ固有サービスにアクセスします。ネイティブ フレームワークのコードは frameworks/av/media/libmediaにあります。
- Binder IPC
- 
Binder の IPC プロキシにより、プロセスの境界を越える通信が容易になります。プロキシは frameworks/av/media/libmediaにあり、「I」の文字で始まります。
- メディア サーバー
- 
メディア サーバーにはオーディオ サービスが含まれています。このサービスは、HAL の実装と通信する実際のコードです。メディア サーバーは frameworks/av/services/audioflingerにあります。
- HAL
- 
HAL は、オーディオ サービスに呼び出される標準インターフェースを定義します。このインターフェースを、オーディオ ハードウェアが正しく機能するように実装する必要があります。詳細については、オーディオ HAL インターフェースと、対応する HAL バージョン ディレクトリの *.halファイル内のコメントをご覧ください。
- カーネル ドライバ
- 
オーディオ ドライバは、ハードウェアおよび HAL 実装と通信します。Advanced Linux Sound Architecture(ALSA)、Open Sound System(OSS)、カスタム ドライバを使用できます。HAL はドライバに依存しません。
注: ALSA を使用する場合、ライセンスに互換性がある(標準ユーザーモード ライブラリは GPL ライセンス)ことをふまえ、ドライバのユーザー部分には external/tinyalsaをおすすめします。
- Open SL ES をベースとした Android ネイティブ オーディオ(非表示)
- この API は、Android NDK の一部として公開されており、android.media と同じアーキテクチャ レベルにあたります。