AAOS มีการจัดการวอลุ่มของตัวเองภายใน CarAudioService
ใช้เวอร์ชันคงที่
โดยคาดว่าวอลุ่มควรใช้ต่ำกว่า HAL โดยฮาร์ดแวร์
เครื่องขยายเสียง ไม่ใช่ในซอฟต์แวร์ และยังจัดระเบียบอุปกรณ์เอาต์พุตเป็นกลุ่มระดับเสียง
เพื่อใช้อัตราขยายเดียวกันกับอุปกรณ์ทั้งหมดที่เชื่อมโยงกับกลุ่มระดับเสียง
การใช้ระดับเสียงคงที่
การติดตั้งใช้งาน AAOS ควรควบคุมระดับเสียงโดยใช้ตัวขยายสัญญาณฮาร์ดแวร์แทน
โปรแกรมผสมซอฟต์แวร์ ตั้งค่าสถานะ config_useFixedVolume
เพื่อหลีกเลี่ยงผลข้างเคียง
เป็นจริง (ซ้อนทับตามความจำเป็น):
<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 คือจำนวนกลุ่มระดับเสียงใน
บริเวณนั้น ด้วยวิธีนี้ รหัสกลุ่มวอลุ่มในโซนต่างๆ จะไม่ซ้ำกัน ตัวระบุเหล่านี้
ใช้สำหรับ API CarAudioManager
ที่เชื่อมโยงกับกลุ่มวอลุ่ม API ใดก็ได้
ที่ใช้ groupId
โดยไม่มี zoneId
จะมีค่าเริ่มต้นเป็น
โซนเสียงหลัก
การจัดการระดับเสียงแบบหลายโซน
โซนเสียงแต่ละโซนควรมีกลุ่มระดับเสียงอย่างน้อย 1 กลุ่ม และมีกลุ่มระดับเสียงแต่ละกลุ่ม
เชื่อมโยงกับโซนเสียงเดียวเท่านั้น ความสัมพันธ์นี้กำหนดเป็นส่วนหนึ่งของ
car_audio_configuration.xml
ดูตัวอย่างที่ให้ไว้ใน
การกำหนดกลุ่มปริมาณด้านบน
ระดับเสียงปัจจุบันสำหรับแต่ละโซนจะยังคงอยู่สำหรับผู้ใช้ที่เชื่อมโยงกับ บริเวณนั้น การตั้งค่าเหล่านี้จะเป็นแบบเฉพาะโซน ซึ่งหมายความว่าผู้ใช้ลงชื่อเข้าใช้ในจอแสดงผล ที่เชื่อมโยงกับโซนหลัก จากนั้นลงชื่อเข้าใช้โซนที่เชื่อมโยงกับ โซนเสียงรอง ระดับเสียงที่โหลดและยังคงอยู่สำหรับโซนแรกจะ แตกต่างจากรายการที่อยู่ในโซนรอง
การจัดการเหตุการณ์สําคัญเกี่ยวกับปริมาณ
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 ทั้ง 2 เวอร์ชันมี API สำหรับตั้งค่าการเฟดและปรับสมดุล
ยานพาหนะ มี API ระบบที่สอดคล้องกันสำหรับ CarAudioManager ที่ส่งค่า
ไปจนถึง AudioControl HAL API เหล่านี้ต้องใช้
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
API ของ AudioControl มีดังนี้
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 เหล่านี้
การลดเสียง
การลดเสียงเกิดขึ้นเมื่อยานพาหนะลดเกนสำหรับสตรีม 1 รายการ เพื่อให้ได้ยินสตรีมอื่นที่เล่นในเวลาเดียวกันชัดเจนยิ่งขึ้น ใน AAOS การลดเสียงปล่อยให้ HAL นำไปใช้ เนื่องจากอาจมีเสียงที่หลากหลาย ภายนอก Android ซึ่งระบบปฏิบัติการไม่สามารถควบคุมได้ ใน Android 11 ข้อมูลหลัก สำหรับ HAL เพื่อทำการตัดสินใจ ว่าอุปกรณ์เอาต์พุต 2 เครื่องมี สตรีมที่เปิดใช้งานอยู่
เมื่อไรจะเป็ด
แม้ว่า OEM แต่ละรายจะเป็นผู้กำหนดว่า HAL จะจัดการการลดปัญหาอย่างไร เรามีหลักเกณฑ์ทั่วไปบางส่วนที่เราแนะนำ สตรีมหลายรายการที่เล่นใน Android จะ มักเกิดขึ้นเมื่อแอป/บริการ 2 รายการมีการโฟกัสเสียงพร้อมกัน ด้วยเหตุนี้ ดูเมทริกซ์การโต้ตอบ เพื่อเรียนรู้ว่าเมื่อใดที่ Android อาจให้สิทธิ์ ในการมุ่งเน้นหลายรายการพร้อมกัน และหากเป็นไปได้สำหรับ สตรีมต่างๆ เพื่อเล่นพร้อมกัน
โปรดทราบว่าสตรีมที่ Android ผสมผสานกันจะต้องดำเนินการก่อนสร้างรายได้ กำลังนำไปใช้ ด้วยเหตุนี้ สตรีมใดๆ ที่ควรถูกซ่อนเมื่อเล่นพร้อมกันกับ ควรกำหนดเส้นทางอีกอุปกรณ์หนึ่งไปยังอุปกรณ์เอาต์พุตแยกต่างหากเพื่อให้ HAL สามารถใช้การลดเสียงก่อน จากนั้นจึงนำมารวมกัน
ลักษณะการทำงานที่แนะนำในการลดเสียง
ต่อไปนี้คือการโต้ตอบที่เป็นไปได้ที่เกิดขึ้นพร้อมกัน ซึ่งเราแนะนำให้ลด ที่จะนำมาใช้:
EMERGENCY
ปิดเสียงหรือปิดเสียงทุกอย่างยกเว้นSAFETY
เพื่อ ตรวจสอบว่าคนขับได้ยินเสียงSAFETY
ซ่อนทุกอย่างยกเว้นEMERGENCY
เพื่อให้มั่นใจว่า คนขับได้ยินเสียงNAVIGATION
เป็ดทุกอย่างยกเว้นSAFETY
และEMERGENCY
CALL
เป็ดทุกอย่างยกเว้นSAFETY
EMERGENCY
และNAVIGATION
VOICE
เป็ดCALL_RING
- OEM จะเป็นผู้กำหนดความสำคัญของ
VEHICLE_SOUNDS
ที่ใช้งานอยู่ และควรปิดเสียงอื่นๆ หรือไม่เพื่อให้คนขับได้ยิน - ระบบควรจำกัด
MUSIC
และANNOUNCEMENT
ไว้ทั้งหมด ข้อยกเว้นหลักๆ ก็คือเสียงโต้ตอบแบบสัมผัสซึ่งตอนนี้เล่นเป็นSYSTEM_SOUND
ข้อควรพิจารณาอื่นๆ เมื่อลด
แอป/บริการบางอย่าง เช่น การนำทางหรือ Assistant อาจใช้โปรแกรมเล่นหลายโปรแกรมเพื่อทำงานให้สำเร็จ การกระทำของพวกเขา OEM ควรหลีกเลี่ยงการทำให้ข้อมูลไม่ต่อเนื่องกันมากเกินไปโดยพิจารณาจากช่วงเวลาที่ข้อมูลสตรีมหยุด ผ่านอุปกรณ์เอาต์พุตเหล่านี้ เพื่อให้มั่นใจว่าผู้ใช้จะไม่ต้องส่งคืนสื่อ ปรับระดับเสียงให้เต็มก่อนที่จะลดลงเมื่อเล่นต่อจากการนำทาง หรือ แอป Assistant จะเริ่มทำงาน
สำหรับรถที่มีเวทีเสียงหลายระยะซึ่งมีการแยกสัญญาณที่ดีพอ เรามีตัวเลือก เพื่อกำหนดเส้นทางเสียงไปยังพื้นที่ต่างๆ ของรถแทนที่จะลดเสียงรบกวน ตัวอย่างเช่น การนำทาง สามารถส่งคำสั่งไปยังลำโพงที่พนักพิงศีรษะคนขับได้ในขณะที่เพลงยังเล่นต่อไป เล่นตลอดทั้งห้องโดยสารด้วยระดับเสียงปกติ
เสียงที่สำคัญต่อความปลอดภัย
ในขณะที่ Android 11 เปิดตัว
API โฟกัสเสียงแบบ HAL
เสียงก็ยังอยู่ใน 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 รวมทั้ง 2 ประเภท
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()
เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง