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_UP
、KEYCODE_VOLUME_DOWN
和
KEYCODE_VOLUME_MUTE
。Android 預設會轉送音量鍵
將事件套用至應用程式Automotive 實作項目應強制這些重要事件
CarAudioService
,隨後可以呼叫 setGroupVolume
或
setMasterMute
。
如要強制執行此行為,請設定 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
」以外的所有物品,EMERGENCY
及NAVIGATION
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()
。