AAOS มีการจัดการวอลุ่มของตนเองภายใน CarAudioService
โดยจะใช้ระดับเสียงคงที่โดยคาดหวังว่าระดับเสียงควรใช้ต่ำกว่า HAL โดยเครื่องขยายเสียงฮาร์ดแวร์แทนที่จะใช้กับซอฟต์แวร์ รวมถึงจัดระเบียบอุปกรณ์เอาต์พุตเป็นกลุ่มระดับเสียงเพื่อใช้อัตราขยายเดียวกันกับอุปกรณ์ทั้งหมดที่เชื่อมโยงกับกลุ่มระดับเสียง
การใช้ปริมาณคงที่
การติดตั้งใช้งาน AAOS ควรควบคุมระดับเสียงโดยใช้เครื่องขยายเสียงฮาร์ดแวร์แทนตัวผสมสัญญาณซอฟต์แวร์ หากต้องการหลีกเลี่ยงผลข้างเคียง ให้ตั้งค่า Flag config_useFixedVolume
เป็น true (วางซ้อนตามความจำเป็น)
<resources> <!-- Car uses hardware amplifier for volume. --> <bool name="config_useFixedVolume">true</bool> </resources>
เมื่อไม่ได้ตั้งค่า Flag config_useFixedVolume
(หรือตั้งค่าเป็น False) แอปพลิเคชันจะเรียก AudioManager.setStreamVolume()
และเปลี่ยนระดับเสียงตามประเภทสตรีมในมิกเซอร์ซอฟต์แวร์ได้ ซึ่งอาจไม่เหมาะสมเนื่องจากอาจส่งผลต่อแอปพลิเคชันอื่นๆ และข้อเท็จจริงที่ว่าระดับเสียงที่ลดลงในมิกเซอร์ซอฟต์แวร์จะทำให้สัญญาณที่มีบิตสำคัญมีจำนวนน้อยลงเมื่อรับสัญญาณที่เครื่องขยายเสียงฮาร์ดแวร์
กลุ่มระดับเสียง
กลุ่มระดับเสียงจะจัดการระดับเสียงของคอลเล็กชันอุปกรณ์ภายในโซนเสียง คุณสามารถควบคุมระดับเสียงของกลุ่มระดับเสียงแต่ละกลุ่มได้อย่างอิสระ และระบบจะกำหนดค่าอัตราขยายเสียงที่ได้ในอุปกรณ์ที่เกี่ยวข้องเพื่อให้แอมพลิฟายเออร์ของรถนำไปใช้ การตั้งค่าระดับเสียงจะคงอยู่สำหรับผู้ใช้และจะโหลดเมื่อผู้ใช้ลงชื่อเข้าใช้
การกําหนดกลุ่มระดับเสียง
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
กลุ่มโวลุ่มแต่ละกลุ่มควรมีอุปกรณ์เอาต์พุตอย่างน้อย 1 เครื่องที่มีที่อยู่เชื่อมโยง
ที่อยู่เหล่านี้ควรสอดคล้องกับอุปกรณ์เอาต์พุตที่กําหนดไว้ใน 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>
ในระหว่างการเริ่มต้นใช้งาน กลุ่มระดับเสียงจะตรวจสอบค่าอัตราขยายของอุปกรณ์ที่เชื่อมโยงและกำหนดค่ากลุ่มดังนี้
- ขนาดของขั้น ต้องเหมือนกันสำหรับอุปกรณ์ทั้งหมดที่ควบคุมโดยกลุ่มระดับเสียง
- อัตราขยายขั้นต่ำ อัตราขยายขั้นต่ำน้อยที่สุดในบรรดาอุปกรณ์ในกลุ่ม
- อัตราขยายสูงสุด อัตราขยายสูงสุดในกลุ่มอุปกรณ์
- อัตราขยายเริ่มต้น อัตราขยายเริ่มต้นสูงสุดในอุปกรณ์ในกลุ่ม
การกำหนดค่าเหล่านี้ทำให้คุณตั้งค่าอัตราขยายของกลุ่มระดับเสียงนอกช่วงที่รองรับสำหรับอุปกรณ์ที่เชื่อมโยงกับกลุ่มระดับเสียงได้ ในกรณีนี้ ระบบจะตั้งค่าอัตราขยายสำหรับอุปกรณ์นั้นให้เป็นค่าอัตราขยายต่ำสุดหรือสูงสุดของอุปกรณ์ โดยขึ้นอยู่กับว่าค่าของกลุ่มระดับเสียงต่ำกว่าหรือสูงกว่าช่วง
ตัวระบุกลุ่มระดับเสียง
ระบบจะระบุกลุ่มระดับเสียงที่รันไทม์ตามลําดับคําจํากัดความในไฟล์ XML
รหัสมีตั้งแต่ 0 ถึง N-1 ภายในโซนเสียง โดยที่ N คือจํานวนกลุ่มระดับเสียงในโซนนั้น วิธีนี้ทำให้รหัสกลุ่มโวลุ่มซ้ำกันได้ในโซนต่างๆ ตัวระบุเหล่านี้ใช้สำหรับ CarAudioManager
API ที่เชื่อมโยงกับกลุ่มโวลุ่ม API ใดก็ตามที่รับ groupId
ที่ไม่มี zoneId
จะกำหนดเป็นโซนเสียงหลักโดยค่าเริ่มต้น
การจัดการระดับเสียงหลายโซน
แต่ละโซนเสียงควรมีกลุ่มระดับเสียงอย่างน้อย 1 กลุ่ม และกลุ่มระดับเสียงแต่ละกลุ่มจะเชื่อมโยงกับโซนเสียงได้เพียงโซนเดียวเท่านั้น ความสัมพันธ์นี้กำหนดไว้เป็นส่วนหนึ่งของ
car_audio_configuration.xml
ดูตัวอย่างที่ระบุไว้ในหัวข้อการกําหนดกลุ่มวอลุ่มด้านบน
ระดับเสียงปัจจุบันของโซนแต่ละโซนจะคงอยู่สำหรับผู้ใช้ที่เชื่อมโยงกับโซนนั้น การตั้งค่าเหล่านี้จะกำหนดเฉพาะโซนหนึ่งๆ ซึ่งหมายความว่าหากผู้ใช้ลงชื่อเข้าใช้จอแสดงผลที่เชื่อมโยงกับโซนหลัก แล้วต่อมาลงชื่อเข้าใช้โซนที่เชื่อมโยงกับโซนเสียงรอง ระดับเสียงที่โหลดและคงไว้สำหรับโซนแรกจะแตกต่างจากโซนรอง
การจัดการเหตุการณ์ของปุ่มปรับระดับเสียง
Android กําหนดคีย์โค้ดหลายรายการสําหรับการควบคุมระดับเสียง ซึ่งรวมถึง KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
และ KEYCODE_VOLUME_MUTE
โดยค่าเริ่มต้น Android จะกำหนดเส้นทางเหตุการณ์ของปุ่มปรับระดับเสียงไปยังแอปพลิเคชัน การติดตั้งใช้งานยานยนต์ควรบังคับให้เหตุการณ์สําคัญเหล่านี้เป็น CarAudioService
ซึ่งจะเรียก setGroupVolume
หรือ setMasterMute
ตามความเหมาะสมได้
หากต้องการบังคับให้มีลักษณะการทำงานนี้ ให้ตั้งค่า Flag config_handleVolumeKeysInWindowManager
เป็น true
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
ปัจจุบันเหตุการณ์สําคัญเกี่ยวกับระดับเสียงไม่สามารถแยกแยะได้ว่ามีไว้สําหรับโซนใด และระบบจะถือว่าเหตุการณ์ทั้งหมดเชื่อมโยงกับโซนเสียงหลัก
เมื่อได้รับเหตุการณ์แป้นปรับระดับเสียง CarAudioService
จะกำหนดกลุ่มระดับเสียงที่จะปรับโดยดึงข้อมูลบริบทเสียงสำหรับโปรแกรมเล่นที่ใช้งานอยู่ จากนั้นจะปรับกลุ่มระดับเสียงที่มีอุปกรณ์เอาต์พุตที่เชื่อมโยงกับบริบทเสียงที่มีลำดับความสำคัญสูงสุด การจัดลําดับความสําคัญจะกําหนดตามลําดับที่กําหนดไว้แบบคงที่ใน CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
เฟดและปรับสมดุล
HAL การควบคุมเสียงทั้ง 2 เวอร์ชันมี 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 ที่ระบบปฏิบัติการไม่สามารถควบคุมได้ ใน Android 11 ข้อมูลหลักที่ HAL มีให้เพื่อตัดสินใจเกี่ยวกับการทำให้เสียงเบาลงคืออุปกรณ์เอาต์พุต 2 เครื่องมีสตรีมทำงานอยู่หรือไม่
กรณีที่ควรหลบ
แม้ว่าแต่ละ OEM จะเป็นผู้กำหนดวิธีจัดการการลดเสียงของ HAL แต่เราขอแนะนำหลักเกณฑ์ทั่วไปบางอย่าง การเล่นสตรีมหลายรายการภายใน Android มักเกิดขึ้นเมื่อแอป/บริการ 2 แอป/บริการมีโฟกัสเสียงพร้อมกัน ด้วยเหตุนี้ โปรดดูตารางการโต้ตอบเพื่อดูว่า Android อาจให้โฟกัสพร้อมกันเมื่อใด และดูว่าสตรีม 2 รายการเล่นพร้อมกันได้เมื่อใด
โปรดทราบว่าสตรีมที่ Android รวมเข้าด้วยกันจะดำเนินการก่อนการเพิ่มผลกำไร ดังนั้น สตรีมใดก็ตามที่ควรลดระดับเสียงเมื่อเล่นพร้อมกันกับอีกสตรีมหนึ่งควรกำหนดเส้นทางไปยังอุปกรณ์เอาต์พุตแยกต่างหากเพื่อให้ HAL ใช้การลดระดับเสียงก่อนผสมเข้าด้วยกัน
ลักษณะการลดเสียงที่แนะนำ
ต่อไปนี้คือการโต้ตอบที่อาจเกิดขึ้นพร้อมกันซึ่งเราขอแนะนำให้ใช้การลดระดับเสียง
EMERGENCY
. ลดหรือปิดเสียงทุกอย่างยกเว้นSAFETY
เพื่อให้คนขับได้ยินเสียงSAFETY
. ลดเสียงทุกอย่างยกเว้นEMERGENCY
เพื่อให้คนขับได้ยินเสียงNAVIGATION
. ละเว้นทุกอย่างยกเว้นSAFETY
และEMERGENCY
CALL
. หลีกเลี่ยงทุกอย่างยกเว้นSAFETY
,EMERGENCY
และNAVIGATION
VOICE
. DuckCALL_RING
- OEM จะเป็นผู้กำหนดความสำคัญของ
VEHICLE_SOUNDS
เสียงที่ใช้งานอยู่ และควรลดเสียงอื่นๆ เพื่อให้ผู้ขับขี่ได้ยินหรือไม่ MUSIC
และANNOUNCEMENT
ควรหลบทุกอย่าง ข้อยกเว้นหลักสำหรับกรณีนี้คือเสียงการโต้ตอบด้วยการสัมผัส ซึ่งปัจจุบันจะเล่นเป็นSYSTEM_SOUND
ข้อควรพิจารณาอื่นๆ เมื่อใช้การลดเสียง
แอป/บริการบางอย่าง เช่น การนำทางหรือผู้ช่วย อาจใช้เพลเยอร์หลายรายการเพื่อดำเนินการให้เสร็จสมบูรณ์ OEM ควรหลีกเลี่ยงการลดระดับเสียงลงอย่างรวดเร็วเกินไปโดยอิงตามเวลาที่ข้อมูลสตรีมหยุดส่งผ่านอุปกรณ์เอาต์พุตเหล่านี้ เพื่อให้มั่นใจว่าผู้ใช้จะไม่ได้ยินเสียงสื่อดังขึ้นเป็นระดับเต็มเป็นระยะเวลาสั้นๆ ก่อนที่จะลดระดับเสียงลงอีกครั้งเมื่อเริ่มการเล่นครั้งถัดไปจากแอปการนำทางหรือแอปผู้ช่วย
สำหรับยานพาหนะที่มีหลายสเตจเสียงที่มีการแยกเสียงได้ดีพอ ยังมีตัวเลือกในการกําหนดเส้นทางเสียงไปยังส่วนต่างๆ ของรถแทนการลดเสียง เช่น ระบบอาจส่งคำสั่งการนำทางไปยังลำโพงบนพนักพิงศีรษะของผู้โดยสารด้านหน้าขณะที่เพลงเล่นต่อไปในห้องโดยสารด้วยระดับเสียงปกติ
เสียงที่มีความสำคัญต่อความปลอดภัย
แม้ว่า Android 11 จะเปิดตัวHAL audio focus API แต่ HAL ยังคงต้องจัดลำดับความสำคัญของเสียงที่สำคัญต่อความปลอดภัยเหนือเสียงอื่นๆ แม้ว่า HAL จะโฟกัสเสียงสำหรับ USAGE_EMERGENCY
ก็ไม่ได้รับประกันว่าแอปและบริการภายใน Android จะไม่เล่นเสียง HAL จะเป็นผู้กำหนดว่าสตรีมใดจาก Android ควรผสมหรือปิดเสียงเมื่อเล่นเสียงที่สำคัญต่อความปลอดภัย
การกำหนดค่า UI การตั้งค่าระดับเสียง
AAOS จะแยก UI การตั้งค่าระดับเสียงออกจากการกำหนดค่ากลุ่มระดับเสียง (ซึ่งสามารถวางซ้อนกันได้ตามที่อธิบายไว้ในการกำหนดค่ากลุ่มระดับเสียง) การแยกนี้ช่วยให้มั่นใจว่าไม่จําเป็นต้องทําการเปลี่ยนแปลงหากการกําหนดค่ากลุ่มวอลุ่มมีการเปลี่ยนแปลงในอนาคต
ใน UI การตั้งค่ารถยนต์ packages/apps/Car/Settings/res/xml/car_volume_items.xml
ไฟล์จะมีองค์ประกอบ UI (ทรัพยากรชื่อและไอคอน) ที่เชื่อมโยงกับแต่ละรายการที่กําหนดไว้
AudioAttributes.USAGE
ไฟล์นี้ให้การแสดงผลที่สมเหตุสมผลของ VolumeGroups
ที่กําหนดโดยใช้ทรัพยากรที่เชื่อมโยงกับการใช้งานครั้งแรกที่ระบบจดจําซึ่งมีอยู่ใน VolumeGroup แต่ละรายการ
ตัวอย่างเช่น ตัวอย่างต่อไปนี้กําหนด VolumeGroup ให้รวมทั้ง voice_communication
และ voice_communication_signalling
การใช้งาน UI การตั้งค่ารถยนต์เริ่มต้นจะแสดงผล VolumeGroup โดยใช้ทรัพยากรที่เชื่อมโยงกับ 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 ใช้ CarAudioManager API ตาม VolumeGroup ต่อไปนี้
getVolumeGroupCount()
เพื่อดูจำนวนการควบคุมที่ควรวาดgetGroupMinVolume()
และgetGroupMaxVolume()
เพื่อดูขอบเขตล่างและขอบเขตบนgetGroupVolume()
เพื่อดูระดับเสียงปัจจุบันregisterVolumeChangeObserver()
เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง