設定音訊政策

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 格式中,拓撲說明會定義連線限制。
  • 支援includes 可避免重複標準 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 中開啟的串流可能設定檔,用於播放和擷取。
  • 裝置連接埠:說明可連接的裝置類型 (以及選用的位址和音訊屬性,如果適用)。
  • Routes 與混合通訊埠描述項分開,可說明裝置間或串流至裝置的路徑。

音量表是簡單的點清單,用於定義用來將 UI 索引轉換為以分貝為單位的音量曲線。單獨的包含檔案會提供預設曲線,但可覆寫特定用途和裝置類別的每個曲線。

檔案加入

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 的組織包含下列模組。

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 推出了公開的 Enumeration 和 Selection API,位於音訊修補/音訊埠基礎架構之上,可讓應用程式開發人員針對已連結的音訊記錄或音軌,指定特定裝置輸出或輸入的偏好設定。

在 Android 7.0 中,Enumeration 和 Selection API 會經過 CTS 測試驗證,並擴充為納入原生 C/C++ (OpenSL ES) 音訊串流的路由。原生串流的路由仍會在 Java 中執行,但會新增 AudioRouting 介面,取代、結合及淘汰 AudioTrackAudioRecord 類別專用的明確路由方法。

如要進一步瞭解 Enumeration 和 Selection 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 的混合器傳送至不支援多聲道音訊的音訊裝置時,會自動將內容降噪為立體聲。

媒體轉碼器

請確認硬體和驅動程式支援的音訊編解碼器是否已正確宣告給產品。詳情請參閱「將編解碼公開給架構」。