Android 的音頻硬件抽象層 (HAL) 將android.media
中的高級音頻特定框架 API 連接到底層音頻驅動程序和硬件。音頻 HAL 定義了音頻服務調用的標準接口。必須實現它才能使音頻硬件正常運行。
本頁概述了音頻 HAL,並提供了其 API 和實現要求的詳細信息。
音頻 HAL 接口
音頻 HAL 接口是使用.hal文件中的.hal
和配置文件的XSD架構定義的,如下所示。
圖 1.音頻 HAL 接口
配置文件
音頻策略和音頻效果 XML 配置文件被視為音頻 HAL 接口的一部分。這些文件必須符合它們的模式,並且一致性由 VTS 測試驗證。
作為實施音頻 HAL 的一部分,您必須創建描述音頻拓撲的音頻策略配置文件。音頻 HAL 功能必須在audio_policy_configuration.xml
文件中聲明,以便框架使用它們。
音頻 HAL API
音頻 HAL 包含以下 API:
- 核心硬件
- 效果器 HAL
- 普通硬件
這些 API 中的每一個都在以下部分中進行了描述。
核心硬件
Core HAL 是 AudioFlinger 用來播放音頻和控制音頻路由的主要 API。部分關鍵接口如下:
-
IDeviceFactory.hal
是 API 的入口點。 -
IDevice.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。 - 流是單向的,AudioFlinger 使用流通過
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
向 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
效果框架使用效果 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 |
有關詳細信息,請參閱效果 HAL API ( /hardware/interfaces/audio/effect/all-versions/default/
) 的示例實現和音頻效果部分。
普通硬件
通用 HAL 是核心和效果 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 13 開始的所有 HAL 更改都必須使用穩定的 AIDL。為了支持和增強 AIDL 在 Android 13 及更高版本中的採用,音頻 HAL V7 執行以下操作:
- 統一框架和 HAL 使用的數據模型。
- 最大限度地減少 HIDL 數據類型(枚舉)和用於音頻策略配置的 XML 架構之間的重複。
具體來說,在音頻 HAL V7 中有以下幾個方面的變化:
這些更改將在各自的部分中進行更詳細的討論。
枚舉
從音頻 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
中的聯合
供應商標籤
除了設備類型和格式之外,供應商還可以為音軌元數據添加自定義標籤。
對於播放和錄製軌道元數據,供應商可以將他們自己的標籤從應用程序傳遞到 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 版本號。
安卓版 | 硬件版本 |
---|---|
安卓 13 | 7.1 |
安卓 12 | 7.0 |
安卓 11 | 6.0 |
安卓 10 | 5.0 |
安卓9 | 4.0 |
安卓8 | 2.0 |