Android 13 以前では、オーディオ HAL インターフェイスは、次に示すように、HIDL HAL ファイル (拡張子.hal
) のHIDLと構成ファイルのXSDスキーマを使用して定義されます。
図 1.オーディオ HAL インターフェイス。
設定ファイル
オーディオ ポリシーおよびオーディオ エフェクト XML 構成ファイルは、Audio HIDL HAL インターフェイスの一部とみなされます。これらのファイルはスキーマに準拠する必要があり、その準拠性は VTS テストによって検証されます。
オーディオ HIDL HAL の実装の一環として、オーディオ トポロジを記述するオーディオ ポリシー構成ファイルを作成する必要があります。オーディオ HAL 機能をフレームワークで使用するには、 audio_policy_configuration.xml
ファイルで宣言する必要があります。
オーディオ HIDL HAL API
このセクションでは、HIDL のコア、エフェクト、および共通 HAL API について説明します。
コア HAL
HIDL を使用する Core HAL の主要なインターフェイスの一部は次のとおりです。
-
IDeviceFactory.hal
は API へのエントリ ポイントです。 -
IDevice.hal
およびIPrimaryDevice.hal
には、setMasterVolume
やopenInputStream
などのメソッドが含まれています。 - ストリームは単方向であり、AudioFlinger によって
IStream.hal
、IStreamOut.hal
、およびIStreamIn.hal
を通じて HAL との間でオーディオを送受信するために使用されます。
次の表に、有用なコア HAL HIDL コンポーネントの場所を示します。
コア 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 |
Core HAL API のデフォルト実装 ( /hardware/interfaces/audio/core/all-versions/default/
) は、レガシー共有ライブラリを使用した、Treble 以前の HAL 実装のラッパーです。デフォルトの実装は、カーネル ドライバーと直接対話するオーディオ HAL の新しいバージョンを実装する際の参照としても考慮できます。
エフェクト HAL
次の表に、HIDL を使用した便利なエフェクト HAL コンポーネントの場所を示します。
エフェクト HAL コンポーネント | 位置 |
---|---|
APIの最新バージョン | /hardware/interfaces/audio/effect/6.0/ |
エフェクト設定ファイル XSD スキーマ | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
詳細については、 /hardware/interfaces/audio/effect/all-versions/default/
にあるエフェクト HAL API のサンプル実装と「オーディオ エフェクト」セクションを参照してください。
一般的な HAL
HIDL を使用する共通 HAL API には次のものが含まれます。
- Core API と Effect API によって共有される定義 (
/hardware/interfaces/audio/common/6.0/types.hal
)。 - ユーティリティ (
/hardware/interfaces/audio/common/all-versions
) は、実装、クライアント、テスト用の HIDL API に対するコーディングを支援するために使用されます。
オーディオ HAL V7 のアップデート
このセクションで説明するように、Android 12 のオーディオ HAL バージョン 7 には重要な変更があります。オーディオ HAL V7 は次のことを行います。
- フレームワークと HAL で使用されるデータ モデルを統合します。
- HIDL データ型 (列挙型) とオーディオ ポリシーの構成に使用される XML スキーマの間の重複を最小限に抑えます。
具体的には、Audio HAL V7 では次の領域が変更されています。
これらの変更については、それぞれのセクションで詳しく説明します。
列挙
Audio HAL V7 以降、オーディオ ポリシー構成ファイルで使用される列挙型は、HIDL ではなく XSD スキーマでのみ定義されます。
Audio HAL V6 では、 types.hal
の列挙型 ( AudioFormat
など) の値もオーディオ ポリシー構成ファイル XSD スキーマで定義されており、重複が作成されます。 V7 ではこれを回避するために、列挙型がstring
に変更され、代わりにすべての可能な列挙値が XSD スキーマにリストされます。
図 2 は、V7 でのAudioFormat
列挙型への変更の一部を比較しています。
図 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 以前では、 <format, sampling rate, channel mask>
の 3 つが HIDL インターフェイスとタイプでよく使用されます。この冗長性を削除するために、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
の共用体を置き換えます
ベンダータグ
デバイスのタイプと形式に加えて、ベンダーはオーディオ トラックのメタデータのカスタム タグを追加できます。
トラックのメタデータを再生および録音するために、ベンダーはオーディオ I/O ストリームに属性を追加するために使用される独自のタグをアプリから HAL に渡すことができます。
次の例に示すように、再生トラックのメタデータのベンダー タグが追加されます。
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
RecordTrackMetadata
構造は、録音トラックのメタデータに固有のタグを追加することによって、同様の方法で実装されます。
ベンダー拡張の名前空間
HAL V7 以降、ベンダー拡張機能には追加の{vendor}
プレフィックスが必要ですが、V6 では必要ありません。 {vendor}
プレフィックスを有効にするには、3 文字以上の英数字である必要があります。
V7 では次の形式を使用します。
VX_{ vendor }_{ letters/numbers }
以下に、有効な V7 ベンダー拡張機能の例をいくつか示します。
-
VX_ GOOGLE _VR
-
VX_ QCI _AMBIENT_MIC
バージョン情報
次の表に、各 Android リリースの HAL バージョン番号を示します。
Android版 | HIDL HAL バージョン |
---|---|
アンドロイド13 | 7.1 |
アンドロイド12 | 7.0 |
アンドロイド11 | 6.0 |
アンドロイド10 | 5.0 |
アンドロイド9 | 4.0 |
アンドロイド8 | 2.0 |