在 Android 13 以下版本中,音訊 HAL 介面是使用 HIDL 在 HIDL HAL 檔案 (副檔名為 .hal
) 和設定檔的 XSD 結構定義中定義,如下所示。
圖 1. 音訊 HAL 介面。
設定檔
音訊政策和音訊效果 XML 設定檔會視為音訊 HIDL HAL 介面的一部分。這些檔案必須符合結構定義,且一致性會透過 VTS 測試驗證。
實作音訊 HIDL HAL 時,您必須建立音訊政策設定檔,說明音訊拓撲。音訊 HAL 功能必須在 audio_policy_configuration.xml
檔案中宣告,架構才能使用這些功能。
音訊 HIDL HAL API
本節說明 HIDL 的 Core、Effects 和 Common HAL API。
核心 HAL
以下是使用 HIDL 的 Core HAL 主要介面:
IDeviceFactory.hal
是 API 的進入點。IDevice.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。- 串流是單向的,AudioFlinger 會透過
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
,將音訊傳送至 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/
) 的預設實作項目是使用舊版共用程式庫,包裝 Treble 前的 HAL 實作項目。實作與核心驅動程式直接互動的新版 Audio HAL 時,也可以將預設實作視為參考資料。
Effects 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/
的 Effects HAL API 範例實作,以及「音效」一節。
通用 HAL
使用 HIDL 的 Common HAL API 包含下列項目:
- 核心和效果 API 共用的定義 (
/hardware/interfaces/audio/common/6.0/types.hal
)。 - 公用程式 (
/hardware/interfaces/audio/common/all-versions
) 用於協助針對實作項目、用戶端和測試的 HIDL API 進行編碼。
音訊 HAL V7 更新
Android 12 的 Audio HAL 第 7 版有重大變更,詳情請參閱本節。音訊 HAL V7 會執行下列作業:
- 統一架構和 HAL 使用的資料模型。
- 盡量減少 HIDL 資料型別 (列舉) 與用於音訊政策設定的 XML 結構定義之間的重複項目。
具體來說,音訊 HAL V7 的變更如下:
各節會詳細說明這些變更。
列舉
從 Audio HAL V7 開始,音訊政策設定檔中使用的列舉型別只會在 XSD 架構中定義,不會在 HIDL 中定義。
在 Audio HAL V6 中,音訊政策設定檔 XSD 結構定義也會定義 types.hal
中的列舉型別值 (例如 AudioFormat
),造成重複定義。為避免 V7 發生這種情況,列舉型別已變更為 string
,且所有可能的列舉值都會列在 XSD 結構定義中。
圖 2 比較第 7 版中 AudioFormat
列舉型別的部分變更:
圖 2. 比較 AudioFormat 列舉的部分變更。
如要查看已轉換為 string
的列舉型別,請參閱下列清單:
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
中的聯集
供應商代碼
除了裝置類型和格式,供應商還可為音軌中繼資料新增自訂標記。
如要播放及錄製曲目中繼資料,供應商可以從應用程式將自己的標記傳遞至 HAL,這些標記可用於在音訊 I/O 串流中新增屬性。
系統會新增播放軌中繼資料的供應商標記,如下列範例所示:
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 版本號碼:
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 |