磁碟區管理包含於 CarAudioService
,該功能會使用固定磁碟區,並預期磁碟區會由硬體擴大器 (而非軟體) 套用至 HAL。CarAudioService
會將輸出裝置整理為磁碟區群組,以便對與磁碟區群組相關聯的所有裝置套用相同的增益。
固定磁碟區
AAOS 實作會使用硬體擴大器控制音量,而非使用軟體混音器。如要避免副作用,請將 config_useFixedVolume
標記設為 true
(視需要疊加):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
如未設定 config_useFixedVolume
標記 (或設為 false
),應用程式可以呼叫 AudioManager.setStreamVolume()
,在軟體混合器中依串流類型調整音量。但這不一定是好現象,因為其他應用程式潛在影響,以及軟體混合器接收到音量放大後,當硬體擴大器接收到訊號中的可用位元可能會較少。
磁碟區群組
音量群組可管理音訊區域中一組裝置的磁碟區。每個音量群組的音量都可以獨立控制。取得成果後,會設定在相關裝置上,供車輛的擴音器套用。磁碟區設定會保留給使用者,並在使用者登入時載入。
定義磁碟區群組
CarAudioService 使用在 car_audio_configuration.xml
中定義的音量群組:
<audioZoneConfiguration version="2.0">
<zones>
<zone name="primary zone" isPrimary="true">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zone>
</zones>
</audioZoneConfiguration>
每個磁碟區群組都應含有一或多部具有相關位址的輸出裝置。位址應對應至 audio_policy_configuration.xml
中定義的輸出裝置。
設定磁碟區群組的增益項目
每個磁碟區群組都有最小值、最大值和預設增益值,以及根據與磁碟區群組關聯裝置的 audio_policy_configuration.xml
中設定的值得出的步數大小。
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
在初始化期間,磁碟區群組會檢查關聯裝置的增益值,並按照以下方式設定群組:
- 步距:凡是由音量群組控管的裝置,都必須相同。
- 最小增益。群組中裝置的最小增益值。
- 最大增益。群組中裝置的最高收益。
- 預設增益。群組中裝置的預設增益值。
鑒於這些值的設定方式,可以將磁碟區群組的增益設定為超出支援磁碟區群組之裝置的範圍。在這種情況下,系統會根據音量群組的值是小於或高於範圍,將裝置的增益值設為裝置的最小或最大增益值。
磁碟區群組 ID
磁碟區群組會在執行階段按照 XML 檔案中定義的順序識別。
ID 的範圍介於音訊區域內的 0
到 N-1
之間,其中 N
是該區域中音量群組的數量。如此一來,各個可用區的磁碟區群組 ID 就不會重複。這些 ID 用於與磁碟區群組相關聯的 CarAudioManager
API。任何接收 groupId
但沒有 zoneId
的 API 都會預設為主要音訊區域。
多可用區磁碟區管理
每個音訊區域應有一或多個音量群組,且每個音量群組都只與單一音訊區域相關聯。這種關係是 car_audio_configuration.xml
的一部分。詳情請參閱上方「定義磁碟區群組」中的範例。
每個區域目前的磁碟區等級都會保留給與該可用區相關聯的使用者。這些設定屬於特定區域,也就是說,如果使用者在與主要區域相關聯的螢幕上登入,之後登入與次要音訊區域相關聯的區域,那麼在第一個區域中載入和保留的音量大小會與次要區域的層級不同。
處理音量重要事件
Android 定義幾個音量控制按鍵碼,包括:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
根據預設,Android 會將音量重要事件轉送至應用程式。Automotive 實作應強制這些按鍵事件交由 CarAudioService
處理,隨後再視情況呼叫 setGroupVolume
或 setMasterMute
。如要強制執行這項行為,請將 config_handleVolumeKeysInWindowManager
標記設為 true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
目前,磁碟區重要事件無法辨別其目標可用區,並假設這些事件都與主要音訊區域相關聯。收到音量鍵事件時,CarAudioService
會擷取當前玩家的音訊情境,然後調整音量群組,其中含有與最高優先音訊情境相關聯的輸出裝置,藉此判斷要調整的音量群組。優先順序是根據 CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
中定義的固定順序決定。
淡出和平衡
兩個 AudioControl HAL 版本都提供用於在車輛內設定淡出和平衡的 API。CarAudioManager 的對應系統 API 會將值傳遞至 AudioControl HAL。這些 API 需要 android.car.permission.CAR_CONTROL_AUDIO_VOLUME
。AudioControl API 包含:
setBalanceTowardRight(float value)
將喇叭音量轉向車輛的右 (+) 或左側 (-) 側。- 0.0 置中
- +1.0 是完全正確的
- -1.0 已充飽
- 如果值超出 -1 到 1 的範圍,表示發生錯誤
setFadeTowardFront(float value)
將喇叭音量轉向車輛的前 (+) 或後置 (-)。- 0.0 置中
- +1.0 完全正向
- -1.0 完全是背面
- 如果值超出 -1 到 1 的範圍,表示發生錯誤
您可以決定這些值的套用方式,以及如何向使用者顯示值。這些控制項可以嚴格套用至媒體或整個遊戲板上的所有 Android 音效。Android 11 也開始支援將音效套用至輸出裝置。這樣一來,您就能透過適當輸出裝置的音訊效果取代淡入和平衡,而非透過這些 API。
降低其他應用程式音量
在車輛減少一個串流的增益時,「降低其他應用程式音量」就會發生,讓同時播放的另一個串流可以更清楚地聽到。在 AAOS 中,HAL 會實作音訊「降低鴨」作業。Android 只能控製作業系統以外的聲音。在 Android 11 中,HAL 可用以協助作鴨決定的主要資訊是兩部輸出裝置是否都有啟用的串流。
何時適合游泳
雖然個別原始設備製造商 (OEM) 可以自行決定 HAL 如何處理降低鴨子的情形,但我們仍建議您遵循下列規範。
如果兩個應用程式或服務同時保留音訊焦點,經常會在 Android 中播放多個串流。如要瞭解 Android 何時可授予並行對焦,請參閱「限制類型」中的互動矩陣。導入車輛音訊外掛程式後,這也取決於音訊焦點管理方式。
Android 混合的串流作業會先進行,再套用任何收益。因此,在與其他串流同時播放時,應將任何串流應置於不同的輸出裝置,這樣 HAL 可以在混合前先套用「降低」狀態。
建議降低的降低其他應用程式音量
以下是建議同時降低並行互動次數的可能建議。
互動 | 動作 |
---|---|
EMERGENCY
| 將 SAFETY 以外的所有項目設為靜音或設為靜音 |
SAFETY |
填補 EMERGENCY 以外的所有項目 |
NAVIGATION |
填補 SAFETY 和 EMERGENCY 以外的所有項目 |
CALL |
填補 SAFETY 、EMERGENCY 和 NAVIGATION 以外的所有項目 |
VOICE |
鴨子 CALL_RING |
VEHICLE_SOUNDS |
由您判斷有效聲音的重要性,以及音效是否插入其他聲音。 |
MUSIC 和 ANNOUNCEMENT |
吃飽了。例外狀況是以 SYSTEM_SOUND 形式播放的觸控互動音效。
|
鴨子注意事項
部分應用程式和服務 (例如導航或 Google 助理) 可能會使用多人遊戲進行動作。避免在串流從輸出裝置流動的資料串流時,避免在下次透過導航或助理應用程式播放內容前 3 播放媒體之前,媒體不會回到最大音量。
如果車輛具有多個聲控階段,而且有足夠的隔離程度,可以將音訊轉送至車輛的不同區域,而不需鴨子。舉例來說,導航指示可以導向駕駛頭部的喇叭,同時在車廂中以正常音量繼續播放音樂。
安全重要聲響
Android 11 導入了 HAL 音訊焦點 API。HAL 可確保高安全音效的優先順序高於其他聲響。如果 HAL 為 USAGE_EMERGENCY
保留音訊焦點,則無法保證 Android 的應用程式和服務不會播放音效。HAL 可決定要將哪些 Android 串流混合或靜音,以播放具有安全保護的音效。
調整音量設定 UI
AAOS 將音量設定 UI 與磁碟區群組設定分離。您可以按照「設定磁碟區群組增益」中的說明來重疊這些內容。這種區隔可確保在變更磁碟區群組的設定時,不需要進行任何變更。
在車輛設定 UI 中,packages/apps/Car/Settings/res/xml/car_volume_items.xml
包含與每個定義的 AudioAttributes.USAGE
相關聯的 UI 元素 (名稱和圖示資源)。此檔案會使用每個 VolumeGroup
中包含且第一個所識別用量的關聯資源,以合理的方式呈現已定義的 VolumeGroups
。
舉例來說,以下範例將 VolumeGroup
定義為包含 voice_communication
和 voice_communication_signalling
。車輛設定 UI 的預設實作方式會使用與 voice_communication
相關聯的資源算繪 VolumeGroup
,因為這是檔案中的第一個 matc。
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
上述設定中使用的屬性和值會在 packages/apps/Car/Settings/res/values/attrs.xml
中宣告。音量設定 UI 會使用下列以 VolumeGroup
為基礎的 CarAudioManager API:
getVolumeGroupCount()
,瞭解應繪製的控制項數量。getGroupMinVolume()
和getGroupMaxVolume()
可取得下限和上限。- 如要取得目前的音量,請
getGroupVolume()
。 - 如要接收音量變化通知,請
registerVolumeChangeObserver()
。
汽車音量群組事件
音量更新和靜音切換按鈕的 Automotive 用途設有情境底座,可定義特定應用程式的動作,例如音量設定。車輛音訊堆疊的目前音量和靜音回呼所提供的情境資訊有限。為了更貼近汽車用途和日後的擴充性,我們在 Android 14 中新增了 CarVolumeGroupEvent。每個事件都包含三種關鍵資訊:
CarVolumeGroupInfo
的清單EventTypes
(位元對應)ExtraInfos
的清單
CarVolumeGroupInfo
事件回呼的接收器已準備好存取受影響的車輛音量群組資訊。這表示應用程式不需要再向車輛音訊架構呼叫,即可取得最新狀態。只要使用收到的 CarVolumeGroupInfos
更新使用者介面或內部狀態即可。為了方便應用程式,我們在 EventTypes
中也會提供汽車音量群組中發生變更的切面資訊,如下所述。
EventType
定義 CarVolumeGroupInfo
的哪些切面已變更。應用程式可藉此識別變更,並採取必要動作。舉例來說,EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
表示相應的 CarVolumeGroups
最高磁碟區增值索引已變更,且可使用 CarVolumeGroupInfo.getMaxVolumeGainIndex()
進行查詢。
下表顯示 EventType
和 CarVolumeGroupInfo
之間的關係。
事件類型 | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED | CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED | CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED | CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED | CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isDisabled() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
其他資訊
提供額外資訊,說明 CarVolumeGroup
變更的原因。應用程式可利用此資訊提供額外背景資訊,提醒使用者採取行動或傳送通知。例如,EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
表示由於熱量超載造成的有效暫時性警告。如果使用者想提高音量,應用程式可以通知使用者。
我們不會對 ExtraInfos
強制執行任何程序。您可以自行根據 ExtraInfos
決定這項程序。舉例來說,如果因 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
導致參與度處於啟用狀態,您也可以選擇最初將音量列 UI 淡出,避免使用者變更音量。其他則可以選擇顯示啟用降低的浮動式訊息,並允許使用者變更音量。
車輛音訊架構依附於 AudioControl HAL IAudioGainCallback
,以提供建議的 ExtraInfos
。詳情請參閱「音訊接收回呼」。
為滿足未來汽車音響架構的需求,CarVolumeGroupEvent
可進行擴充。我們決定僅透過 CarVolumeGroupEvent
支援新功能。強烈建議應用程式開發人員使用 CarVolumeGroupEvent
處理群組音量及靜音變更。
車輛音量群組事件回呼
Android 14 為具有特殊權限的平台應用程式提供新的回呼,以便註冊並接收 CarVolumeGroupEvents
的通知。
如要註冊回呼,請使用
CarAudioManager#registerCarVolumeGroupEventCallback()
如要取消註冊回呼,請使用
CarAudioManager#unregisterCarVolumeGroupEventCallback()
如果應用程式使用新版 CarVolumeGroupEventCallback
和舊版 CarVolumeCallback
註冊,系統會優先處理 CarVolumeGroupEventCallbacks
事件。車輛音訊堆疊不會再觸發 CarVolumeCallback
。這樣可以避免在同一個事件發生時,重複觸發同一應用程式。
強烈建議您使用 CarVolumeGroupEventCallback
管理群組音量及靜音變更。
音訊增益回呼
自 Android 13 起,AudioControl HAL 可以觸發非同步回呼,以管理因車輛音訊系統變更而導致的音量更新。
HAL API
AudioControl @2.0 AIDL
AudioControl AIDL HAL 2.0 版新增了下列 API:
API | 目的 |
---|---|
IAudioControl#registerGainCallback |
使用 AudioControl HAL 註冊 IAudioGainCallback 的執行個體。 |
IAudioGainCallback#onAudioDeviceGainsChanged |
用於通知音訊增益設定變更的非同步回呼。 |
AudioControl HAL 回呼包含原因清單和個別 AudioGainConfigInfo
,其中包含:
- 區域 ID
- 裝置通訊埠位址
- 磁碟區索引 > 索引可以是受限索引或更新索引。
原因可大致區分為:
- 限制原因。暫時變更為音量和靜音行為。
- 更新原因。音量行為永久變更。
限制類型
自 AudioControl
HAL AIDL
V3
起,支援的限制類型如下:
- 靜音
- 會使影片被封鎖
- 限制
- 注意力
有效限制 | 使用者觸發的次數變化 | 使用者觸發的靜音切換鈕 |
---|---|---|
靜音 | ❌ | ❌ (取消靜音) ✔ (靜音) |
會使影片被封鎖 | ❌ | ✔ |
限制 | ❌ (超過限制) ✔ (低於上限) |
✔ |
注意力 | ✔ | ✔ |
限制之間的優先順序為「靜音」>「封鎖」>「限制」>「關注」。
忽略限制
靜音限制如下:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
車輛音訊架構內部會維持兩種靜音狀態:
使用者靜音。依據使用者的要求進行切換,例如透過
CarAudioManager
或重要事件。HAL 靜音。根據透過
AudioGain
回呼收到的靜音限制進行切換。
對於「設定」應用程式等事件監聽器,系統會根據是否啟用上述任一靜音設定,決定音量群組整體靜音 (CarVolumeGroupInfo.isMuted()
) 狀態。
啟用 HAL 靜音功能後,在限制期間內,系統會忽略所有連入磁碟區變更和群組取消靜音要求。
互動情況:HAL 靜音功能已啟用,且使用者要求靜音切換鈕
如果 HAL 靜音已啟用且使用者靜音功能處於停用狀態:
- 音量群組的整體靜音狀態已變更為「
true
」。 - 系統會處理使用者提出的靜音設定要求。
- 原因:為了保護使用者隱私,系統應隨時接受使用者忽略要求。
如果已啟用 HAL 靜音功能並啟用使用者靜音功能:
音量群組的整體靜音狀態已變更為「
true
」。系統會
NOT
處理使用者提出的停用靜音設定。快取使用者靜音狀態會保持啟用。原因:只有在沒有啟用限制的情況下,系統才會遵循使用者取消忽略要求。
原因:取消靜音快取的使用者靜音設定可能會導致意外音效爆炸,並危害使用者安全。如果跨源週期啟用靜音狀態,導致使用者無法察覺聲音水平感知能力,就會更是如此。
互動情況:HAL 靜音功能已啟用和停用,但使用者靜音功能沒有改變
如果切換 HAL 靜音設定,音量群組的整體靜音狀態會跟著變更。但是,不會直接更新使用者的靜音狀態,當系統停用使用者靜音,且收到要啟用 HAL 靜音回呼時:
- 音量群組的整體靜音狀態已變更為「
true
」。 在 HAL 靜音功能啟用的情況下,系統會處理使用者發出的
NOT
變更音量要求。原因:啟用靜音功能時,使用者無法察覺音效。允許變更音量可能會導致聲音曝露,並危及使用者的安全。
原因:如果這是原始設備製造商 (OEM) 的預期行為,音量應用程式可以註冊回呼並觸發取消靜音 (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)),且不需要使用者介入。
在使用者靜音功能停用的情況下,停用 HAL 靜音功能:
音量群組的靜音狀態已變更為「
false
」。原因:在靜音狀態經常切換時,如果維持靜音狀態並要求使用者取消靜音,可能會無端幹擾使用者。
我們會照常處理使用者的要求變更音量。
會使影片被封鎖
封鎖限制如下:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
。
啟用封鎖限制後,使用者提出的要求如下:
- 系統不會處理變更音量。
- 系統已處理切換靜音的操作。
限制
相關限制如下:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
啟用限制限制後,使用者會執行以下動作:
調整音量:
- 會在限制範圍內處理
- 系統不會處理超過限制的部分
系統已處理切換靜音的操作。
注意力
注意力限制如下:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
啟用注意力限制時,使用者會執行以下動作:
已處理變更音量。新的目前音量設定為受攻擊的音量 (而非 erstwhile 的音量)。未來的磁碟區會由這個層級進行變更。
已取消靜音切換鈕。
更新為索引
系統會將以下項目視為非同步磁碟區索引更新作業:Reasons.EXTERNAL_AMP_VOL_FEEDBACK
。
因此,AudioControl HAL 可將磁碟區群組目前的索引更新為指定的索引。這主要用做音訊系統對於汽車音訊架構的音量變更要求的意見回饋。索引更新也會以 CarVolumeGroupEvent
回呼的形式與應用程式通訊,以同步處理索引。
範例
用途:使用者將磁碟區索引更新為 30
使用者使用 Volume 應用程式將磁碟區索引變更為 30。
這個索引會轉換為增加量,並傳送至音訊 HAL。
供應商實作的
Audio HAL
會接收新的音量增益並更新音訊系統 (例如外部 AMP)。音訊系統回應,音量等級僅更新為索引 15 (出於 Android 未知的原因)。
供應商導入
AudioControl HAL
觸發條件:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
車輛音訊服務會從用於持續性及對音量應用程式回呼的回呼取用新索引。使用者要求的索引為 30。不過,音訊系統非同步回饋會將索引更新為 15。
用途:結束暫停後首次播放音訊
暫停前的磁碟區索引設為高等級 95 (範圍:[0-99])。
Android 進入暫停狀態。
Android 暫停使用後 (例如繼續使用):
供應商
Audio HAL/AudioControl HAL
會在本機將安全索引 30 套用至音訊系統。供應商
AudioControl HAL
也會觸發安全索引的回呼:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
車輛音訊服務會從用於持續性的回呼取用新索引,以及其對磁碟區應用程式本身的回呼 (用於同步處理索引)。暫停前的磁碟區索引為 95。不過重新啟用後,
AudioControl HAL
實作器會將這個索引設為 30 的安全磁碟區。
動態磁碟區設定
對於這項功能,我們會考量下列主要用途:
車輛線路 (EOL) 設定。
汽車製造商偏好根據車輛音訊系統設定,更新 EOL 的音量設定。通常這是側載,但不會更新 Android SW 映像檔。
汽車製造商可能需要在服務時間表中更新磁碟區設定。
執行階段設定。Automotive 音訊系統支援外部擴大器設定,這些 ECU 可能會代管啟動期間查詢的磁碟區範圍設定。
隨選設定。這項服務是為了因應日益增長的使用者需求型音訊功能的需求,亦即使用者需在一段時間內訂閱進階訊號處理服務。新的磁碟區範圍設定在訂閱期間有效。
設計
動態磁碟區設定分為三個階段:
探索:供應商 AudioControl HAL 實作會透過供應商擁有的自訂 IPC 機制探索新的磁碟區範圍更新。
找到之後,系統會透過
AudioControl::IModuleChangeCallback
產生回呼。更新。車輛音訊堆疊會使用新的音量範圍更新音量群組狀態。
在更新量範圍後,系統會採取相同措施,讓磁碟區保持不變。不過,如果索引超出範圍,系統會將目前的磁碟區索引設為安全值。例如廠商在回呼期間提供的預設樓層。
回呼。
發布音量群組範圍更新後,車輛音訊堆疊會觸發回呼,向透過
CarVolumeGroupEventCallback
註冊的應用程式觸發回呼。CarVolumeGroupEvent
提供更新後的CarVolumeGroupInfo
、事件類型 (變更的內容) 和額外資訊 (為何變更)。
圖 1 動態磁碟區設定。
HAL API
AudioControl @ 3.0 AIDL
AudioControl AIDL HAL 3.0 版推出了下列 API:
API | |
---|---|
IAudioControl#setModuleChangeCallback | 使用 AudioControl HAL 設定 IModuleChangeCallback 的執行個體。 |
IAudioControl#clearModuleChangeCallback | 清除先前透過 AudioControl HAL 設定的 IModuleChangeCallback 例項。 |
IModuleChangeCallback#onAudioPortsChanged | 用於通知 AudioPorts 異動的回呼 |
順序
動態磁碟區設定序列圖表如下所示。
圖 2. 動態磁碟區設定序列圖。
重要層面
如要改善這項功能,請考慮以下事項。
回呼中隨附的 AudioPorts必須與 Automotive BUS 定義相符:
- 裝置通訊埠。
IN_DEVICE
、OUT_DEVICE
- 連線。
BUS
- 地址:由「音訊 HAL」定義所定義
- 增益模式。
JOINT
- 裝置通訊埠。
供應商必須在音訊 HAL 政策中定義音量範圍定義的超集,並使用回呼來自訂車輛變體。詳情請參閱
IModuleChangeCallbac
AIDL 定義。如果多個音訊 BUS 屬於同一個音量群組,則每個音訊的 BUS 音量都必須具有相同的音量範圍定義。否則車輛音訊架構會拒絕新的音量範圍定義。