汽車音訊服務使用 Core Audio 動態音訊策略來促進汽車中的使用案例。
為每位乘客單獨播放音頻,稱為多區域音頻,其中每個區域都允許同時播放聲音。
動態音訊區域配置。
乘客主要區域音頻廣播。
乘客的音頻鏡。
在每個用例中,汽車音訊服務使用動態音訊策略自動將音訊路由到指定的輸出裝置。
多區域音訊
多區域音訊使多個使用者能夠同時與 AAOS 互動。一組輸出設備與一個區域關聯,每個區域維護音訊焦點和音量等級。乘客可以收聽自己的音頻,而駕駛員可以收聽主要區域(通常是主艙)中的另一個來源。
多區域音訊架構
圖 1.汽車音訊服務架構。
汽車音訊區域是音訊輸出、音訊焦點和其他音訊設定的抽象,所有這些都可以獨立管理。出於路由目的,每個區域被定義為音訊策略配置中排列的一組音訊輸出匯流排設備。每個音訊區域定義的設備都不同。在圖1中,匯流排設備1到5屬於區域0,匯流排設備6到8屬於區域1,匯流排設備9到11屬於區域2。
汽車音響配置
通常,輸出設備被分配給一個音訊區域。每個音訊區域都在car_audio_configuration.xml
中定義。以下程式碼片段顯示了圖 1 的汽車音訊配置:
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneI="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
是由CarOccupantZoneManager
管理的汽車服務定義。它在汽車中用於定義車內用戶到特定座位位置的映射。 CarOccupantZoneService
也定義了從佔用區域到顯示器、其他週邊設備以及使用者登入顯示器後的使用者的對應。音訊區域具有:
音訊區域 ID 和占用區域 ID。
- 將音訊區域對應到乘員區域(座椅、顯示器和其他週邊設備)
- 映射登入時為哪個使用者 ID 指派音訊區域
音訊配置列表。每個音訊配置都有一組卷組。每個卷組都有一組音訊總線設備。
變更音量時,群組中的所有音訊裝置都會以相同的方式進行控制。
每個音訊設備都分配有一個音訊屬性清單。這些資訊用於建立具有不同分配的音訊屬性的音訊策略混合。
此配置允許將不同的音訊屬性用途路由到每個區域中的不同輸出設備。根據使用情況,可以同時播放不同的聲音。例如,您可以選擇將主艙(主要區域)配置為在所有揚聲器上播放媒體聲音,但僅在最靠近駕駛者的揚聲器上播放導航聲音。透過同時播放聲音,主艙可以繼續收聽媒體,同時向駕駛員提供導航。
多區域音訊乘客登入工作流程
下面的序列圖顯示了當乘客登入各自的顯示器時啟用音訊路由的流程:
圖 2.
在此序列中,使用者登入資訊透過佔用區域服務傳播到汽車音訊服務。
汽車音訊服務(針對特定音訊區域)使用
AudioPolicy#removeUserIdDeviceAffinity
API 來刪除使用者裝置關聯性。該 API 需要一個使用者 ID。在本例中,為前一個區域的使用者。AudioPolicy#setUserIdDeviceAffinity
API 將新用戶指派到一個區域,該區域接收使用者 ID 和特定區域配置的所有裝置。
動態區域配置
在 Android 14 中,引入了動態區域配置,讓 OEM 為乘客配置不同的裝置集。此用例允許後座乘客在後座頭枕揚聲器和後座耳機週邊設備之間切換。
在這種情況下,需要兩種配置。後座頭枕和耳機週邊設備各一個。特定用戶的音訊一次僅路由到一種配置。
圖 3.動態區域配置工作流程。
圖 3 展示了動態區域配置工作流程的架構。音訊區域 1 包含兩個配置: Config 0
和Config 1
,它們分別與輸出裝置揚聲器和頭枕相關聯。
登入後,系統會自動為使用者指派預設配置。當使用者選擇更改配置時(通常透過系統 UI),汽車音訊服務會在兩種配置之間執行切換。這樣,輸出裝置就在Z1揚聲器和Z1頭枕之間切換。
下面的程式碼片段顯示了此動態區域配置的設定。
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
為了方便管理音訊配置,汽車音訊管理器公開 API 來管理配置:
- 查詢區域可用的配置。
- 查詢區域目前設定的配置。
- 切換到不同的配置。
系統 UI 應用程式或服務可以使用這些 API 來管理音訊區域的配置,如圖 4 所示。查詢 API 將兩者公開給乘客。使用者可以透過點擊所需配置的命令來選擇不同的配置。
圖 4.動態區域配置工作流程。
主要區域乘客音訊廣播
主要區域乘客音訊投射是 Android 14 中引入的一項功能,可讓乘客在主要區域投射媒體音訊。透過這種方式,乘客的媒體音訊可以投射到主艙,而駕駛員則保持完全控制。
下圖顯示了主要區域乘客媒體音訊廣播架構的簡化版本。
圖 5.動態區域配置工作流程。
該圖像顯示駕駛員的媒體輸出設備與乘客共享,這僅在乘客處於主要區域模式時發生。動態音訊策略也用於管理驅動程式的音訊路由,但不會對驅動程式的裝置關聯性套用任何變更。對於乘客,輸出設備清單更改如下:
- 乘客的媒體輸出設備已從設備清單中刪除
- 驅動程式的媒體輸出裝置已新增至裝置清單中
- 乘客音訊區域的其餘輸出設備保留在設備清單中
這個新的設備清單由AudioPolicy#setUserIdDeviceAffinity
API 指派給乘客。傳遞給 API 的參數是設備清單和乘客使用者 ID。當音訊系統的音訊策略服務查詢要為與乘客相關聯的媒體軌道選擇哪個音訊混音時,選擇與主要區域相關聯的媒體音訊混音。
主區域音訊投射的一個關鍵要求是主區域的媒體輸出裝置與其他音訊屬性使用隔離。否則,在建立音訊混音期間,其他音訊屬性將添加到混音中。當音訊系統執行混音選擇時,所有附加到混音的聲音都被選擇在主艙中播放。
乘客區音響鏡
音訊鏡像功能使乘客能夠共享音訊。鏡像功能會複製每個音訊區域中的音訊數據,以便所有乘客都可以聽到相同的音訊。在這種情況下,音訊焦點與參與音訊鏡像的乘客共享。
音訊鏡像路由
至少需要兩名乘客才能啟用音訊鏡像。因此,只有兩個乘客音訊區域的音訊配置將需要一個鏡像輸出設備。透過上面的定義,可以啟動兩個並發的鏡像會話。
下圖顯示了兩名乘客之間的多區域音訊鏡像的簡化圖。來自兩名乘客的音訊被路由到音訊鏡像設備, bus_1000
。音訊 HAL 將訊號複製到來源區域。
圖 6.動態區域配置工作流程。
僅當乘客處於鏡像模式時才會啟用此路由。如果沒有,則將音訊區域的相應設備分配給乘客。當首次為乘客啟用鏡像時, AudioPolicy#setUserIdDeviceAffinity
API 會修改路由:
- 乘客的媒體輸出設備已從設備清單中刪除。
- 鏡像輸出設備已新增至設備清單中。
- 乘客音訊區域的其餘輸出設備保留在設備清單中。
透過設備列表,可以使用更新的設備列表和乘客的用戶 ID 來呼叫 API。下圖提供了音訊鏡像工作流程的序列圖。
圖 7.音訊鏡像工作流程。
在圖 7 中,從媒體系統服務呼叫汽車音訊管理器用於管理音訊鏡像的 API。具體來說,為用戶 1 和用戶 2 啟用音訊映像的 API CarAudioManager#enableMirrorForAudioZones
。
汽車音訊服務為使用者乘客配置音訊路由,如上所述。汽車音訊服務也會向音訊 HAL 發送訊號,以配置音訊並將其從鏡像設備複製到相應的區域。
在上圖中,汽車音訊服務發送mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
在哪裡,
bus_1000
是來源匯流排, bus_10
和bus_20
是目標匯流排。
序列圖中未顯示的是透過AudioManager#setParameters
API 發送的訊號,該訊號透過音訊服務到達 HAL。
停用音訊鏡像後,將發送以下訊號: mirroring_src=bus_1000;mirroring=off
。當未啟用音訊鏡像時,HAL 可以使用此訊號來停用音訊複製。為了定義音訊鏡像設備,汽車音訊設定檔包含一個名為mirroringDevices
的部分,如下面的程式碼片段所示。
在此程式碼片段中,定義了兩個鏡像設備: bus_1000
和bus_2000
,以便四名乘客可以使用音訊鏡像。
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>