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 檔案。
顯示 Android 12 的音訊政策範例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<globalConfiguration speaker_drc_enabled="true"/>
<modules>
<module name="primary" halVersion="3.0">
<attachedDevices>
<item>Speaker</item>
<item>Earpiece</item>
<item>Built-In Mic</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="primary input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000 16000 48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Earpiece" sources="primary output"/>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Wired Headset" sources="primary output"/>
<route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
</routes>
</module>
<xi:include href="a2dp_audio_policy_configuration.xml"/>
</modules>
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
顯示 Android 12 以下版本的音訊政策範例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<globalConfiguration speaker_drc_enabled="true"/>
<modules>
<module name="primary" halVersion="3.0">
<attachedDevices>
<item>Speaker</item>
<item>Earpiece</item>
<item>Built-In Mic</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="primary input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
<devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,16000,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO"/>
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Earpiece" sources="primary output"/>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Wired Headset" sources="primary output"/>
<route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/>
</routes>
</module>
<xi:include href="a2dp_audio_policy_configuration.xml"/>
</modules>
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
頂層結構包含與每個音訊 HAL 硬體模組相對應的模組,其中每個模組都有混合埠、裝置埠和路徑清單:
- 混合通訊埠會說明可在音訊 HAL 中開啟的串流可能設定檔,用於播放和擷取。
- 裝置連接埠:說明可連接的裝置類型 (以及選用的位址和音訊屬性,如果適用)。
- Routes 與混合通訊埠描述項分開,可說明裝置間或串流至裝置的路徑。
音量表是簡單的點清單,用於定義用來將 UI 索引轉換為以分貝為單位的音量曲線。單獨的包含檔案會提供預設曲線,但可覆寫特定用途和裝置類別的每個曲線。
顯示音量表格範例
<?xml version="1.0" encoding="UTF-8"?>
<volumes>
<reference name="FULL_SCALE_VOLUME_CURVE">
<point>0,0</point>
<point>100,0</point>
</reference>
<reference name="SILENT_VOLUME_CURVE">
<point>0,-9600</point>
<point>100,-9600</point>
</reference>
<reference name="DEFAULT_VOLUME_CURVE">
<point>1,-4950</point>
<point>33,-3350</point>
<point>66,-1700</point>
<point>100,0</point>
</reference>
</volumes>
顯示卷數範例
<?xml version="1.0" encoding="UTF-8"?>
<volumes>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER">
<point>1,-5500</point>
<point>20,-4300</point>
<point>86,-1200</point>
<point>100,0</point>
</volume>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/>
</volumes>
檔案加入
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
介面,取代、結合及淘汰 AudioTrack
和 AudioRecord
類別專用的明確路由方法。
如要進一步瞭解 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 匯流主機支援的頻道遮罩。
顯示 HDMI 裝置設定範例
<module name="primary" halVersion="2.0">
<attachedDevices>
<item>Speaker</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" />
<mixPort name="tunnel" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" />
</mixPorts>
<devicePorts>
<devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" />
<devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink"
encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" />
</devicePorts>
<routes>
<route type="mix" sink="Speaker" sources="primary output"/>
<route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/>
</routes>
</module>
您也可以指定靜態管道遮罩,例如 AUDIO_CHANNEL_OUT_5POINT1
。當 AudioFlinger 的混合器傳送至不支援多聲道音訊的音訊裝置時,會自動將內容降噪為立體聲。
媒體轉碼器
請確認硬體和驅動程式支援的音訊編解碼器是否已正確宣告給產品。詳情請參閱「將編解碼公開給架構」。