Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

音声

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 インターフェースは、hardware/libhardware/include/hardware にあります。詳しくは audio.h をご覧ください。
カーネル ドライバ
オーディオ ドライバは、ハードウェアおよび HAL 実装と通信します。Advanced Linux Sound Architecture(ALSA)、Open Sound System(OSS)、カスタム ドライバを使用できます。HAL はドライバに依存しません。

: ALSA を使用する場合、ライセンスに互換性がある(標準ユーザーモード ライブラリは GPL ライセンス)ことをふまえ、ドライバのユーザー部分には external/tinyalsa をおすすめします。

Open SL ES をベースとした Android ネイティブ オーディオ(非表示)
この API は、Android NDK の一部として公開されており、android.media と同じアーキテクチャ レベルにあたります。