音量管理包含在 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="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</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 15 推出音量群組索引控制項,可提升車用音訊系統的安全性及使用者舒適度。這是透過使用最低和最高啟用音量來達成,這些音量是在車輛音訊設定中設定 (請參閱「定義音量群組」)。如要啟用這項功能,請在車輛服務 RRO 中將 audioUseMinMaxActivationVolume 設為 true。
您可以在 activationVolumeConfigs 中定義多個 activationVolumeConfig 項目,每個項目代表不同的啟動設定下限和上限。每個 activationVolumeConfig:
- 車輛音訊設定檔中必須包含專屬
name,以便日後在音量群組 (group) 中參照。 - 只能包含一個
activationVolumeConfigEntry。
每個 activationVolumeConfig 都包含下列屬性:
minActivationVolumePercentage(整數,0 到 100,選用,預設值:0):指定最低啟用音量百分比。maxActivationVolumePercentage(整數,0 到 100,選用,預設值:100):指定啟用音量上限 (以百分比表示)。invocationType(字串,選用,預設值:onPlaybackChanged):定義套用最低和最高啟用音量的條件:onBoot:僅適用於啟動後音量群組中第一個新啟用的播放內容。onSourceChanged:僅適用於音量群組中,應用程式或 UID 來源變更後新啟用的播放作業。onPlaybackChanged:適用於音量群組中每個新啟用的播放內容。
CarAudioService 會監控下列目前啟用的音訊子元件,管理最低和最高啟用次數:
- 目前正在播放的曲目
- 目前通話狀態
- 音訊控制 HAL 目前的音訊焦點要求,其中音訊控制 HAL 的音訊焦點要求會發出信號,表示 Android 外部正在播放音訊
下圖顯示啟動量管理最低和最高值的概要總覽:
圖 1. 管理作用中音訊資料路徑的最小和最大啟動音量。
指定 minActivationVolumePercentage、maxActivationVolumePercentage、最小和最大音量增益指數後,即可計算每個音量群組的最小和最大啟動音量增益指數。CarAudioService
會監控每個新啟用的播放作業,並在下列情況下套用最低和最高啟用音量:
- 叫用類型相符:播放的啟動類型 (衍生自音訊管理工具、音訊控制 HAL 或電話管理工具) 必須與音量群組相關聯的
activationVolumeConfigEntry中指定的invocationType相符。 音量索引超出範圍:音量群組目前的音量增益索引必須超出定義的啟用音量增益索引範圍,具體來說,下列其中一項為真:
該指數低於計算出的最低啟用量增幅指數。
或
索引高於計算出的最大啟用量增幅索引。
如果啟用相符,音量群組的音量增益指數會調整為下列其中一項:
如果低於最低啟用量增幅指數,則為最低啟用量增幅指數
或
如果高於最大啟動音量增益指數,則為最大啟動音量增益指數
此外,系統會將事件類型為 EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED 的車輛音量群組事件,傳送至所有已註冊的音量群組事件回呼。
處理音量鍵事件
Android 定義了多個音量控制鍵碼,包括:
KEYCODE_VOLUME_UPKEYCODE_VOLUME_DOWNKEYCODE_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 傳遞的值對應至 AudioControl HAL 的系統 API。這些 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 何時可能會授予並行焦點,請參閱「限制類型」中的互動矩陣。隨著車輛音訊外掛程式的推出,這也取決於您的 AudioFocus 管理方式。
Android 會先混合所有音訊串流,再套用任何增益。因此,如果某個音訊串流與其他音訊串流同時播放時應降低音量,就必須將該串流路徑設為獨立的輸出裝置,HAL 才能在混音前套用音量降低效果。
建議的閃避行為
建議使用下列潛在的並行互動。
| 互動 | 動作 |
|---|---|
EMERGENCY
| 除了 SAFETY 以外,所有內容都會調低音量或設為靜音
|
SAFETY |
除了 EMERGENCY 以外,所有內容都會被遮蓋 |
NAVIGATION |
除了 SAFETY 和 EMERGENCY 以外,所有內容都會閃避 |
CALL |
Ducks 所有內容,但 SAFETY、EMERGENCY 和 NAVIGATION 除外 |
VOICE |
鴨子 CALL_RING |
VEHICLE_SOUNDS |
你可以決定現正播放的音效是否重要,以及是否要調低其他音效的音量。 |
MUSIC和ANNOUNCEMENT |
所有東西都躲起來了。例外狀況是輕觸互動音調,會以 SYSTEM_SOUND 播放。
|
閃避的注意事項
部分應用程式和服務 (例如導航或 Google 助理) 可能會使用多個播放器執行動作。當資料串流停止流經輸出裝置時,請避免過度取消音量調降,確保媒體不會在音量調降前返回完整音量,然後從導覽或助理應用程式啟動下一次播放。
如果車輛有多個音場,且隔離效果良好,你可以將音訊傳送到車輛的不同區域,而不是降低音量。舉例來說,導航指示可以傳送到駕駛座頭枕音箱,同時繼續在車內以正常音量播放音樂。
安全關鍵音效
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(),瞭解應繪製多少個控制項。- 和
getGroupMaxVolume()取得上下界限。getGroupMinVolume() 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。詳情請參閱「音訊增益回呼」。
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_MUTEReasons.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_MUTEReasons.REMOTE_MUTEReasons.TCU_MUTE。
啟用封鎖限制後,使用者將無法:
- 系統不會處理音量變更。
- 切換靜音狀態。
限制
限制如下:
Reasons.THERMAL_LIMITATIONReasons.SUSPEND_EXIT_VOL_LIMITATION
啟用限制後,使用者將無法:
調整音量:
- 在限制範圍內處理
- 系統不會處理上述限制
切換靜音狀態。
衰減
衰減限制如下:
Reasons.ADAS_DUCKINGReasons.NAV_DUCKINGReasons.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) 設定。
車廠偏好在 EOL 時,根據車輛音訊系統設定更新音量設定。通常這是指側載,且不會更新 Android 軟體映像檔。
車廠可能需要在服務排程期間更新音量設定。
執行階段設定。車輛音訊系統支援外部擴音器設定,這些 ECU 可能會主機在啟動時查詢的音量範圍設定。
隨選設定。這項功能可滿足使用者對隨選音訊功能日益成長的需求,讓使用者在一段時間內訂閱強化信號處理功能。新的音量範圍設定在訂閱期間有效。
設計
動態音量設定分為三個階段:
探索。供應商 AudioControl HAL 實作項目會透過供應商擁有的自訂 IPC 機制,探索新的音量範圍更新。
發現後,系統會透過
AudioControl::IModuleChangeCallback產生回呼。更新。車輛音訊堆疊會使用新的音量範圍更新音量群組狀態。
系統會盡量在音量範圍更新後維持相同的音量。 不過,如果索引超出範圍,目前的音量索引會設為安全值。例如,供應商在回呼期間提供的預設層級。
回呼。
更新音量群組範圍後,車輛音訊堆疊會觸發回呼,傳送至透過
CarVolumeGroupEventCallback註冊的應用程式。CarVolumeGroupEvent包含更新的CarVolumeGroupInfo、事件類型 (變更內容) 和額外資訊 (變更原因)。
圖 2. 動態磁碟區設定。
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 | 回呼,用於通知 AudioPort 的變更 |
順序
動態磁碟區設定的序列圖如下所示。
圖 3. 動態磁碟區設定的序列圖。
重要層面
如要充分發揮這項功能的效果,請注意下列事項。
做為回呼一部分提供的 AudioPort 必須符合 Automotive BUS 定義:
- 裝置連接埠:
IN_DEVICE、OUT_DEVICE - 連結。
BUS - 地址。在 Audio HAL 定義中定義
- 增益模式。
JOINT
- 裝置連接埠:
供應商必須在 Audio HAL 政策中定義音量範圍定義的超集,並使用回呼為車輛變體自訂音量範圍。詳情請參閱
IModuleChangeCallbacAIDL 定義。如果多個音訊 BUS 屬於同一個音量群組,則每個 BUS 必須具有相同的音量範圍定義。否則車輛音訊架構會拒絕新的音量範圍定義。