HIDL 音訊 HAL

在 Android 13 以下版本中,音訊 HAL 介面 在 HIDL HAL 檔案中使用 HIDL (具有 擴充功能 .hal) 和 XSD 結構定義: 設定檔,如下所示

Audio_hal

圖 1. 音訊 HAL 介面。

設定檔

音訊政策和音效 XML 設定檔皆視為 「音訊 HIDL HAL」介面的一部分這些檔案必須符合其架構,且 並經過 VTS 測試驗證

實作音訊 HIDL HAL 時,您必須建立 音訊政策設定檔 則用於描述音訊拓撲必須在 audio_policy_configuration.xml 檔案,供架構使用。

音訊 HIDL HAL API

本節說明 HIDL 適用的核心、效果和通用 HAL API。

核心 HAL

使用 HIDL 的核心 HAL 的主要介面如下:

  • IDeviceFactory.hal 是 API 的進入點。
  • IDevice.halIPrimaryDevice.hal 包含如 setMasterVolumeopenInputStream
  • 串流為單向性質,AudioFlinger 會使用串流來傳送或接收 透過 IStream.halIStreamOut.halIStreamIn.hal

下表列出實用核心 HAL HIDL 元件的位置:

核心 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/) 是以使用 BERT 模型 (Treble HAL) 實作的包裝函式 舊版的共用資料庫。 預設導入作業也可視為參考 導入能與核心驅動程式互動的音訊 HAL

效果 HAL

下表列出使用 Effects HAL 元件的實用位置 HIDL:

效果 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 的 Common HAL API 包含下列項目:

  • 定義 (/hardware/interfaces/audio/common/6.0/types.hal) 共用者 包括 Core 和 Effect API
  • 用於協助的公用程式 (/hardware/interfaces/audio/common/all-versions) 針對實作、用戶端和測試等 HIDL API 編寫程式碼

音訊 HAL V7 更新

下列中的音訊 HAL 版本有重大異動: 本節所述的 Android 12。 音訊 HAL V7 會執行以下動作:

  • 統合架構和 HAL 使用的資料模型。
  • 盡量減少 HIDL 資料類型 (列舉) 和 XML 結構定義之間的重複情形 用於音訊政策設定。

具體而言,您會在音訊 HAL V7 的下列部分進行變更:

我們會在各自的章節中詳細討論這些異動。

列舉

自音訊 HAL V7 起,音訊政策設定中使用的列舉類型 只有在 XSD 結構定義中定義,而不是在 HIDL 中定義。

在音訊 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. 傳送字串列舉值。

例如,如要將音訊格式類型的值從架構傳遞給 供應商:

  1. AudioFormat 的列舉值會轉換為 libaudiohal 並傳遞至 HAL。
  2. 在 HAL 端,預設包裝函式會將字串轉換為列舉值 值,傳遞至舊版 HAL。
,瞭解如何調查及移除這項存取權。

XML 架構變更

在 XML 結構定義定義 (XSD) 中提供列舉值的完整清單, ,協助 VTS 改善音訊政策設定 XML 檔案驗證。我們 配合 HAL V7 所使用的音訊政策設定檔變更 XSD。

在 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> 的三倍。 通常用於 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 中的聯集

供應商代碼

除了裝置類型和格式外,供應商還可新增音訊自訂標記 曲目中繼資料

針對播放和錄音曲目的中繼資料,供應商可以傳送自己的代碼、 以便將屬性從應用程式新增至 HAL 音訊 I/O 串流

播放曲目中繼資料的供應商標記新增如下 範例:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

RecordTrackMetadata 結構的實作方式與 新增錄音軌中繼資料專用的標記。

供應商額外資訊名稱使用速度

自 HAL V7 起,供應商擴充功能需要額外的 {vendor} 前置字元 不需要進行大量通訊{vendor} 前置字元必須有效, 三個以上的英數字元。

請在 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 版