Android のオーディオ ハードウェア アブストラクション レイヤー (HAL) は、 android.media
内の高レベルのオーディオ固有のフレームワーク API を、基盤となるオーディオ ドライバーとハードウェアに接続します。 Audio HAL は、オーディオ サービスが呼び出す標準インターフェースを定義します。オーディオ ハードウェアが正しく機能するには、これを実装する必要があります。
このページでは、オーディオ HAL の概要を説明し、その API と実装要件の詳細を提供します。
オーディオ HAL インターフェース
オーディオ HAL インターフェースは、次のように、 .hal
ファイルのHIDLと構成ファイルのXSDスキーマを使用して定義されます。
図 1.オーディオ HAL インターフェース
構成ファイル
オーディオ ポリシーとオーディオ エフェクトの XML 構成ファイルは、オーディオ HAL インターフェースの一部と見なされます。これらのファイルはスキーマに準拠する必要があり、準拠は VTS テストによって検証されます。
オーディオ HAL の実装の一部として、オーディオ トポロジを記述するオーディオ ポリシー構成ファイルを作成する必要があります。オーディオ HAL 機能は、フレームワークで使用するためにaudio_policy_configuration.xml
ファイルで宣言する必要があります。
オーディオ HAL API
オーディオ HAL には、次の API が含まれています。
- コア HAL
- エフェクト HAL
- 共通 HAL
これらの各 API については、次のセクションで説明します。
コア HAL
Core HAL は、AudioFlinger がオーディオを再生し、オーディオ ルーティングを制御するために使用するメイン API です。主要なインターフェイスの一部は次のとおりです。
-
IDeviceFactory.hal
は、API へのエントリ ポイントです。 -
IDevice.hal
とIPrimaryDevice.hal
には、setMasterVolume
やopenInputStream
などのメソッドが含まれています。 - ストリームは単方向であり、
IStream.hal
、IStreamOut.hal
、およびIStreamIn.hal
を介して HAL との間でオーディオを送受信するために AudioFlinger によって使用されます。
次の表に、便利な Core HAL コンポーネントの場所を示します。
コア HAL コンポーネント | 位置 |
---|---|
APIの最新バージョン | /hardware/interfaces/audio/6.0 |
最新の Core HAL API に固有のタイプ | /hardware/interfaces/audio/6.0/types.hal |
オーディオ ポリシー構成ファイルの XSD スキーマ | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd |
Core HAL API のデフォルト実装 ( /hardware/interfaces/audio/core/all-versions/default/
) は、従来の共有ライブラリを使用した、Treble 以前の HAL 実装のラッパーです。既定の実装は、カーネル ドライバーと直接対話するオーディオ HAL の新しいバージョンを実装する際の参照と見なすこともできます。
エフェクト HAL
Effects HAL API は、オーディオ エフェクトを制御するためにエフェクト フレームワークによって使用されます。 Effects HAL API を使用して、自動ゲイン制御やノイズ抑制などの前処理効果を構成することもできます。
次の表に、便利な Effects 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
Common HAL は、Core および Effects HAL API で使用される一般的なデータ型のライブラリです。データ構造のみを定義するため、インターフェイスや関連する VTS テストはありません。 Common HAL API には次のものが含まれます。
- Core および Effect API によって共有される定義 (
/hardware/interfaces/audio/common/6.0/types.hal
) - ユーティリティ (
/hardware/interfaces/audio/common/all-versions
) は、実装、クライアント、およびテスト用の HIDL API に対するコーディングを支援するために使用されます
要件
オーディオ HAL の実装とオーディオ ポリシー構成ファイルの作成に加えて、次の HAL 要件に従う必要があります。
- サウンド トリガーのキャプチャ (ホットワード DSP バッファーからのキャプチャ) が 1 つの入力プロファイルでサポートされている場合、実装は、サウンド トリガー HAL でサポートされている同時セッションの数に対応する、このプロファイルでアクティブなストリームの数をサポートする必要があります。
- 音声通話 TX とアプリケーション プロセッサからのキャプチャの同時実行は、同時キャプチャページで説明されています。
オーディオ HAL V7 の更新
下位互換性の問題に対処するために、Android 13 以降のすべての HAL の変更には Stable AIDL が必須です。
- フレームワークと HAL で使用されるデータ モデルを統合します。
- HIDL データ型(列挙型)とオーディオ ポリシーの構成に使用される XML スキーマとの重複を最小限に抑えます。
具体的には、オーディオ HAL V7 の次の領域で変更が加えられました。
これらの変更については、それぞれのセクションで詳しく説明します。
列挙
Audio HAL V7 以降、オーディオ ポリシー構成ファイルで使用される列挙型は XSD スキーマでのみ定義され、HIDL では定義されません。
オーディオ 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 で使用されるオーディオ ポリシー構成ファイルに変更が加えられました。
V7 では、標準の␣
(スペース) 文字を使用して、属性 (サンプリング レート、チャンネル マスク、フラグなど) の値リストを区切ります。 ,
(カンマ) と|
の代わりに。 (縦棒) V6 以前で使用される記号。次の例に示すように、 channelMasks
の値のリストを区切るためにスペースが使用されています。
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
シンボルを変更するには、 update_audio_policy_config.sh
という自動変換スクリプトを使用します。 V6 オーディオ ポリシー構成ファイルを Pixel 5 (Redfin) デバイス用の 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 インターフェースとタイプで<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 バージョン番号を示します。
アンドロイド版 | HAL バージョン |
---|---|
人造人間13号 | 7.1 |
人造人間12号 | 7.0 |
人造人間11号 | 6.0 |
アンドロイド 10 | 5.0 |
人造人間 9 | 4.0 |
人造人間8 | 2.0 |