Android のオーディオ Hardware Abstraction Layer(HAL)は、android.media
の高レベルのオーディオ固有フレームワーク API を、基盤となるオーディオ ドライバおよびハードウェアに接続します。オーディオ HAL は、オーディオ サービスに呼び出される標準インターフェースを定義します。このインターフェースを、オーディオ ハードウェアが正しく機能するように実装する必要があります。
このページでは、オーディオ HAL の概要と、その API と実装要件の詳細について説明します。
オーディオ HAL インターフェース
オーディオ HAL インターフェースは、以下のように、.hal
ファイルの HIDL と構成ファイルの XSD スキーマを使用して定義されます。
図 1. オーディオ HAL インターフェース
構成ファイル
オーディオ ポリシーとオーディオ エフェクトの XML 構成ファイルは、オーディオ HAL インターフェースの一部と見なされます。これらのファイルはスキーマを遵守している必要があり、適合性は VTS テストによって検証されます。
オーディオ HAL の実装の一環として、オーディオ トポロジを記述しているオーディオ ポリシー構成ファイルを作成する必要があります。フレームワークでオーディオ HAL 機能を使用するには、audio_policy_configuration.xml
ファイルでオーディオ HAL 機能を宣言する必要があります。
オーディオ HAL API
オーディオ HAL には、次の API が含まれています。
- コア HAL
- エフェクト HAL
- 共通 HAL
それぞれの API については、次のセクションで説明します。
コア HAL
コア HAL は、AudioFlinger でオーディオを再生し、オーディオ ルーティングを制御するために使用されるメインの API です。主なインターフェースの一部を以下に示します。
IDeviceFactory.hal
は、API のエントリ ポイントです。IDevice.hal
とIPrimaryDevice.hal
には、setMasterVolume
やopenInputStream
などのメソッドが含まれます。- ストリームは単方向であり、AudioFlinger で
IStream.hal
、IStreamOut.hal
、IStreamIn.hal
を介して HAL との間でオーディオを送受信するために使用します。
有用なコア HAL コンポーネントの場所の一覧を次の表に示します。
コア HAL コンポーネント | 場所 |
---|---|
最新バージョンの API | /hardware/interfaces/audio/6.0
|
最新のコア HAL API に固有のタイプ | /hardware/interfaces/audio/6.0/types.hal
|
オーディオ ポリシー構成ファイルの XSD スキーマ | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
コア HAL API(/hardware/interfaces/audio/core/all-versions/default/
)のデフォルト実装は、従来の共有ライブラリを使用した Treble 以前の HAL 実装のラッパーです。カーネル ドライバを直接操作する新しいバージョンのオーディオ HAL を実装する際は、デフォルトの実装をリファレンスと見なすこともできます。
エフェクト HAL
エフェクト HAL API は、エフェクト フレームワークでオーディオ エフェクトを制御するために使用されます。また、エフェクト HAL API を介して、自動ゲイン コントロールやノイズ キャンセレーションなどの前処理エフェクトを構成することもできます。
有用なエフェクト HAL コンポーネントの場所の一覧を次の表に示します。
エフェクト HAL コンポーネント | 場所 |
---|---|
最新バージョンの API | /hardware/interfaces/audio/effect/6.0/
|
エフェクト構成ファイルの XSD スキーマ | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
詳細については、エフェクト HAL API(/hardware/interfaces/audio/effect/all-versions/default/
)のサンプル実装とオーディオ エフェクトのセクションをご覧ください。
共通 HAL
共通 HAL は、コア HAL API とエフェクト HAL API で使用される共通のデータ型のライブラリです。データ構造を定義するだけであるため、インターフェースがなく、関連する VTS テストもありません。共通 HAL API には以下が含まれます。
- コア API とエフェクト API で共有される定義(
/hardware/interfaces/audio/common/6.0/types.hal
) - 実装、クライアント、テストのための HIDL API のコーディングに役立つユーティリティ(
/hardware/interfaces/audio/common/all-versions
)
要件
オーディオ HAL の実装とオーディオ ポリシー構成ファイルの作成に加えて、次の HAL の要件を遵守する必要があります。
- 入力プロファイルでサウンド トリガーのキャプチャ(起動ワード DSP バッファからのキャプチャ)がサポートされている場合、サウンド トリガー HAL でサポートされる同時セッションの数に対応したこのプロファイルのアクティブ ストリームの数を実装でサポートしている。
- 同時キャプチャに関するページに詳しく記載されている、アプリ プロセッサからの音声通話 TX とキャプチャの同時進行。
オーディオ HAL V7 の更新
下位互換性の問題に対応するため、Android 13 以降、すべての HAL の変更に安定版 AIDL が必須となっています。Android 13 以降での AIDL の導入をサポートおよび強化するために、オーディオ HAL V7 では次のことを行っています。
- フレームワークと HAL で使用されるデータモデルを統合します。
- HIDL データ型(列挙型)と、オーディオ ポリシー構成で使用される XML スキーマとの間の重複を最小限に抑えます。
具体的には、オーディオ HAL V7 の次の領域に変更が加えられます。
これらの変更については、それぞれ対応するセクションで詳しく説明します。
列挙型
オーディオ HAL V7 以降、オーディオ ポリシー構成ファイルで使用される列挙型は、HIDL ではなく XSD スキーマでのみ定義されます。
オーディオ HAL V6 では、types.hal
の列挙型の値(AudioFormat
など)もオーディオ ポリシー構成ファイルの XSD スキーマで定義されるため、重複が発生します。V7 でこれを回避するために、列挙型が string
に変更され、使用可能なすべての列挙値が代わりに XSD スキーマに一覧表示されます。
V7 の AudioFormat
列挙型に対するいくつかの変更の比較については、図 2 をご覧ください。
図 2. AudioFormat 列挙型のいくつかの変更の比較
String
に変換された列挙型については、次のリストをご覧ください。
AudioChannelMask
AudioContentType
AudioDevice
: ベンダー拡張可能AudioFormat
: ベンダー拡張可能AudioGainMode
AudioSource
AudioStreamType
AudioUsage
文字列列挙型の値を渡す
文字列値は、HAL インターフェースの境界をまたいで列挙値として情報を転送するために使用されます。フレームワークと HAL ラッパーはどちらもビジネス ロジックを実装するために整数列挙値を使用し、図 3 に示す変換方法を使用します。
図 3. 文字列列挙型の値を渡す
たとえば、オーディオ形式タイプの値をフレームワークからベンダーに渡すには、次のようにします。
AudioFormat
の列挙値は、libaudiohal
の文字列値に変換され、HAL に渡されます。- HAL 側では、デフォルト ラッパーが文字列を列挙値に変換し、その値はレガシー HAL に渡されます。
XML スキーマの変更
XML スキーマ定義(XSD)に列挙値の完全なリストがあると、VTS によるオーディオ ポリシー構成の XML ファイル検証を改善できます。XSD を遵守するために、HAL V7 で使用されるオーディオ ポリシー構成ファイルが変更されました。
属性の値のリスト(サンプリング レート、チャンネル マスク、フラグなど)を区切るために、V6 以前では ,
(カンマ)と |
(縦棒)を使用していましたが、V7 では標準の ␣
(スペース)文字を使用します。次の例のように、スペースを使用して、channelMasks
の値のリストを区切ります。
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
記号を変更するには、update_audio_policy_config.sh
という自動変換スクリプトを使用します。Pixel 5(Redfin)デバイスの V6 オーディオ ポリシー構成ファイルを V7 バージョンに変換するには、次のコマンドを参照してください。
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
データ型
一部のデータ構造は、重複する定義を最小限に抑えるために V7 で再定義されています。繰り返されるデータアイテムのタプルは、再利用可能な構造にグループ化されます。これらのデータ構造では、安全なユニオンなどの最新の HIDL 機能が使用されています。
たとえば、V6 以前では、HIDL インターフェースと型で 3 つ一組の <format, sampling rate, channel mask>
がよく使用されます。この冗長性を排除するために、V7 では AudioConfigBase
データ型とその他のデータ型が次のように定義されます。
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
AudioConfig
、AudioOffloadInfo
、AudioPortConfig
で使用するAudioProfile := <format, {sampling rates}, {channel masks}>
AudioPort/PortConfig
のルーズなコレクションを置き換えるAudioPortExtendedInfo := device | mix | session
AudioPort/PortConfig
のユニオンを置き換える
ベンダータグ
ベンダーは、デバイスのタイプと形式に加えて、音声トラック メタデータのカスタムタグを追加できます。
再生と録音のトラック メタデータの場合、ベンダーは独自のタグを渡すことができます。このタグは、アプリから HAL へのオーディオ I/O ストリームに属性を追加するために使用されます。
再生トラック メタデータのベンダータグは、次の例のように追加されます。
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
RecordTrackMetadata
構造は、録音トラック メタデータに固有のタグを追加することにより、同様の方法で実装されます。
ベンダー拡張機能の名前空間
HAL V7 以降、ベンダー拡張機能には V6 では不要な追加の {vendor}
プレフィックスが必要です。{vendor}
プレフィックスを有効にするには、3 文字以上の英数字である必要があります。
V7 では次の形式を使用します。
VX_{vendor}_{letters/numbers}
有効な V7 ベンダー拡張機能の例を以下に示します。
- VX_GOOGLE_VR
- VX_QCI_AMBIENT_MIC
バージョン情報
各 Android リリースの HAL バージョン番号の一覧を次の表に示します。
Android のバージョン | HAL バージョン |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |