オーディオ HAL

Android のオーディオ Hardware Abstraction Layer(HAL)は、android.media の高レベルのオーディオ固有フレームワーク API を、基盤となるオーディオ ドライバおよびハードウェアに接続します。オーディオ HAL は、オーディオ サービスに呼び出される標準インターフェースを定義します。このインターフェースを、オーディオ ハードウェアが正しく機能するように実装する必要があります。

このページでは、オーディオ HAL の概要と、その API と実装要件の詳細について説明します。

オーディオ HAL インターフェース

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

audio_hal

図 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.halIPrimaryDevice.hal には、setMasterVolumeopenInputStream などのメソッドが含まれます。
  • ストリームは単方向であり、AudioFlinger で IStream.halIStreamOut.halIStreamIn.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 をご覧ください。

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 で使用されるオーディオ ポリシー構成ファイルが変更されました。

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