在 Android 13 以下版本中,音訊 HAL 介面
在 HIDL HAL 檔案中使用 HIDL (具有
擴充功能 .hal
) 和
XSD 結構定義:
設定檔,如下所示
圖 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.hal
和IPrimaryDevice.hal
包含如setMasterVolume
或openInputStream
。- 串流為單向性質,AudioFlinger 會使用串流來傳送或接收
透過
IStream.hal
、IStreamOut.hal
和IStreamIn.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. 傳送字串列舉值。
例如,如要將音訊格式類型的值從架構傳遞給 供應商:
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
。請參閱下列指令來轉換 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 版 |