HIDL オーディオ HAL

Android 13 以前では、オーディオ HAL インターフェースは以下のように HIDL HAL ファイル(拡張子 .hal)の HIDL と構成ファイルの XSD スキーマを使用して、定義されます。

audio_hal

図 1. オーディオ HAL インターフェース

構成ファイル

オーディオ ポリシーとオーディオ エフェクトの XML 構成ファイルは、オーディオ HIDL HAL インターフェースの一部と見なされます。これらのファイルはスキーマを遵守している必要があり、適合性は VTS テストによって検証されます。

オーディオ HIDL HAL の実装の一環として、オーディオ トポロジを記述しているオーディオ ポリシー構成ファイルを作成する必要があります。フレームワークでオーディオ HAL 機能を使用するには、audio_policy_configuration.xml ファイルでオーディオ HAL 機能を宣言する必要があります。

オーディオ HIDL HAL API

このセクションでは、HIDL のコア、エフェクト、共通 HAL API について説明します。

コア HAL

HIDL を使用したコア HAL の主要なインターフェースには次のものがあります。

  • IDeviceFactory.hal は、API のエントリ ポイントです。
  • IDevice.halIPrimaryDevice.hal には、setMasterVolumeopenInputStream などのメソッドが含まれます。
  • ストリームは単方向であり、AudioFlinger で IStream.halIStreamOut.halIStreamIn.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

コア 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 には以下が含まれます。

  • コア API とエフェクト API で共有される定義(/hardware/interfaces/audio/common/6.0/types.hal
  • 実装、クライアント、テストのための HIDL API のコーディングに役立つユーティリティ(/hardware/interfaces/audio/common/all-versions

オーディオ HAL V7 のアップデート

このセクションで説明するとおり、Android 12 ではオーディオ HAL のバージョン 7 に大幅な変更が加えられています。オーディオ HAL V7 は次のことを行います。

  • フレームワークと HAL で使用されるデータモデルを統合します。
  • HIDL データ型(列挙型)と、オーディオ ポリシー構成で使用される XML スキーマとの間の重複を最小限に抑えます。

具体的には、オーディオ HAL V7 の次の領域に変更が加えられます。

これらの変更については、それぞれ対応するセクションで詳しく説明します。

列挙型

オーディオ HAL V7 以降、オーディオ ポリシー構成ファイルで使用される列挙型は、HIDL ではなく XSD スキーマでのみ定義されます。

オーディオ HAL V6 では、types.hal の列挙型の値(AudioFormat など)もオーディオ ポリシー構成ファイルの XSD スキーマで定義されるため、重複が発生しています。V7 でこれを回避するために、列挙型が string に変更され、使用可能なすべての列挙値が代わりに XSD スキーマで定義されるようになります。

図 2 では V7 の AudioFormat 列挙型に加えられた変更の一部を比較しています。

audioformat-change

図 2. AudioFormat 列挙型に加えられた変更の一部の比較

string に変換された列挙型については、次のリストをご覧ください。

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: ベンダー拡張可能
  • AudioFormat: ベンダー拡張可能
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

文字列列挙型の値を渡す

文字列値は、HAL インターフェースの境界をまたいで列挙値として情報を転送するために使用されます。フレームワークと HAL ラッパーはどちらもビジネス ロジックを実装するために整数列挙値を使用し、図 3 に示す変換方法を使用します。

audio-passing-values

図 3. 文字列列挙型の値を渡す

たとえば、オーディオ形式タイプの値をフレームワークからベンダーに渡すには、次のようにします。

  1. AudioFormat の列挙値は、libaudiohal の文字列値に変換され、HAL に渡されます。
  2. HAL 側では、デフォルト ラッパーが文字列を列挙値に変換し、その値はレガシー HAL に渡されます。

XML スキーマの変更

XML スキーマ定義(XSD)に列挙値の完全なリストがあると、適切に VTS によるオーディオ ポリシー構成の XML ファイル検証ができるようになります。HAL V7 で使用されるオーディオ ポリシー構成ファイルを変更して、XSD を遵守できるようにしました。

属性の値のリスト(サンプリング レート、チャンネル マスク、フラグなど)を区切るために、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]>

    AudioConfigAudioOffloadInfoAudioPortConfig で使用する

  • 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 バージョン HIDL 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