在 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 |
---|---|
MUSIC |
UNKNOWN GAME MEDIA |
NAVIGATION |
ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND |
ASSISTANT |
CALL_RING |
NOTIFICATION_RINGTONE |
CALL |
VOICE_COMMUNICATION VOICE_COMMUNICATION_SIGNALING |
ALARM |
ALARM |
NOTIFICATION |
NOTIFICATION NOTIFICATION_* |
SYSTEM_SOUND |
ASSISTANCE_SONIFICATION |
EMERGENCY |
EMERGENCY |
SAFETY |
SAFETY |
VEHICLE_STATUS |
VEHICLE_STATUS |
ANNOUNCEMENT |
ANNOUNCEMENT |
啟用 Android Auto OS 路由
如要使用以 AAOS 為基礎的轉送功能,請將 audioUseDynamicRouting
標記設為 true
:
<resources>
<bool name="audioUseDynamicRouting">true</bool>
</resources>
當 false
時,系統會停用路徑和大部分的 CarAudioService
,而 AAOS 會回復為 AudioService
的預設行為。
可設定的音訊政策引擎
為進一步擴展 Android 14 中的車輛音訊管理功能,AAOS 導入了透過可設定音訊政策引擎 (CAP) 管理音訊的功能。這樣一來,您就能更靈活地控制音訊路徑和音量管理,並定義以下項目:
您可以使用 useCoreAudioVolume
和 useCoreAudioRouting
啟用可設定的音訊政策 (CAP) 引擎,詳情請參閱「可設定的音訊政策引擎」。
主要區域
根據預設,所有音訊都會傳送到主要區域。只能有一個主要區域,設定中會以 isPrimary="true"
屬性表示。系統會自動將 Audiomanager.PRIMARY_AUDIO_ZONE
指派給主要可用區。
設定範例 (版本 2)
舉例來說,車輛可能會有兩個區域,分別是主要區域和後座娛樂系統。在這個情境中,您可以設計可能的 car_audio_configuration.xml
第 2 版,如下所示:
<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,並套用至這些裝置的輸出內容。
對於主要區域,建議系統音效與其他音效分開。這樣一來,系統就會優先處理車輛音效。 車輛音訊服務已根據焦點和閃避管理,區分車輛聲音。舉例來說,緊急音效焦點要求會比其他焦點要求優先處理。
在次要區域範例中,所有音訊情境都會路由至單一裝置和一個音量群組。
CAP 引擎的磁碟區群組定義
如要透過 CAP 引擎管理音量 (如「可設定的音訊政策引擎」一文所述),音量群組定義也必須包含名稱:
<group name="media">
<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 name="navigation">
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
這個磁碟區群組名稱必須與 CAP 引擎中定義的磁碟區名稱相符。此外,useFixedVolume
也必須設為 false
。詳情請參閱「音訊設定 AAOS 旗標」。
乘員區域音訊設定
在 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 外掛程式服務,可讓您管理由車輛音訊服務監管的音訊行為。除了新的外掛程式服務,車輛音訊設定檔也新增了下列變更:
- 原始設備製造商定義的車輛音訊情境
- 非主要區域的動態設定
原始設備製造商定義的車輛音訊情境
如要啟用彈性音訊設定,在 Android 14 中,車用音訊服務可讓音訊用途以不同於靜態 Audio contexts 的方式分組。這個 OEM 定義的環境可以在 car_audio_configuration.xml
第 3 版檔案中定義。
系統會改用預先定義的靜態音訊情境。稍後會說明 OEM 定義的車輛音訊情境一般格式。
每個 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
context contains onlyAUDIO_USAGE_GAME
內容必須定義於 car_audio_configuration.xml
檔案頂端。定義 OEM 內容後,其餘車輛音訊設定程序與先前相同。車輛音訊情境適用下列規則:
OEM 內容定義為選用項目。改為使用靜態 Audio context。
請勿重複使用內容名稱。
請勿將音訊屬性用法指派給多個情境。
應使用
AudioAttributes
中定義的所有音訊用途,建構內容。
嚴格來說,OEM 音訊內容定義必須使用音訊用量的字串表示法。android.audio.policy.configuration.V7_0.AudioUsage
日後,系統會將較新的音訊屬性用法指派給最合適的環境,以減少從一個 Android 版本遷移至另一個版本時發生的錯誤。
雖然導入 OEM 定義的內容是為了進一步擴充 OEM 外掛程式音訊服務,但即使沒有 OEM 外掛程式服務,仍可使用這項功能。音訊行為與靜態音訊服務類似:
音訊焦點互動。音訊屬性可用於根據音訊焦點互動矩陣設定,判斷最佳比對行為。詳情請參閱「音訊焦點」。
音量控制音訊屬性可用於判斷最佳比對結果:
- 音量群組,根據 OEM 定義的環境而定。
- 從設定的靜態磁碟區清單取得優先順序。
降低其他應用程式音量行為:
系統會使用目前音訊焦點的音訊屬性,對應至車輛音訊設定檔中定義的輸出音訊裝置資訊。
音訊屬性會根據靜態音訊閃避矩陣,將相應的靜態環境對應至閃避。
CAP 引擎產品策略
如果裝置必須使用 CAP 引擎進行音量或路徑管理,OEM 定義的內容必須符合 CAP 引擎產品策略定義。如果沒有,您可以使用 OEM 定義的內容,不必使用 CAP 引擎。
如要瞭解詳情,請參閱 AAOS 中的 CAP 引擎產品產品策略。
動態音訊區域設定
在 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 開始,主要區域只能有一項設定。非主要區域可以有多個設定。車輛音訊設定須遵守下列規則:
主要音訊區域只能有一項設定。
非主要音訊區域可以有多種設定。
每個音訊區域和音訊區域設定的名稱不得重複。
音訊區域內的音訊設定可能有所不同:
- 音量群組設定不一定要相同。
- 音訊情境指派不必相同。
音訊輸出裝置名稱在區域或設定中不得重複。音訊設定或區域中,裝置名稱只能出現一次。
屬於同一音量群組的音訊裝置應具有相同的音訊增益設定。
必須為每個音訊設定指派所有音訊環境 (OEM 或靜態)。
前瞻相容性
雖然新版 car_audio_configuration.xml
會在每次更新中推出新功能,但您仍可在新版 AAOS 中使用舊版檔案。如果原始設備製造商 (OEM) 要更新至新版 Android,可以重複使用 car_audio_configuration.xml
檔案。
如要使用需要 car_audio_configuration.xml
中新資訊的新功能,就必須更新版本。如果嘗試使用舊版檔案,但該檔案版本不支援其中的資訊,啟動車輛服務時會擲回 IllegalStateException
。例外狀況訊息會包含相關資訊,說明使用的資訊和最低版本需求。