Android 的音頻硬件抽象層 (HAL) 將android.media
中更高級別的音頻特定框架 API 連接到底層音頻驅動程序和硬件。 Audio HAL 定義了音頻服務調用的標準接口。必須實施它才能使音頻硬件正常工作。
此頁面概述了音頻 HAL,並提供了其 API 和實現要求的詳細信息。
音頻 HAL 接口
音頻 HAL 接口是使用.hal文件中的.hal
和配置文件的XSD架構定義的,如下所示。
圖 1.音頻 HAL 接口
配置文件
音頻策略和音頻效果 XML 配置文件被視為音頻 HAL 接口的一部分。這些文件必須符合其架構,並且符合性通過 VTS 測試進行驗證。
作為實現音頻 HAL 的一部分,您必須創建描述音頻拓撲的音頻策略配置文件。必須在audio_policy_configuration.xml
文件中聲明音頻 HAL 功能,以便框架使用它們。
音頻 HAL API
音頻 HAL 包含以下 API:
- 核心 HAL
- 效果 HAL
- 普通 HAL
以下部分介紹了這些 API 中的每一個。
核心 HAL
Core HAL 是 AudioFlinger 用來播放音頻和控制音頻路由的主要 API。部分關鍵接口如下:
-
IDeviceFactory.hal
是 API 的入口點。 -
IDevice.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。 - 流是單向的,AudioFlinger 使用流通過
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
向 HAL 發送或接收音頻。
下表列出了有用的核心 HAL 組件的位置。
核心 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 時,也可以將默認實現視為參考。
效果 HAL
效果框架使用 Effects HAL API 來控制音頻效果。您還可以通過 Effects HAL API 配置自動增益控制和噪聲抑制等預處理效果。
下表列出了有用的 Effects HAL 組件的位置。
效果 HAL 組件 | 地點 |
---|---|
最新版本的 API | /hardware/interfaces/audio/effect/6.0/ |
效果配置文件 XSD 架構 | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
有關詳細信息,請參閱 Effects HAL API ( /hardware/interfaces/audio/effect/all-versions/default/
) 和音頻效果部分的示例實現。
普通 HAL
Common HAL 是 Core 和 Effects HAL API 使用的通用數據類型庫。它沒有接口,也沒有關聯的 VTS 測試,因為它只定義數據結構。通用 HAL API 包含以下內容:
- 核心和效果 API 共享的定義 (
/hardware/interfaces/audio/common/6.0/types.hal
) - 實用程序 (
/hardware/interfaces/audio/common/all-versions
) 用於幫助針對實現、客戶端和測試的 HIDL API 進行編碼
要求
除了實現音頻 HAL 和創建音頻策略配置文件之外,還必須遵守以下 HAL 要求:
- 如果一個輸入配置文件支持 Sound Trigger 的捕獲(從啟動指令 DSP 緩衝區捕獲),則實現必須支持此配置文件上的活動流的數量,該數量與 Sound Trigger HAL 支持的並發會話數相對應。
- 語音呼叫 TX 的並發性和來自應用程序處理器的捕獲,詳見並發捕獲頁面。
音頻 HAL V7 的更新
為了解決向後兼容性問題,從 Android T 開始的所有 HAL 更改都必須使用穩定 AIDL。為了支持和增強 Android T 及更高版本中的 AIDL 採用,Audio HAL V7 執行以下操作:
- 統一框架和 HAL 使用的數據模型。
- 最大限度地減少 HIDL 數據類型(枚舉)和用於音頻策略配置的 XML 架構之間的重複。
具體來說,音頻 HAL V7 中的以下方面進行了更改:
這些更改在其各自的部分中進行了更詳細的討論。
枚舉
從 Audio HAL V7 開始,音頻策略配置文件中使用的枚舉類型僅在 XSD 架構中定義,而不在 HIDL 中定義。
在音頻 HAL V6 中, types.hal
中的枚舉類型(如AudioFormat
)的值也在音頻策略配置文件 XSD 架構中定義,從而創建了一個副本。為了避免在 V7 中出現這種情況,枚舉類型被更改為string
,並且所有可能的枚舉值都列在 XSD 模式中。
有關 V7 中AudioFormat
枚舉類型的一些更改的比較,請參見圖 2 。
圖 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 及更低版本中,在 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_谷歌_VR
- VX_ QCI _AMBIENT_MIC
版本信息
下表列出了每個 Android 版本的 HAL 版本號。
安卓版 | 哈爾版 |
---|---|
安卓 12 | 7.0 |
安卓 11 | 6.0 |
安卓 10 | 5.0 |
安卓 9 | 4.0 |
安卓 8 | 2.0 |