HIDL オーディオ HAL

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

audio_hal

図 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には、 setMasterVolumeopenInputStreamなどのメソッドが含まれています。
  • ストリームは単方向であり、AudioFlinger によってIStream.halIStreamOut.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列挙型への変更の一部を比較しています。

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 ファイルの検証が向上します。 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]>

    AudioConfigAudioOffloadInfoAudioPortConfigによって使用されます

  • 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