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檔案中聲明,框架才能使用它們。

音訊 HIDL HAL API

本節介紹 HIDL 的核心、效果和通用 HAL API。

核心HAL

使用 HIDL 的 Core HAL 的一些關鍵介面如下:

  • IDeviceFactory.hal是 API 的入口點。
  • IDevice.halIPrimaryDevice.hal包含setMasterVolumeopenInputStream等方法。
  • 流是單向的,AudioFlinger 使用它透過IStream.halIStreamOut.halIStreamIn.hal向 HAL 發送或接收音訊。

下表列出了有用的 Core 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/ ) 是使用舊共用程式庫的pre-Treble HAL 實作的包裝器。在實現直接與核心驅動程式互動的新版本音訊 HAL 時,預設實作也可以被視為參考。

效果哈爾

下表列出了使用 HIDL 的有用 Effects 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 和 Effect API 共享的定義 ( /hardware/interfaces/audio/common/6.0/types.hal )。
  • 實用程式 ( /hardware/interfaces/audio/common/all-versions ) 用於協助針對實作、用戶端和測試的 HIDL API 進行編碼。

音訊 HAL V7 更新

如本節所述,Android 12 中的音訊 HAL 版本 7 發生了重大變化。 Audio HAL V7 執行以下操作:

  • 統一框架和 HAL 使用的資料模型。
  • 最大限度地減少 HIDL 資料類型(枚舉)和用於音訊策略配置的 XML 架構之間的重複。

具體而言,Audio HAL V7 在以下方面進行了更改:

這些變更將在各自的部分中進行更詳細的討論。

列舉

從音訊 HAL V7 開始,音訊策略設定檔中使用的枚舉類型僅在 XSD 架構中定義,而不是在 HIDL 中定義。

在 Audio HAL V6 中, types.hal中的枚舉類型(如AudioFormat )的值也在音訊策略設定檔 XSD 架構中定義,從而建立重複。為了在 V7 中避免這種情況,枚舉類型會變更為string ,並且所有可能的枚舉值都列在 XSD 架構中。

圖 2 比較了 V7 中AudioFormat枚舉類型的一些變化:

audioformat-change

圖 2.AudioFormat列舉的一些變更的比較。

已轉換為string的 enum 類型請參閱以下清單:

  • 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。

在 V7 中,標準 (空格)字元用於分隔屬性中的值列表(如取樣率、通道遮罩和標誌),而不是, (逗號)和| (垂直線)V6 及以下版本所使用的符號。如以下範例所示,空格用於分隔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 介面和類型中經常使用<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中的聯合

供應商標籤

除了設備類型和格式之外,供應商還可以為音軌元資料新增自訂標籤。

對於播放和記錄軌道元數據,供應商可以傳遞自己的標籤,這些標籤用於將屬性添加到音訊 I/O 串流,從應用程式到 HAL。

新增播放軌道元資料的供應商標籤,如下例所示:

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

RecordTrackMetadata結構透過添加特定於記錄軌道元資料的標籤以類似的方式實現。

供應商擴展命名空間

從 HAL V7 開始,供應商擴充需要額外的{vendor}前綴,而 V6 中不需要。為了使{vendor}前綴有效,它必須是三個或更多字母數字字元。

在V7中使用以下格式:

VX_{ vendor }_{ letters/numbers }

以下是有效 V7 供應商擴展的一些範例:

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

版本資訊

下表列出了每個 Android 版本的 HAL 版本號:

安卓版本HIDL HAL 版本
安卓13 7.1
安卓12 7.0
安卓11 6.0
安卓10 5.0
安卓9 4.0
安卓8 2.0