在 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 | 相關聯的屬性用途 |
|---|---|
MUSIC |
UNKNOWNGAMEMEDIA |
NAVIGATION |
ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND |
ASSISTANT |
CALL_RING |
NOTIFICATION_RINGTONE |
CALL |
VOICE_COMMUNICATIONVOICE_COMMUNICATION_SIGNALING |
ALARM |
ALARM |
NOTIFICATION |
NOTIFICATIONNOTIFICATION_* |
SYSTEM_SOUND |
ASSISTANCE_SONIFICATION |
EMERGENCY |
EMERGENCY |
SAFETY |
SAFETY |
VEHICLE_STATUS |
VEHICLE_STATUS |
ANNOUNCEMENT |
ANNOUNCEMENT |
啟用 Android Auto OS 路由
如要使用以 AAOS 為基礎的路徑,請將 audioUseDynamicRouting 標記設為 true:
<resources>
<bool name="audioUseDynamicRou>ting<">;<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&quo<t;
zone name="primary zone&qu>ot; isPrimar<y="true>"
< vol>umeGroups
< group
d>evice address="bus0<_media_out"
> context <context="music"/
> c<ontext >context="announ<cement"/
/d>evice
< device address="bus3_c>all_ring_out"
< > conte<xt context="call_ring"/
> /device
< device addres>s="bus6_notific<ation_o>ut"
< > contex<t con>text="notificat<ion"/
/devic>e
/group
< group
> device ad<dress=&>quot;bus1_navigation<_out"
conte>xt context="navigat<ion"/
/d>evice
< de>vice address=&qu<ot;bus>2_voice_command_<out&q>uot;
< context context=">voice_command"/
< /device>
/gro<up
> group<
> de<vice >address="bus4_c<all_out"
> context context=&q<uot;call"/
> /device
< > /group
< > group
< > device ad<dress="bus5_alarm_out"
> contex<t context="alarm"/
> /device<
/group
> group
< device address>="bus7_system_sound<_out"
> context context=&qu<ot;syst>em_sound"/
< > < context >context=<">;emergenc<y"/
context co>ntext="<safety">/
< > context context=<"vehicle_status"/
> /device
< /group
> /volumeGroups
< /zone
zone name=&>quot;rear seat zone"<; audioZoneId="1"
> volumeGroups
< group
> device address=&<quot;bus100_rear_seat&q>uot;
< context context=&quo>t;music"/
< context context=&>quot;navigation"/
< context c>ontext="voice_comma<nd"/
> context context=&qu<ot;call_ring"/
> contex<t context="call"/
> contex<t context="alarm"/
> < contex>t context="<notifi>cation"</
> < > <context context="s>ystem_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&quo<t;
zone name="primary zone" isPrimary=">;true" occupantZ<oneId>="0<"
...
/zone
zone name="rear >seat zone" audio<ZoneI>d=&qu<ot;1&q>u<ot; occupantZoneId=&quo>t;1"
...
/zone
/zones
/audioZoneConfiguration
這項設定會定義主要區域到住戶區域 0 的對應,以及 audioZoneId 1 到 occupantZoneId 1 的對應。你可以設定居住者區域和音訊區域之間的任何對應關係。不過,對應關係必須是一對一。定義這兩個新欄位的規則如下:
主要區域的
audioZoneId一律為PRIMARY_AUDIO_ZONEID。如果已定義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=&qu>ot;3&<quot;
o>emContext<s
oemContext na>me="medi<a"
> audioAttribu<tes
usage value=&>quot;<AUDIO_USAGE_MEDIA" /
usag>e value="<;AUDIO_USAGE_UNK>NOWN"<;/
> /audi<oAttributes
/o>emContext
< oemContext> name="game&<quot;
audioAttribute>s
< usage value>="AU<DIO_USAGE_G>AME" /
/audioAttributes
/oemContext
...
media環境包含AUDIO_USAGE_MEDIA和AUDIO_USAGE_UNKNOWNgamecontext 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=&qu>ot;3&<quot;
!-- optional OEM >conte<xt --
o>emConte<xts
oemContext na>me="<media"
> audioA<ttributes
usage value=&>quot;AUDIO_<USAGE_MEDIA" /
usag>e value=&<quot;AUDIO_USAGE>_UNKNOW<N"/
> /<audioAttributes
>/oemConte<xt
oemCon>text name=&<quot;game"
audioAtt>ributes
< usage v>alue=&q<uot;AUDIO_U>SAGE_GAME<" /
> < /au>dioAt<tributes
/oemContext
...
/oemContexts
zones
>zone na<me="pr>imary zon<e" isPrimary="true" occupantZoneId=">0"
< zoneConfi>gs
zo<neCon>fig name="<primary zone config 0" isD>efault="true<"
volumeG>roups
< group
> device address=<"bus0_media_out"
> con<text co>ntext="med<ia"/
context context=>"game"/<
context contex>t="announc<ement&q>uot;/
< > /device
< de>vice <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 中使用舊版檔案。更新至新版 Android 時,原始設備製造商 (OEM) 可以重複使用 car_audio_configuration.xml 檔案。
如要使用需要 car_audio_configuration.xml 中新資訊的新功能,就必須更新版本。如果嘗試使用舊版檔案,但該檔案版本不支援其中的資訊,啟動車輛服務時會擲回 IllegalStateException。例外狀況訊息會包含相關資訊,說明使用的資訊和所需的最低版本。