音頻 HAL

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

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

音頻 HAL 接口

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

audio_hal

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

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中的聯合

供應商標籤

除了設備類型和格式之外,供應商還可以為音軌元數據添加自定義標籤。

對於播放和錄製軌道元數據,供應商可以將他們自己的標籤(用於向音頻 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