音頻 HAL

Android 的音頻硬件抽象層 (HAL) 將android.media中的高級音頻特定框架 API 連接到底層音頻驅動程序和硬件。音頻 HAL 定義了音頻服務調用的標準接口。必須實現它才能使音頻硬件正常運行。

本頁概述了音頻 HAL,並提供了其 API 和實現要求的詳細信息。

音頻 HAL 接口

音頻 HAL 接口是使用.hal文件中的.hal和配置文件的XSD架構定義的,如下所示。

audio_hal

圖 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.halIPrimaryDevice.hal包含setMasterVolumeopenInputStream等方法。
  • 流是單向的,AudioFlinger 使用流通過IStream.halIStreamOut.halIStreamIn.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。

audioformat-change

圖 2.對 AudioFormat 枚舉的一些更改的比較

已轉換為String的枚舉類型請參考以下列表:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice :供應商可擴展
  • AudioFormat :供應商可擴展
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

傳遞字符串枚舉值

字符串值用於跨 HAL 接口邊界將信息作為枚舉值傳輸。框架和 HAL 包裝器都使用整數枚舉值來實現業務邏輯,並採用圖 3中描述的轉換方法。

audio-passing-values

圖 3.傳遞字符串枚舉值

例如,要將音頻格式類型的值從框架傳遞給供應商:

  1. AudioFormat的枚舉值在libaudiohal中轉換為字符串值並傳遞給 HAL。
  2. 在 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]>

    AudioConfigAudioOffloadInfoAudioPortConfig

  • 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