車輛音訊服務會使用 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 推出動態區域設定,可讓原始設備製造商為乘客設定不同的裝置組合。後座乘客可透過這個用途,在後座頭枕喇叭和後座耳機周邊裝置之間切換。
在此情況下,你必須提供兩項設定。分別用於後座頭枕和耳機周邊裝置。特定使用者的音訊一次只會傳送至一個設定。
圖 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 所示。Query 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
where
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>