磁碟區管理

音量管理包含在 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 範圍為 0N-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. 管理作用中音訊資料路徑的最小和最大啟動音量。

指定 minActivationVolumePercentagemaxActivationVolumePercentage、最小和最大音量增益指數後,即可計算每個音量群組的最小和最大啟用音量增益指數。CarAudioService 會監控每個新啟用的播放作業,並在下列情況下套用最低和最高啟用音量:

  • 叫用類型相符:播放的啟動類型 (衍生自音訊管理工具、音訊控制 HAL 或電話管理工具) 必須與音量群組相關聯的 activationVolumeConfigEntry 中指定的 invocationType 相符。
  • 音量索引超出範圍:音量群組的目前音量增益索引必須超出定義的啟用音量增益索引範圍,具體來說,必須符合下列其中一項條件:

    • 該指數低於計算出的最低啟用量增幅指數。

    • 索引高於計算出的最大啟用量增幅索引。

如果啟用比對成功,音量群組的音量增幅指數會調整為下列其中一項:

  • 如果低於最低啟用量增幅指數,則為最低啟用量增幅指數

  • 如果高於最大啟動音量增益指數,則為最大啟動音量增益指數

此外,系統會將事件類型為 EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED 的車輛音量群組事件,傳送至所有已註冊的音量群組事件回呼。

處理音量鍵事件

Android 定義了多個音量控制鍵碼,包括:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

根據預設,Android 會將音量鍵事件傳送至應用程式。車輛實作項目應強制 CarAudioService 處理這些按鍵事件,然後視情況呼叫 setGroupVolumesetMasterMute。如要強制執行這項行為,請將 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 除了 SAFETYEMERGENCY 以外,所有內容都會變暗
CALL 除了 SAFETYEMERGENCYNAVIGATION 以外,所有內容都會模糊處理
VOICE 鴨子 CALL_RING
VEHICLE_SOUNDS 你可以決定現正播放的音效是否重要,以及是否要調低其他音效的音量。
MUSICANNOUNCEMENT 所有東西都躲起來了。例外狀況是觸控互動音調,會以 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_communicationvoice_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() 查詢。

下表顯示 EventTypeCarVolumeGroupInfo 之間的關係。

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。

動態磁碟區設定

這項功能主要適用於下列用途:

  1. 車輛停產 (EOL) 設定。

    • 車廠偏好在 EOL 時,根據車輛音訊系統設定更新音量設定。通常這是指側載,且未更新 Android 軟體映像檔。

    • 車廠可能需要在服務排程期間更新音量設定。

  2. 執行階段設定。車輛音訊系統支援外部擴大機設定,這些 ECU 可能會主機在啟動時查詢的音量範圍設定。

  3. 隨選設定。這項功能可滿足使用者對隨選音訊功能日益成長的需求,讓使用者在一段時間內訂閱強化信號處理功能。新的音量範圍設定在訂閱期間有效。

設計

動態磁碟區設定分為三個階段:

  • 探索。供應商 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_DEVICEOUT_DEVICE
    • 連結BUS
    • 地址。在音訊 HAL 定義中定義
    • 增益模式。 JOINT
  • 供應商必須在 Audio HAL 政策中定義音量範圍定義的超集,並使用回呼針對車輛變體自訂音量範圍。詳情請參閱 IModuleChangeCallbac AIDL 定義。

  • 如果多個音訊 BUS 屬於同一個音量群組,則每個 BUS 必須具有相同的音量範圍定義。否則車輛音訊架構會拒絕新的音量範圍定義。