Android 10 版本對音訊策略管理器進行了重大重構,以提供更大的靈活性來支援複雜的汽車用例:
- OEM 特定的路由策略。
- 使用相同音量曲線的傳統串流類型群組的可自訂音量群組。
- 由音訊策略引擎聲明的路由策略而不是硬編碼。
- 由音訊策略引擎管理的音量曲線和群組。
- 內部重構為未來通用程式碼和可設定程式碼之間的劃分做好準備,並提供更豐富的音訊設備管理。例如,在策略規則中使用所有設備屬性而不僅僅是其類型。
Android 7.0 引入了音訊策略設定檔格式 (XML) 來描述音訊拓撲。
先前的 Android 版本需要使用device/<company>/<device>/audio/audio_policy.conf
來聲明產品上存在的音訊裝置(您可以在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 上開啟以進行播放和擷取的串流的可能設定檔。
- 設備連接埠描述了可以連接的設備及其類型(以及可選的位址和音訊屬性,如果相關的話)。
- 路由與混合端口描述符分離,從而能夠描述從設備到設備或流到設備的路由。
音量表是定義用於從 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 包含 (XInclusion) 方法可用於包含位於其他 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 音訊策略管理器實作。這是預設設置,包括與 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,該 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 的混音器會自動將內容縮混為立體聲。
媒體編解碼器
確保為您的產品正確聲明了您的硬體和驅動程式支援的音訊編解碼器。有關詳細信息,請參閱向框架公開編解碼器。