磁碟區管理

AAOS 是 CarAudioService 內專屬的磁碟區管理作業。使用固定 預期磁碟區應在 HAL 之下套用的磁碟區 而不是軟體並將輸出裝置分類為磁碟區群組 ,對與磁碟區群組相關聯的所有裝置套用相同強化效果。

使用固定磁碟區

實作 AAOS 時,應使用硬體擴大器 (而非 軟體混合程式如要避免副作用,請設定 config_useFixedVolume 標記 變更為 true (視需要疊加):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

如未設定 config_useFixedVolume 標記 (或設為 false), 應用程式可以呼叫 AudioManager.setStreamVolume() 並變更 在軟體混合器中按串流類型細分這可能不是理想的結果 以及這些模型對於其他應用程式的潛在影響,以及 在 2017 年間 從硬體擴大器接收的

磁碟區群組

音量群組可用來管理音訊區域中一系列裝置的音量。 每個音量群組的音量都可以獨立控制, 增益會設定在關聯裝置上,供車輛擴音器套用。 音量設定會保留給使用者,並在使用者登入時載入。

定義磁碟區群組

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>

car_audio_configuration.xml 實作範例。

每個磁碟區群組都應含有一或多部相關聯的位址輸出裝置。 這些位址應與 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_UPKEYCODE_VOLUME_DOWNKEYCODE_VOLUME_MUTE。Android 預設會轉送音量鍵 將事件套用至應用程式Automotive 實作項目應強制這些重要事件 CarAudioService,隨後可以呼叫 setGroupVolumesetMasterMute

如要強制執行此行為,請設定 config_handleVolumeKeysInWindowManager 標記為 true

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

磁碟區重要事件目前無法辨別活動所在的可用區 ,並假設所有這類情況都與主要音訊區域有關。 收到音量重要事件時,CarAudioService 會判斷數量 擷取玩家的音訊內容,然後根據這些條件進行調整 磁碟區群組 (包含與最高優先順序相關聯的輸出裝置) 音訊情境。優先順序是根據 CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY

淡出和平衡

兩個 AudioControl HAL 版本都包含用於設定淡入/淡出和平衡的 API 。有專用的系統 API 可供 CarAudioManager 傳送值 降到 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 範圍外的值即為錯誤。

這些值的套用方式及套用方式是由原始設備製造商 (OEM) 決定。 向目標對象曝光可以嚴格應用在媒體/整個媒體平台 所有 Android 音效都能因此

Android 11 也開始支援將音效套用至輸出裝置。 換句話說,你也能透過音效管理淡入和平衡 而非透過這些 API。

降低其他應用程式音量

當車輛降低某個串流的增益時,會發生音訊降低音量 ,就能更清楚地聽到其他正在播放的串流內容。在 AAOS 中 「降低背景音量」會由 HAL 施行,因為可能會有許多聲響 而作業系統具有絕對控制權在 Android 11 中,主要資訊 HAL 負責決定裝置 包括兩個輸出裝置 或有效的串流。

何時適合游泳

雖然個別原始設備製造商 (OEM) 可以決定 HAL 如何處理鴨子,但 以下提供一些一般指南在 Android 中同時播放多個串流 最常見的原因是兩個應用程式/服務同時保留音訊焦點。瞭解這些之後 請參閱互動矩陣 瞭解 Android 何時可授予並行焦點,進而瞭解何時可能在兩種情況下 分別播放不同串流內容

請注意,Android 混合的串流作業會先進行,才能獲得收益 因此,在與多人同時線上播放, 另一個應轉送至不同的輸出裝置,這樣 HAL 可以 混合使用

建議降低的降低其他應用程式音量

以下是我們建議同時採用的模擬互動次數 待套用的項目:

  • EMERGENCY。將SAFETY以外的所有裝置置放或設為靜音 確保駕駛聽到聲音
  • SAFETY。除EMERGENCY外,所有其他物品均須擦乾,以確保 駕駛會聽到聲音
  • NAVIGATION。鴨子和SAFETY除外 EMERGENCY
  • CALL。去清「SAFETY」以外的所有物品, EMERGENCYNAVIGATION
  • VOICE。鴨子 CALL_RING
  • 有效 VEHICLE_SOUNDS 的重要性取決於原始設備製造商 (OEM) 決定 以及是否該折疊其他聲音,確保駕駛能聽到聲音。
  • 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 檔案包含與每個定義的 UI 元素 (名稱和圖示資源) 相關聯的 UI 元素 AudioAttributes.USAGE。這個檔案以合理的 定義VolumeGroups,方法是使用與第一個 識別出每個 VolumeGroup 中的使用量。

例如,以下範例將 VolumeGroup 定義為包含 《voice_communication》和《voice_communication_signalling》。預設 車輛設定 UI 的實作方式會使用 就用 voice_communication,因為這是檔案中的第一個選項。

<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()