配置音頻策略

Android 10 版本包括對音頻策略管理器的重大重構,以提供更大的靈活性來支持複雜的汽車用例:

  • OEM 特定的路由策略。
  • 使用相同體積曲線的傳統流類型組的可定制體積組。
  • 由音頻策略引擎聲明而不是硬編碼的路由策略。
  • 由音頻策略引擎管理的音量曲線和組。
  • 內部重構為未來在通用代碼和可配置代碼之間的拆分做準備,並提供更豐富的音頻設備管理。例如,在策略規則中使用所有設備屬性而不僅僅是其類型。

Android 7.0 引入了音頻策略配置文件格式 (XML) 來描述您的音頻拓撲。

使用所需的先前的Android釋放device/<company>/<device>/audio/audio_policy.conf申報音頻設備提出關於您的產品(可以看到此文件在Galaxy Nexus的音頻硬件的示例device/samsung/tuna/audio/audio_policy.conf )。然而,CONF 是一種簡單的專有格式,其局限性太大,無法描述電視和汽車等垂直領域的複雜拓撲。

安卓7.0棄用audio_policy.conf和使用的XML文件格式,更可讀的,具有廣泛的編輯和分析工具,而且具有足夠的靈活性來描述複雜的音頻拓撲定義的音頻拓撲增加了支持。安卓7.0使用USE_XML_AUDIO_POLICY_CONF構建標誌選擇的配置文件的XML格式。

XML 格式的優點

與 CONF 文件一樣,XML 文件可以定義輸出和輸入流配置文件的數量和類型、可用​​於播放和捕獲的設備以及音頻屬性。此外,XML 格式提供以下增強功能:

  • 在 Android 10 中,允許同時使用多個活動錄音應用。
    • 記錄開始永遠不會因為並發情況而被拒絕。
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb)的捕獲路徑變化回調通知客戶端。
  • 在以下情況下,客戶端會獲取靜音音頻樣本:
    • 甲隱私敏感的用例(例如, VOICE_COMMUNICATION )被激活。
    • 客戶端沒有前台服務或前台 UI。
    • 特殊角色被政策認可:
      • 輔助功能服務:即使隱私敏感用例處於活動狀態,也可以進行記錄。
      • 助手:如果 UI 位於頂部,則視為隱私敏感。
  • 音頻配置文件具有類似於 HDMI 簡單音頻描述符的結構,可為每種音頻格式啟用一組不同的採樣率/通道掩碼。
  • 設備和流之間的所有可能的連接都有明確的定義。以前,隱式規則可以將所有設備連接到同一個 HAL 模塊,防止音頻策略控制使用音頻補丁 API 請求的連接。在 XML 格式中,拓撲描述定義了連接限制。
  • 為支持包括避免重複標準A2DP,USB,或重新路由提交的定義。
  • 音量曲線是可定制的。以前,卷表是硬編碼的。在 XML 格式中,描述了體積表並且可以自定義。

在模板frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml顯示了許多在使用這些功能。

文件格式和位置

新的音頻策略配置文件是audio_policy_configuration.xml ,位於/system/etc 。以下示例顯示了適用於 Android 12 和 Android 12 以下版本的 XML 文件格式的簡單音頻策略配置。

頂層結構包含與每個音頻 HAL 硬件模塊對應的模塊,其中每個模塊都有一個混合端口、設備端口和路由的列表:

  • 混合端口描述,可以在音頻HAL打開回放和捕獲流可能的配置文件。
  • 設備端口描述了可以與他們的類型(和任選的地址和音頻屬性,如果相關)被附接的設備。
  • 路由從混音端口描述符分離,使路由從設備到設備或流至設備的描述。

音量表是簡單的點列表,用於定義用於從 UI 索引轉換為以 dB 為單位的音量的曲線。單獨的包含文件提供默認曲線,但可以覆蓋給定用例和設備類別的每條曲線。

文件包含

XML 包含 (XInclude) 方法可用於包含位於其他 XML 文件中的音頻策略配置信息。所有包含的文件都必須遵循上述結構,但有以下限制:

  • 文件只能包含頂級元素。
  • 文件不能包含 XInclude 元素。

使用包含避免將標準的 Android 開源項目 (AOSP) 音頻 HAL 模塊配置信息複製到所有音頻策略配置文件(容易出錯)。為以下音頻 HAL 提供了標準音頻策略配置 XML 文件:

  • A2DP: a2dp_audio_policy_configuration.xml
  • 重路由子混音: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

