音量管理功能包含在 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。任何 API 在沒有 zoneId
的情況下,都會將 groupId
設為預設的音訊區。
多區域音量管理
每個音訊區域都應包含一或多個音量群組,且每個音量群組只會與單一音訊區域相關聯。這項關係是在 car_audio_configuration.xml
中定義。如需更多資訊,請參閱「定義磁區群組」一節中的範例。
每個區域的目前音量會保留給與該區域相關聯的使用者。這些設定是針對區域而定,也就是說,如果使用者在與主要區域相關聯的螢幕上登入,然後稍後登入與次要音訊區域相關聯的區域,則第一個區域載入和保留的音量級別,與次要區域的音量級別不同。
處理音量鍵事件
Android 定義了幾個用於音量控制的鍵碼,包括:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
根據預設,Android 會將音量鍵事件轉送至應用程式。車用系統實作項目應強制讓這些按鍵事件由 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 可用來做出靜音決策的主要資訊,是兩個輸出裝置是否都有有效的串流。
何時要降低音量
雖然 HAL 如何處理靜音功能,是由個別原始設備製造商 (OEM) 決定,但我們建議遵循下列指南。
當兩個應用程式或服務同時保有音訊焦點時,通常會在 Android 中播放多個串流。如要瞭解 Android 何時可能授予並行焦點,請參閱「限制類型」中的互動矩陣。隨著車輛音訊外掛程式的推出,這也取決於您的 AudioFocus 管理方式。
任何由 Android 混合在一起的串流,都是在任何增益值套用之前完成。因此,任何在與其他內容同時播放時應進行鴨嘴處理的串流,都應導向個別輸出裝置,以便 HAL 在混合前套用鴨嘴處理。
建議的靜音行為
以下是建議同時進行的互動內容。
互動 | 動作 |
---|---|
EMERGENCY
| 將 SAFETY 以外的所有音訊靜音或設為靜音
|
SAFETY |
除了 EMERGENCY 以外,所有內容都會被靜音 |
NAVIGATION |
除了 SAFETY 和 EMERGENCY 以外,所有內容都會被偵測 |
CALL |
除了 SAFETY 、EMERGENCY 和 NAVIGATION 以外,所有內容都會遭到拒絕 |
VOICE |
Ducks CALL_RING |
VEHICLE_SOUNDS |
您可以決定主動式音效的重要性,以及是否要讓其他音效降低音量。 |
MUSIC 和ANNOUNCEMENT |
所有人都能避開。例外狀況是播放 SYSTEM_SOUND 的觸控互動音效。 |
使用靜音功能時的注意事項
部分應用程式和服務 (例如導航或助理) 可能會使用多個播放器來執行動作。當資料串流停止透過輸出裝置流動時,請避免過度降低音量,以確保媒體不會在導航或助理應用程式開始播放下一個內容前,就將音量調低。
如果車輛有數個音訊階段,且隔離效果良好,您可以將音訊傳送至車輛的不同區域,而非降低音量。舉例來說,您可以將導航指示傳送到駕駛座椅頭枕的揚聲器,同時在車內以正常音量繼續播放音樂。
安全性關鍵音效
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
,因為這是檔案中的第一個相符項目。
<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()
以便接收音量變更通知。
車輛音量群組事件
音量更新和靜音切換鈕的汽車用途有背景資訊,可定義特定應用程式的動作,例如音量設定。車輛音訊堆疊提供的目前音量和靜音回呼提供的背景資訊有限。為更好地支援汽車用途和日後的可擴充性,Android 14 新增了 CarVolumeGroupEvent。每個事件都會提供三種重要資訊類型:
- 「
CarVolumeGroupInfo
」的清單 EventTypes
(位元映射)- 「
ExtraInfos
」的清單
CarVolumeGroupInfo
事件回呼的接收端已準備好存取受影響的車輛音量群組資訊清單。也就是說,應用程式不需要對車輛音訊架構額外呼叫,即可取得最新狀態。它可以只使用收到的 CarVolumeGroupInfos
更新 UI 或內部狀態。為了讓應用程式更容易使用,在汽車音量群組中變更的各個層面也會提供為 EventTypes
的一部分,如下所述。
EventTypes
定義 CarVolumeGroupInfo
的哪個部分已變更。應用程式可利用這項資訊識別變更,並採取必要的動作。舉例來說,EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
表示相應的 CarVolumeGroups
最大音量增益索引已變更,且可透過 CarVolumeGroupInfo.getMaxVolumeGainIndex()
查詢。
下表顯示 EventType
和 CarVolumeGroupInfo
之間的關係。
EventType | 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.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
提供 CarVolumeGroup
變更原因的其他資訊。應用程式可以使用這項資訊提供額外的背景資訊,以便提醒使用者採取行動或發出通知。舉例來說,EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
表示熱負載導致主動瞬態衰減。應用程式可以通知使用者,他們是否嘗試調高音量。
我們不會強制執行任何 ExtraInfos
程序。您可以自行決定是否要根據 ExtraInfos
決定程序。舉例來說,如果衰減因 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
而啟用,您也可以選擇一開始淡出音量列 UI,以免使用者變更音量。其他應用程式可能會選擇顯示彈出式訊息,指出系統已啟用調低音量功能,並允許使用者變更音量。
車輛音訊架構會依賴 AudioControl HAL IAudioGainCallback
,以提供建議的 ExtraInfos
。詳情請參閱「Audio Gain 回呼」。
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 |
將 IAudioGainCallback 例項註冊至 AudioControl HAL。 |
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
。原因:使用者在啟用靜音功能時無法聽到聲音。允許音量變化可能會導致音量爆衝,並危害使用者安全。
原因:如果這是原始設備製造商預期的行為,音量應用程式可以註冊回呼,並在無需使用者介入的情況下自動觸發取消靜音 (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
當衰減限制生效時,使用者提出下列要求:
系統會處理變更音量。新的目前音量等級會設為衰減音量 (而非先前的音量)。日後的音量變更會從這個層級進行。
處理切換靜音功能。
更新索引
以下項目視為非同步的音量索引更新:Reasons.EXTERNAL_AMP_VOL_FEEDBACK
。
因此,AudioControl HAL 可以將音量群組目前索引更新為指定的索引。這項資訊主要用於音訊系統針對車輛音訊架構的音量變更要求提供的回饋。索引更新也會以 CarVolumeGroupEvent
回呼的形式與應用程式進行通訊,以便同步處理索引。
範例
用途:使用者將音量指標更新為 30
使用者使用 Volume 應用程式將音量索引值變更為 30。
這個索引會轉換為音量增益,並傳送至 Audio HAL。
供應商實作
Audio HAL
會收到新的音量增益,並更新音訊系統 (例如外部擴大機)。音訊系統回應,音量等級只會更新至索引 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) 設定。
汽車製造商傾向根據車輛音響系統設定,在產品生命週期結束時更新音量設定。通常這是不更新 Android 軟體映像檔的側載作業。
汽車製造商可能需要在維修保養期間更新音量設定。
執行階段設定。車用音響系統支援外部擴大機設定,這些 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
- Connection.
BUS
- 地址。在 Audio HAL 定義中定義
- 增益模式。
JOINT
- 裝置連接埠
供應商必須在 Audio HAL 政策中定義音量範圍定義的超集,並使用回呼將其自訂為車輛變化版本。詳情請參閱
IModuleChangeCallbac
AIDL 定義。如果有多個音訊匯流排屬於同一個音量群組,則每個匯流排必須具有相同的音量範圍定義。否則汽車音訊架構會拒絕新的音量範圍定義。