設定音訊政策

Android 10 版本大幅重構音訊政策管理員,提供更多彈性,支援複雜的車輛用途:

  • 原始設備製造商 (OEM) 專屬的轉送策略。
  • 可自訂音量群組,適用於使用相同音量曲線的舊版串流類型群組。
  • 由音訊政策引擎宣告的轉送策略,而非硬式編碼。
  • 音量曲線和群組由音訊政策引擎管理。
  • 內部重構作業,為日後常見程式碼和可設定程式碼之間的分割作業做準備,並提供更豐富的音訊裝置管理功能。舉例來說,政策規則會使用所有裝置屬性,而不只是裝置類型。

Android 7.0 導入音訊政策設定檔格式 (XML),用於說明音訊拓撲。

在先前的 Android 版本中,必須使用 device/<company>/<device>/audio/audio_policy.conf 宣告產品上的音訊裝置 (您可以在 device/samsung/tuna/audio/audio_policy.conf 中查看 Galaxy Nexus 音訊硬體的檔案範例)。不過,CONF 是簡單的專有格式,無法描述電視和汽車等垂直領域的複雜拓撲。

Android 7.0 已淘汰 audio_policy.conf,並支援使用 XML 檔案格式定義音訊拓撲。這種格式更易於閱讀,且有各種編輯和剖析工具,彈性也足以描述複雜的音訊拓撲。Android 7.0 使用 USE_XML_AUDIO_POLICY_CONF 建構標記,選擇設定檔的 XML 格式。

XML 格式的優點

如同 CONF 檔案,XML 檔案可定義輸出和輸入串流設定檔的數量和類型、可用於播放和擷取的裝置,以及音訊屬性。此外,XML 格式還提供下列強化功能:

  • 在 Android 10 中,系統允許同時執行多個錄音應用程式。
    • 系統絕不會因並行情況而拒絕開始錄製。
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) 回呼會通知用戶端擷取路徑異動。
  • 在下列情況下,用戶端會取得無聲音訊樣本:
    • 隱私權敏感的應用情境 (例如 VOICE_COMMUNICATION) 處於啟用狀態。
    • 用戶端沒有前景服務或前景 UI。
    • 政策會辨識以下特殊角色:
      • 無障礙服務:即使隱私權敏感用途處於啟用狀態,仍可錄製。
      • Google 助理:如果 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 索引轉換為分貝音量的曲線。個別的 include 檔案會提供預設曲線,但特定用途和裝置類別的每條曲線都可以覆寫。

檔案包含項目

XML 併入 (XInclude) 方法可用於併入其他 XML 檔案中的音訊政策設定資訊。所有檔案都必須遵循上述結構,並符合下列限制:

  • 檔案只能包含頂層元素。
  • 檔案不得包含 XInclude 元素。

使用 include 可避免將標準 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包含下列模組。

Module 說明
/managerdefault 包括所有應用程式通用的泛型介面和行為實作。與 AudioPolicyManager.cpp 類似,但引擎功能和常見概念已抽象化。
/common 定義基本類別 (例如輸入/輸出音訊串流設定檔、音訊裝置描述元、音訊修補程式和音訊通訊埠的資料結構)。這項功能先前是在 AudioPolicyManager.cpp 內定義。
/engine

實作規則,定義特定用途應使用的裝置和音量。這個介面會實作標準介面和泛型部分,例如取得適用於特定播放或擷取用途的裝置,或是設定連線裝置或外部狀態 (即強制使用的通話狀態),這些設定可能會改變轉送決策。

提供兩種版本:「可設定」和「預設」。 如要瞭解如何選取版本,請參閱「使用參數架構進行設定」。

/engineconfigurable 依賴參數架構的政策引擎實作 (請參閱下文)。設定以參數架構為準,且政策是由 XML 檔案定義。
/enginedefault 根據先前的 Android Audio Policy Manager 實作項目實作政策引擎。這是預設值,包含與 Nexus 和 Android 開放原始碼計畫實作項目對應的硬式編碼規則。
/service 包括繫結器介面、執行緒和鎖定實作,以及架構其餘部分的介面。

使用參數架構進行設定

音訊政策程式碼經過整理,方便您瞭解及維護,同時也支援完全由設定檔定義的音訊政策。機構和音訊政策設計是根據 Intel 的參數架構,這是一種以外掛程式和規則為基礎的參數處理架構。

使用可設定的音訊政策,供應商 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 檔案中選取。如要選取可設定的音訊政策引擎,請將 globalConfiguration 元素的 engine_library 屬性值設為 configurable,如下列範例所示:

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

音訊政策轉送 API

Android 6.0 推出公開的列舉和選取 API,位於音訊修補程式/音訊連接埠基礎架構頂端,可讓應用程式開發人員指出連線音訊記錄或音軌的特定裝置輸出或輸入偏好設定。

在 Android 7.0 中,CTS 測試會驗證 Enumeration and Selection API,並擴充此 API,納入原生 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 的混音器會自動將內容下混至立體聲。

媒體轉碼器

確認硬體和驅動程式支援的音訊轉碼器已為產品正確宣告。詳情請參閱「向架構公開轉碼器」。