音頻政策代碼組織

AudioPolicyManager.cpp被分成幾個模塊,使其易於維護和配置。組織frameworks/av/services/audiopolicy包括以下模塊。

模塊描述
/managerdefault包括所有應用程序通用的通用接口和行為實現。類似AudioPolicyManager.cpp發動機的功能和常用的概念抽象出來。
/common定義基類(例如,輸入輸出音頻流配置文件、音頻設備描述符、音頻補丁和音頻端口的數據結構)。這是以前中定義AudioPolicyManager.cpp
/engine

實施定義給定用例應使用哪些設備和卷的規則。它實現了通用部分的標準接口,例如為給定的播放或捕獲用例獲取適當的設備,或者設置可以更改路由的連接設備或外部狀態(即強制使用的調用狀態)決定。

有兩個版本:配置默認。有關如何選擇版本的信息,請參閱配置使用的參數框架

/engineconfigurable依賴於參數框架的策略引擎實現(見下文)。配置基於參數框架,策略由 XML 文件定義。
/enginedefault基於以前的 Android 音頻策略管理器實現的策略引擎實現。這是默認設置,包括與 Nexus 和 AOSP 實現相對應的硬編碼規則。
/service包括綁定器接口、線程和鎖定實現以及框架其餘部分的接口。

使用參數框架配置

音頻策略代碼的組織使其易於理解和維護,同時還支持完全由配置文件定義的音頻策略。組織和音頻策略設計基於英特爾的參數框架,這是一個基於插件和規則的參數處理框架。

使用可配置的音頻策略使供應商 OEM 能夠:

  • 用 XML 描述系統的結構及其參數。
  • 編寫(在 C++ 中)或重用後端(插件)來訪問描述的參數。
  • 定義(以 XML 或特定領域的語言)條件/規則,在這些條件/規則上,給定的參數必須採用給定的值。

AOSP包括使用參數框架在音頻策略配置文件的一個示例Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml 。有關詳細信息,請參考Intel的文檔參數框架

在Android的10或更低,可配置的音頻策略是使用編譯選項選擇USE_CONFIGURABLE_AUDIO_POLICY 。在Android的11或更高,音頻策略引擎的版本中選擇audio_policy_configuration.xml文件。要選擇配置的音頻策略引擎,設置的值engine_library的屬性globalConfiguration元素configurable ,如下面的例子:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

音頻策略路由 API

Android 6.0 引入了一個公共枚舉和選擇 API,它位於音頻補丁/音頻端口基礎架構之上,並允許應用程序開發人員為連接的音頻記錄或音軌指示特定設備輸出或輸入的偏好。

在 Android 7.0 中,Enumeration and Selection API 通過 CTS 測試進行驗證,並擴展為包括本地 C/C++ (OpenSL ES) 音頻流的路由。原生流的路由繼續在Java中做,加上一個的AudioRouting接口用以取代,聯合收割機,並棄用一項包含具體的顯式路由方法AudioTrackAudioRecord類。

有關枚舉和選擇API的詳細信息,請參閱Android的配置界面OpenSLES_AndroidConfiguration.h 。有關音頻路由的詳細信息,請參閱AudioRouting

多渠道支持

如果您的硬件和驅動程序通過 HDMI 支持多聲道音頻,您可以將音頻流直接輸出到音頻硬件(這會繞過 AudioFlinger 混音器,因此它不會被縮混到兩個聲道。)音頻 HAL 必須公開輸出流配置文件是否支持多聲道音頻功能。如果 HAL 公開其功能,則默認策略管理器允許通過 HDMI 進行多通道播放。對於實施細節,請參見device/samsung/tuna/audio/audio_hw.c

要指定您的產品包含多聲道音頻輸出,請編輯音頻策略配置文件以描述產品的多聲道輸出。從下面的例子中frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml示出了動態信道掩模,這意味著音頻策略管理器將查詢連接之後,由HDMI接收所支持的信道的掩模。

您還可以指定一個靜態信道屏蔽,如AUDIO_CHANNEL_OUT_5POINT1 。當發送到不支持多聲道音頻的音頻設備時,AudioFlinger 的混音器會自動將內容縮混為立體聲。

媒體編解碼器

確保為您的產品正確聲明了您的硬件和驅動程序支持的音頻編解碼器。有關詳細信息,請參閱暴露編解碼器的框架