在 Android 10 中,car_audio_configuration.xml
取代了 car_volumes_groups.xml
和 IAudioControl.getBusForContext
。音訊政策檔案通常包含在供應商分區中,代表主機板的音訊硬體設定。car_audio_configuration.xml
中參照的所有裝置都必須在 audio_policy_configuration.xml
中定義。
下圖 1 概略說明車用音訊服務架構,其中車用音訊服務會讀取車用音訊設定檔,為裝置設定音訊。
圖 1. 車用音響架構總覽。
將車用音訊設定檔放在裝置上的 vendor\etc\
或 system\etc\
中,其中 vendor\etc\
是車用音訊服務首先搜尋檔案的位置。車用音訊服務會讀取 car_audio_configuration.xml
,以決定音訊設定。
車輛音訊區域:
- 每個音訊區域都包含專屬的音訊區域 ID。
- 每個音訊區域都可以對應至乘客區域。
每個區域的音訊動作彼此獨立:
- 音訊焦點
- 音訊路由
- 降低其他應用程式音量
車輛音量群組:
包含音量群組的所有音訊裝置都會一起控制,並採用相同的增益變更。群組中所有裝置的音量增益設定應相同。
音訊內容與音訊裝置的對應關係。使用此方法建構音訊混合,將音訊用途對應至輸出裝置。
所有音訊內容都應在一個區域內呈現。這樣一來,您就能針對所有音訊屬性用途正確設定音訊路由。
音訊內容
為簡化 AAOS 音訊的設定,我們將類似用途歸類為 CarAudioContexts
。這些音訊內容會在整個 CarAudioService
中使用,用於定義轉送、音量群組、音訊焦點和靜音管理。以下列出 AAOS 中的靜態音訊內容。
下表說明音訊內容與用途之間的對應關係。醒目顯示的資料列是用於新系統用途。
CarAudioContext | 相關 AttributeUsages |
---|---|
音樂 | UNKNOWN GAME |
導航 | ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND | ASSISTANT |
CALL_RING | NOTIFICATION_RINGTONE |
致電 | VOICE_COMMUNICATION VOICE_COMMUNICATION_SIGNALING |
鬧鐘 | ALARM |
通知 | NOTIFICATION NOTIFICATION_* |
SYSTEM_SOUND | ASSISTANCE_SONIFICATION |
緊急 | EMERGENCY |
安全 | SAFETY |
VEHICLE_STATUS | VEHICLE_STATUS |
公告 | ANNOUNCEMENT |
啟用 AAOS 路由
如要使用 AAOS 導向,您必須將 audioUseDynamicRouting
標記設為 true
:
<resources>
<bool name="audioUseDynamicRouting">true</bool>
</resources>
當 false
、路由和大部分 CarAudioService
都停用時,AAOS 會回復 AudioService
的預設行為。
主要可用區
根據預設,所有音訊都會路由至主要區域。只有一個主要區域,在設定中以 isPrimary="true"
屬性表示。系統會自動將 Audiomanager.PRIMARY_AUDIO_ZONE
指派給主要可用區。
設定範例 (第 2 版)
舉例來說,車輛可能有兩個區域,一個是主要區域,另一個是後座娛樂系統。在這種情況下,您可以設計可能的 car_audio_configuration.xml
2.0 版本,如下所示:
<audioZoneConfiguration version="2.0">
<zone name="primary zone" isPrimary="true">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="music"/>
<context context="announcement"/>
</device>
<device address="bus3_call_ring_out">
<context context="call_ring"/>
</device>
<device address="bus6_notification_out">
<context context="notification"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
<group>
<device address="bus4_call_out">
<context context="call"/>
</device>
</group>
<group>
<device address="bus5_alarm_out">
<context context="alarm"/>
</device>
</group>
<group>
<device address="bus7_system_sound_out">
<context context="system_sound"/>
<context context="emergency"/>
<context context="safety"/>
<context context="vehicle_status"/>
</device>
</group>
</volumeGroups>
</zone>
<zone name="rear seat zone" audioZoneId="1">
<volumeGroups>
<group>
<device address="bus100_rear_seat">
<context context="music"/>
<context context="navigation"/>
<context context="voice_command"/>
<context context="call_ring"/>
<context context="call"/>
<context context="alarm"/>
<context context="notification"/>
<context context="system_sound"/>
<context context="emergency"/>
<context context="safety"/>
<context context="vehicle_status"/>
<context context="announcement"/>
</device>
</group>
</volumeGroups>
</zones>
</audioZoneConfiguration>
在這個範例中,主要區域會將部分音訊內容分派給不同的裝置。這樣一來,HAL 就能套用不同的後製效果,並使用車輛的硬體混合每部裝置的輸出內容。裝置已分為多個音量群組:媒體、導航、通話、鬧鐘和系統音效。如果系統已設為 useFixedVolume
,則每個群組的音量等級會傳遞至 HAL,以便套用至這些裝置的輸出內容。
對於主要區域,建議您將系統音效與其他音效分開。這樣一來,系統就能以較高的優先順序處理車輛聲響。汽車音訊服務已針對車輛聲響提供焦點和靜音管理方面的差異。舉例來說,緊急音訊焦點要求的優先順序高於其他焦點要求。
為簡化說明,在次要區域範例中,所有音訊內容都會路由至單一裝置和一個音量群組。
乘客區域音訊設定
在 Android 11 中,car_audio_configuration.xml
引入了兩個新欄位:audioZoneId
和 occupantZoneId
。您可以使用 audioZoneId
控管音訊區管理。您可以使用 occupantZoneId
根據使用者 ID 設定路由。
回到上述的音訊設定,但使用新欄位來對應住戶區 ID 和音訊區 ID,您可以按照下列方式設定不含音量群組定義的新設定。
<audioZoneConfiguration version="2.0">
<zone name="primary zone" isPrimary="true" occupantZoneId="0">
...
</zone>
<zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
...
</zone>
</zones>
</audioZoneConfiguration>
上述設定會將主要區域對應至居住區 0,並將 audioZoneId
1 對應至 occupantZoneId
1。一般來說,您可以設定任何使用者區域和音訊區域之間的對應關係。不過,對應關係必須一對一。以下列出定義這兩個新欄位的規則。
主要區域的
audioZoneId
一律為PRIMARY_AUDIO_ZONE
ID。如果已定義isPrimary="true"
,則不必使用audioZoneId
。audioZoneId
和occupantZoneId
號碼不得重複。audioZoneId
和occupantZoneId
只能一對一對應。
Android 14 車用音訊設定
在 Android 14 中,AAOS 推出了 OEM 外掛程式服務,可讓您更積極地管理汽車音訊服務監控的音訊行為。除了新的外掛程式服務外,下列變更也已加入車輛音訊設定檔:
- 原始設備製造商定義的車輛音訊情境
- 非主要區域的動態設定
原始設備製造商 (OEM) 定義的車輛音訊內容
為提供彈性的音訊設定,在 Android 14 中,車輛音訊服務允許將音訊用途分組,而非使用上述定義的靜態音訊內容。這個 OEM 定義的內容可在 car_audio_configuration.xml
3 版檔案中定義。
而是使用目前定義的靜態音訊內容。原始設備製造商定義的車輛音訊內容一般格式如下所示。
OEM 情境各自需要一個 name
,以及指派給情境的音訊屬性用法清單。在上述範例中,定義了兩個情境:
<carAudioConfiguration version="3">
<oemContexts>
<oemContext name="media">
<audioAttributes>
<usage value="AUDIO_USAGE_MEDIA" />
<usage value="AUDIO_USAGE_UNKNOWN"/>
</audioAttributes>
</oemContext>
<oemContext name="game">
<audioAttributes>
<usage value="AUDIO_USAGE_GAME" />
</audioAttributes>
</oemContext>
...
media
背景資訊包含AUDIO_USAGE_MEDIA
和AUDIO_USAGE_UNKNOWN
game
情境包含僅限AUDIO_USAGE_GAME
您必須在 car_audio_configuration.xml
檔案頂端定義內容。定義 OEM 情境後,即可照常進行其餘的車輛音訊設定。汽車音訊情境適用下列規則:
OEM 內容定義為選用,而是改用靜態的音訊內容。
請勿重複上下文名稱。
請勿將音訊屬性用途指派給多個情境。
AudioAttributes
中定義的所有音訊用途都應用於建構情境。
嚴格來說,必須使用音訊用途的 android.audio.policy.configuration.V7_0.AudioUsage
字串表示法,才能定義 OEM 音訊內容。日後,較新的音訊屬性用法會指派至最適當的上下文,以減少從一個 Android 版本遷移至另一個版本時的錯誤。
雖然 OEM 定義的內容已導入,以便進一步擴充 OEM 外掛程式音訊服務,但在沒有 OEM 外掛程式服務的情況下,您仍可使用這項內容。音訊行為類似於靜態音訊服務:
音訊焦點互動。音訊屬性可用於判斷音訊焦點互動矩陣設定的最佳比對行為。詳情請參閱「音訊焦點」。
系統會使用音量控制音訊屬性來判斷最佳比對結果:
- 根據原始設備製造商定義的內容建立音量群組。
- 已設定的靜態音量清單優先順序。
降低其他應用程式音量行為:
目前音訊焦點的音訊屬性用法會對應至汽車音訊設定檔中定義的輸出音訊裝置資訊。
音訊屬性會根據靜態音訊靜音矩陣,將相應的靜態內容對應至靜音。
動態音訊區設定
在 Android 14 中,為了支援動態音訊區設定,用於定義音訊區的車輛音訊設定架構也已更新至第 3 版。新結構定義需要為每個區域設定設定。
<carAudioConfiguration version="3">
<!-- optional OEM context -->
<oemContexts>
<oemContext name="media">
<audioAttributes>
<usage value="AUDIO_USAGE_MEDIA" />
<usage value="AUDIO_USAGE_UNKNOWN"/>
</audioAttributes>
</oemContext>
<oemContext name="game">
<audioAttributes>
<usage value="AUDIO_USAGE_GAME" />
</audioAttributes>
</oemContext>
...
</oemContexts>
<zones>
<zone name="primary zone" isPrimary="true" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="media"/>
<context context="game"/>
<context context="announcement"/>
</device>
<device address="bus6_notification_out">
<context context="notification"/>
</device>
</group>
...
</zoneConfigs>
</zone
</zones>
詳情請參閱 device/generic/car/emulator/audio/car_audio_configuration.xml
中定義的 3 版檔案。從 Android 14 開始,主要區域只能有一個 (1) 設定。非主要區域可以有多個設定。下列規則適用於車輛音訊設定:
主要音訊區域只能設定一個。
非主要音訊區域可以有多個設定。
每個音訊區域和音訊區域設定的名稱不得重複。
在音訊區域內,音訊設定可能有所不同:
- 音量群組設定不必相同。
- 音訊背景指派不必相同。
音訊輸出裝置名稱在各區域或設定中不得重複。音訊設定或區域中只能出現一次裝置名稱。
屬於相同音量群組的音訊裝置應具有相同的音訊增益設定。
每個音訊設定都必須指派所有音訊內容 (OEM 或靜態)。
前瞻相容性
雖然 car_audio_configuration.xml
的新版本會在每次更新中推出新功能,但您仍可在較新版本的 AAOS 中使用舊版檔案。原始設備製造商 (OEM) 更新至新版 Android 時,可以重複使用 car_audio_configuration.xml
檔案。
如要使用需要 car_audio_configuration.xml
中包含新資訊的新功能,必須更新版本。嘗試使用舊版檔案,其中包含該檔案版本不支援的資訊,會在啟動車輛服務時擲回 IllegalStateException
。例外狀況訊息會包含相關資訊,說明系統會使用哪些資訊,以及需要哪個最低版本。