Android 10 版本對音頻策略管理器進行了重大重構,以提供更大的靈活性來支持複雜的汽車用例:
- OEM 特定的路由策略。
- 使用相同音量曲線的傳統流類型組的可自定義音量組。
- 由音頻策略引擎聲明的路由策略,而不是硬編碼。
- 由音頻策略引擎管理的音量曲線和組。
- 內部重構為未來通用代碼和可配置代碼之間的拆分做準備,並提供更豐富的音頻設備管理。例如,使用所有設備屬性,而不僅僅是策略規則中的類型。
Android 7.0 引入了一種音頻策略配置文件格式 (XML) 來描述您的音頻拓撲。
以前的 Android 版本需要使用device/<company>/<device>/audio/audio_policy.conf
來聲明產品上存在的音頻設備(您可以在device/samsung/tuna/audio/audio_policy.conf
中查看 Galaxy Nexus 音頻硬件的此文件示例device/samsung/tuna/audio/audio_policy.conf
)。然而,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。
- 特殊角色受政策認可:
- 可訪問性服務:即使隱私敏感的用例處於活動狀態,也可以記錄。
- 助理:如果 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 文件格式的簡單音頻策略配置。
顯示 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 索引轉換為以 dB 為單位的音量的曲線的簡單點列表。單獨的包含文件提供默認曲線,但可以覆蓋給定用例和設備類別的每條曲線。
顯示卷表示例
<?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 元素。
使用 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
的組織包括以下模塊。
模塊 | 描述 |
---|---|
/managerdefault | 包括所有應用程序通用的通用接口和行為實現。類似於AudioPolicyManager.cpp ,引擎功能和通用概念被抽像出來。 |
/common | 定義基類(例如,輸入輸出音頻流配置文件、音頻設備描述符、音頻補丁和音頻端口的數據結構)。這是之前在AudioPolicyManager.cpp 中定義的。 |
/engine | 實施用於定義給定用例應使用哪些設備和卷的規則。它使用通用部分實現標準接口,例如為給定的播放或捕獲用例獲取適當的設備,或者設置可以改變路由的連接設備或外部狀態(即強制使用的呼叫狀態)決定。 提供兩個版本:可配置的和默認的。有關如何選擇版本的信息,請參閱使用參數框架進行配置。 |
/engineconfigurable | 依賴於參數框架的策略引擎實現(見下文)。配置基於參數框架,其中策略由 XML 文件定義。 |
/enginedefault | 基於之前的 Android Audio Policy Manager 實現的策略引擎實現。這是默認設置,包括與 Nexus 和 AOSP 實現相對應的硬編碼規則。 |
/service | 包括綁定器接口、線程和鎖定實現以及與框架其餘部分的接口。 |
使用參數框架進行配置
音頻策略代碼的組織使其易於理解和維護,同時還支持完全由配置文件定義的音頻策略。組織和音頻策略設計基於英特爾的參數框架,這是一個基於插件和基於規則的框架,用於處理參數。
使用可配置的音頻策略使供應商 OEM 能夠:
- 用 XML 描述系統的結構及其參數。
- 編寫(在 C++ 中)或重用後端(插件)來訪問所描述的參數。
- 定義(在 XML 或特定領域的語言中)給定參數必須採用給定值的條件/規則。
AOSP 在Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml
中包含一個使用參數框架的音頻策略配置文件示例。有關詳細信息,請參閱有關參數框架的英特爾文檔。
在 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 中,枚舉和選擇 API 由 CTS 測試驗證,並被擴展為包括原生 C/C++ (OpenSL ES) 音頻流的路由。原生流的路由繼續在 Java 中完成,並添加了一個AudioRouting
接口,該接口取代、組合和棄用了特定於AudioTrack
和AudioRecord
類的顯式路由方法。
有關枚舉和選擇 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 的混音器會自動將內容縮混為立體聲。
媒體編解碼器
確保為您的產品正確聲明了您的硬件和驅動程序支持的音頻編解碼器。有關詳細信息,請參閱向框架公開編解碼器。