車用音訊服務會使用 Core Audio 動態音訊政策,方便在車內使用。
為每位乘客提供獨立的音訊播放功能,稱為多區音訊,其中每個區域都允許同時播放音訊。
動態音訊區設定。
乘客主要區域音訊投放。
乘客的音訊鏡像。
在每個用途中,車用音訊服務都會使用動態音訊政策,自動將音訊路由至指定的輸出裝置。
多區音訊
多區域音訊可讓多位使用者同時與 AAOS 互動。一組輸出裝置會與一個區域建立關聯,每個區域都會維持音訊焦點和音量等級。乘客可在主要區域 (通常是車內) 聽音訊,駕駛員則可聽其他來源的音訊。
多區域音訊架構
圖 1. 汽車音訊服務架構。
車輛音訊區域是音訊輸出、音訊焦點和其他音訊設定的抽象概念,所有這些設定都可以獨立管理。為了進行路由,每個區域都會定義為一組音訊輸出匯流排裝置,並在音訊政策設定中安排。每個音訊區定義的裝置都不同。在圖 1 中,匯流排裝置 1 到 5 屬於區域零,匯流排裝置 6 到 8 屬於區域一,匯流排裝置 9 到 11 屬於區域二。
汽車音訊設定
通常,輸出裝置會指派至一個音訊區。每個音訊區域都會在 car_audio_configuration.xml
中定義。以下程式碼片段顯示圖 1 的車輛音訊設定:
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="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
。Audio HAL 會將信號複製到來源區域。
圖 6. 動態區域設定工作流程。
只有在乘客處於鏡像模式時,系統才會啟用這項路由。否則,系統會將音訊區域的對應裝置指派給乘客。當乘客首次啟用鏡像功能時,AudioPolicy#setUserIdDeviceAffinity
API 會修改路由:
- 乘客的媒體輸出裝置已從裝置清單中移除。
- 鏡像輸出裝置已新增至裝置清單。
- 乘客音訊區域的其他輸出裝置會保留在裝置清單中。
有了裝置清單後,您可以使用更新的裝置清單和乘客的使用者 ID 呼叫 API。下圖為音訊鏡像工作流程的序列圖。
圖 7. 音訊鏡像工作流程。
在圖 7 中,汽車音訊管理員的 API 會從媒體系統服務呼叫,用於管理音訊鏡像。具體來說,這個 API 可為使用者 1 和使用者 2 啟用音訊鏡像功能,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>