音量管理包含在 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_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 傳遞的值對應至 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 |
除了 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()
,瞭解應繪製多少控制項。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
。詳情請參閱「音訊增益回呼」。
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
啟用衰減限制後,使用者提出的下列要求會遭到拒絕:
系統會處理音量變更。新的音量等級會設為衰減後的音量 (而非先前的音量)。日後音量變更將從這個層級進行。
切換靜音作業已完成。
更新索引
以下情況視為非同步更新卷冊索引:
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
- 地址。在音訊 HAL 定義中定義
- 增益模式。
JOINT
- 裝置連接埠:
供應商必須在 Audio HAL 政策中定義音量範圍定義的超集,並使用回呼針對車輛變體自訂音量範圍。詳情請參閱
IModuleChangeCallbac
AIDL 定義。如果多個音訊 BUS 屬於同一個音量群組,則每個 BUS 必須具有相同的音量範圍定義。否則車輛音訊架構會拒絕新的音量範圍定義。