オーディオHAL

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

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

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

audio_hal

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

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 以下では、HIDL インターフェースとタイプで<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 バージョン番号を示します。

アンドロイド版HAL バージョン
人造人間13号7.1
人造人間12号7.0
人造人間11号6.0
アンドロイド 10 5.0
人造人間 9 4.0
人造人間8 2.0