音声

Android オーディオ HAL アイコン

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 と同じアーキテクチャ レベルにあたります。