在 Android 13 及更低版本中,音訊 HAL 介面是使用 HIDL HAL 檔案(副檔名為.hal
)中的HIDL和設定檔的XSD架構定義的,如下所示。
圖 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.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。 - 流是單向的,AudioFlinger 使用它透過
IStream.hal
、IStreamOut.hal
和IStreamIn.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
枚舉類型的一些變化:
圖 2.AudioFormat列舉的一些變更的比較。
已轉換為string
的 enum 類型請參閱以下清單:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
:供應商可擴展 AudioFormat
:供應商可擴展AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
傳遞字串枚舉值
字串值用於跨 HAL 介面邊界傳輸作為枚舉值的資訊。該框架和 HAL 包裝器都使用整數枚舉值來實現業務邏輯,並採用圖 3所示的轉換方法:
圖 3.傳遞字串枚舉值。
例如,要將音訊格式類型的值從框架傳遞給供應商:
-
AudioFormat
的枚舉值在libaudiohal
中轉換為字串值並傳遞給 HAL。 - 在 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]>
由
AudioConfig
、AudioOffloadInfo
、AudioPortConfig
使用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 |