在 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 中的靜態音訊上下文。
該表描述了音訊上下文和用法之間的對應。突出顯示的行是為新的系統用途而提供的。
汽車音訊上下文 | 關聯屬性用法 |
---|---|
音樂 | UNKNOWN GAME |
導航 | ASSISTANCE_NAVIGATION_GUIDANCE |
語音控制 | ASSISTANT |
呼叫響鈴 | NOTIFICATION_RINGTONE |
稱呼 | VOICE_COMMUNICATION VOICE_COMMUNICATION_SIGNALING |
警報 | ALARM |
通知 | NOTIFICATION NOTIFICATION_* |
系統聲音 | ASSISTANCE_SONIFICATION |
緊急狀況 | EMERGENCY |
安全 | SAFETY |
車輛狀態 | 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,如下所示:
<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 定義的汽車音訊環境
- 非主要區域動態配置
OEM 定義的汽車音訊環境
為了實現靈活的音訊配置,在 Android 14 中,汽車音訊服務允許以不同於上面定義的靜態音訊上下文的方式對音訊使用進行分組。此 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
上下文僅包含AUDIO_USAGE_GAME
上下文必須在car_audio_configuration.xml
檔案的頂部定義。定義 OEM 上下文後,汽車音訊配置的其餘部分可以像以前一樣繼續進行。以下規則適用於汽車音響環境:
OEM 上下文定義是可選的。而是使用靜態音訊上下文。
不要重複上下文名稱。
不要將音訊屬性用法指派給多個上下文。
AudioAttributes
中定義的所有音訊用法都應該用於建構上下文。
嚴格來說,音訊使用的android.audio.policy.configuration.V7_0.AudioUsage
字串表示形式必須用於 OEM 音訊上下文定義。將來,較新的音訊屬性用法將被指派給最合適的上下文,以減少從一個 Android 版本遷移到另一個 Android 版本時出現的錯誤。
雖然引入 OEM 定義的上下文是為了進一步擴展 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 中使用舊檔案。更新到新版本 Android 的 OEM 可以重複使用car_audio_configuration.xml
檔。
若要使用需要car_audio_configuration.xml
中包含的新資訊的新功能,必須更新版本。當汽車服務啟動時,嘗試使用包含該檔案版本不支援的資訊的舊版本檔案會引發IllegalStateException
。異常訊息包含有關使用哪些資訊以及需要哪個最低版本的相關資訊。