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 格式的拓撲說明定義了連線限制。
- 支援 Include 可避免重複標準 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 硬體模組相對應的模組,其中每個模組都有混合埠、裝置埠和路徑清單:
- Mix 通訊埠說明瞭可在音訊 HAL 中開啟串流以播放和擷取串流的可能設定設定檔。
- 裝置連接埠:描述可連接的裝置及其類型 (以及選用的位址和音訊屬性,如果有相關資訊)。
- Routes 與混合通訊埠描述元件分開,可說明從裝置到裝置或從串流到裝置的路徑。
音量表是簡單的點清單,用於定義用來將 UI 索引轉換為以分貝為單位的音量曲線。獨立的 include 檔案會提供預設曲線,但特定用途和裝置類別的每個曲線皆可覆寫。
顯示磁碟區資料表範例
<?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 and Selection API,位於音訊修補程式/音訊連接埠基礎架構之上,可讓應用程式開發人員針對已連結的音訊記錄或音軌,指定特定裝置輸出或輸入的偏好設定。
在 Android 7.0 中,Enumeration API 和 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 的混合器傳送至不支援多聲道音訊的音訊裝置時,會自動將內容降噪為立體聲。
媒體轉碼器
請確認硬體和驅動程式支援的音訊編解碼器是否已正確宣告給產品。詳情請參閱「將編解碼公開給架構」。