การจัดการวอลุ่มอยู่ใน CarAudioService
ซึ่งใช้วอลุ่มคงที่ซึ่งคาดว่าวอลุ่มฮาร์ดแวร์จะใช้วอลุ่มที่ต่ำกว่า HAL แทนการใช้ในซอฟต์แวร์ CarAudioService
จะจัดระเบียบอุปกรณ์เอาต์พุตเป็นกลุ่มระดับเสียงเพื่อใช้อัตราขยายเดียวกันกับอุปกรณ์ทั้งหมดที่เชื่อมโยงกับกลุ่มวอลุ่ม
ปริมาณคงที่
การติดตั้งใช้งาน 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>
กลุ่มวอลุ่มแต่ละกลุ่มควรมีอุปกรณ์เอาต์พุตอย่างน้อย 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 เป็นข้อผิดพลาด
คุณเป็นผู้ตัดสินใจว่าควรใช้ค่าเหล่านี้อย่างไรและวิธีแสดงค่าดังกล่าวแก่ผู้ใช้ โดยจะใช้กับสื่อโดยเฉพาะหรือใช้กับเสียงทั้งหมดของ Android Android 11 ยังเพิ่มการรองรับ ในการใช้เอฟเฟกต์เสียงกับอุปกรณ์เอาต์พุต วิธีนี้ทำให้สามารถจัดการการจางลงและความสมดุลผ่านเอฟเฟกต์เสียงบนอุปกรณ์เอาต์พุตที่เหมาะสมแทนผ่าน API เหล่านี้ได้
การลดเสียง
การลดเสียงจะเกิดขึ้นเมื่อยานพาหนะลดเกนสำหรับสตรีมหนึ่ง ทำให้ได้ยินเสียงสตรีมอื่นที่เล่นพร้อมกันชัดเจนยิ่งขึ้น ใน AAOS HAL จะใช้การลดเสียง Android ไม่ได้ควบคุมเสียง ที่นอกเหนือจากระบบปฏิบัติการ ใน Android 11 ข้อมูลหลักที่มีสำหรับ HAL เพื่อทำการตัดสินใจในการเลิกใช้คืออุปกรณ์เอาต์พุต 2 เครื่องทั้ง 2 อุปกรณ์มีสตรีมที่ใช้งานอยู่หรือไม่
เมื่อไรจะเป็ด
แม้ว่า OEM แต่ละรายจะเป็นผู้กำหนดวิธีการจัดการการลดเสียงโดย HAL แต่เราขอแนะนำให้ปฏิบัติตามหลักเกณฑ์ต่อไปนี้
การสตรีมหลายรายการที่เล่นใน Android มักเกิดขึ้นเมื่อแอปหรือบริการ 2 รายการโฟกัสเสียงพร้อมกัน หากต้องการเรียนรู้เวลาที่ Android อาจให้สิทธิ์โฟกัสพร้อมกัน โปรดดูเมทริกซ์การโต้ตอบในประเภทข้อจำกัด เมื่อมีการแนะนำปลั๊กอินเสียงสำหรับรถยนต์ ก็จะขึ้นอยู่กับการจัดการ AudioFocus ด้วยเช่นกัน
สตรีมที่ Android รวมเข้าด้วยกันจะดำเนินการดังกล่าวก่อนที่จะมีการเพิ่มกำไร ดังนั้น สตรีมที่ควรถูกดัดเมื่อเล่นพร้อมกันกับสตรีมอื่นควรกำหนดเส้นทางไปยังอุปกรณ์เอาต์พุตแยกต่างหากเพื่อให้ HAL สามารถใช้การลดเสียงก่อนทำการผสม
ลักษณะการทำงานที่แนะนำในการลดเสียง
เราขอแนะนำให้ใช้สิ่งต่อไปนี้เพื่อลดการโต้ตอบที่อาจเกิดขึ้นพร้อมกัน
การโต้ตอบ | การทำงาน |
---|---|
EMERGENCY
| เป็ดหรือปิดเสียงทุกอย่างยกเว้น SAFETY
|
SAFETY |
เป็ดทุกอย่างยกเว้น EMERGENCY |
NAVIGATION |
เป็ดทุกอย่างยกเว้น SAFETY และ EMERGENCY |
CALL |
เป็ดทุกอย่างยกเว้น SAFETY , EMERGENCY และ NAVIGATION |
VOICE |
เป็ด CALL_RING |
VEHICLE_SOUNDS |
คุณจะเป็นผู้กำหนดความสำคัญของเสียงที่ใช้อยู่และระบุว่าเสียงนั้นปิดเสียงอื่นๆ หรือไม่ |
MUSIC และ ANNOUNCEMENT |
ทุกสิ่งแย่มาก ข้อยกเว้นคือเสียงการโต้ตอบการสัมผัสที่เล่นเป็น SYSTEM_SOUND
|
ข้อควรพิจารณาเมื่อลด
แอปและบริการบางอย่าง เช่น การนำทางหรือผู้ช่วย อาจใช้โปรแกรมเล่นหลายรายการเพื่อดำเนินการต่างๆ หลีกเลี่ยงการทำให้ข้อมูลไม่ไหลต่อเนื่องเมื่อสตรีมข้อมูล หยุดไหลผ่านอุปกรณ์เอาต์พุตเพื่อให้มั่นใจว่าสื่อจะไม่กลับสู่ระดับเสียง ก่อนที่จะถูกปิดเสียงก่อนที่จะเล่นครั้งต่อไปจากการนำทางหรือแอป 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
รวม voice_communication
และ voice_communication_signalling
การใช้งาน UI การตั้งค่ารถยนต์เริ่มต้นจะแสดงผล VolumeGroup
โดยใช้ทรัพยากรที่เชื่อมโยงกับ voice_communication
เนื่องจากเป็น Matter แรกในไฟล์
<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()
เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง
เหตุการณ์กลุ่มวอลุ่มรถยนต์
กรณีการใช้งานในรถยนต์สำหรับการอัปเดตระดับเสียงและการเปิด/ปิดปิดเสียงจะมีรากฐานตามบริบทที่อาจกำหนดการทำงานของบางแอป เช่น การตั้งค่าระดับเสียง ระดับเสียงปัจจุบันและปิดเสียง Callback จากสแต็กเครื่องเสียงในรถยนต์ให้ข้อมูลบริบทแบบจำกัด เราได้เพิ่ม CarVolumeGroupEvent ใน Android 14 เพื่อให้บริการกรณีการใช้งานด้านยานยนต์และความสามารถในการปรับขนาดในอนาคตได้ดียิ่งขึ้น แต่ละเหตุการณ์มีข้อมูลสําคัญ 3 ประเภทดังนี้
- รายชื่อ
CarVolumeGroupInfo
EventTypes
(แมปด้วยบิต)- รายชื่อ
ExtraInfos
ข้อมูลกลุ่มปริมาณรถยนต์
ผู้รับ Callback ของเหตุการณ์มีสิทธิ์เข้าถึงรายการข้อมูลกลุ่มปริมาณรถยนต์ที่ได้รับผลกระทบแล้ว ซึ่งหมายความว่าแอปไม่ต้องทำการเรียกเพิ่มเติมไปยังเฟรมเวิร์กเครื่องเสียงรถยนต์เพื่อให้ได้สถานะล่าสุด เพียงแค่ใช้ CarVolumeGroupInfos
ที่ได้รับเพื่ออัปเดต UI หรือสถานะภายใน นอกจากนี้ เรายังให้บริการแง่มุมต่างๆ ที่มีการเปลี่ยนแปลงในกลุ่มระดับเสียงรถยนต์โดยเป็นส่วนหนึ่งของ EventTypes
ด้วยตามที่อธิบายไว้ด้านล่างเพื่อให้แอปง่ายขึ้น
EventType
กำหนดว่าด้านใดของ CarVolumeGroupInfo
มีการเปลี่ยนแปลง แอปจะใช้ข้อมูลนี้เพื่อระบุการเปลี่ยนแปลงและดำเนินการที่จำเป็น ตัวอย่างเช่น EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
บ่งชี้ว่าดัชนีการเพิ่มปริมาณสูงสุด CarVolumeGroups
ที่เกี่ยวข้องมีการเปลี่ยนแปลง และค้นหาได้โดย CarVolumeGroupInfo.getMaxVolumeGainIndex()
ตารางต่อไปนี้แสดงความสัมพันธ์ระหว่าง EventType
และ CarVolumeGroupInfo
ประเภทเหตุการณ์ | ข้อมูลกลุ่มปริมาณรถยนต์ |
---|---|
ประเภทเหตุการณ์ VOLUME_GAIN_INDEX_CHANGED | CarVolumeGroupInfo.getVolumeกู้คืนIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED | CarVolumeGroupInfo.getMinVolumeกู้คืนIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED | CarVolumeGroupInfo.getMaxVolumeGetIndex() |
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() |
ข้อมูลเพิ่มเติม
ให้ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่ CarVolumeGroup
มีการเปลี่ยนแปลง แอปสามารถใช้ข้อมูลนี้เพื่อให้บริบทเพิ่มเติมเพื่อแจ้งเตือนผู้ใช้ให้ดำเนินการหรือแจ้งเตือน เช่น EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
ระบุการลดทอนชั่วคราวที่ใช้งานอยู่เนื่องจากมีการร้อนขึ้นมาก แอปแจ้งผู้ใช้ได้ถ้าจะเพิ่มระดับเสียง
เราไม่ได้บังคับใช้กระบวนการใดๆ สำหรับ ExtraInfos
การพิจารณากระบวนการโดยอิงตาม ExtraInfos
ขึ้นอยู่กับการพิจารณาตามที่เห็นสมควร เช่น หากการค่อยๆ เบาลงเนื่องจาก EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
คุณยังเลือกให้ UI แถบระดับเสียงจางลงในตอนแรกเพื่อป้องกันไม่ให้ผู้ใช้เปลี่ยนระดับเสียงได้
ส่วนรายอื่นๆ อาจเลือกแสดงข้อความโทสต์ว่าการปรับเสียงทำงานอยู่และอนุญาตให้ผู้ใช้เปลี่ยนระดับเสียงได้
เฟรมเวิร์กเครื่องเสียงติดรถยนต์จะใช้ AudioControl HAL IAudioGainCallback
เพื่อระบุ ExtraInfos
ที่แนะนำ ดูข้อมูลเพิ่มเติมได้ที่การติดต่อกลับจากเสียงที่ได้รับ
CarVolumeGroupEvent
ปรับขนาดให้เหมาะกับความต้องการในอนาคตของเฟรมเวิร์กเครื่องเสียงรถยนต์ เราตั้งใจจะรองรับฟีเจอร์ใหม่ๆ ผ่านทาง CarVolumeGroupEvent
เท่านั้น เราขอแนะนำเป็นอย่างยิ่งให้นักพัฒนาแอปใช้ CarVolumeGroupEvent
ในการจัดการระดับเสียงของกลุ่มและปิดเสียงการเปลี่ยนแปลง
การติดต่อกลับเหตุการณ์ของกลุ่มปริมาณรถยนต์
Android 14 เป็นฟังก์ชัน Callback ใหม่สำหรับแอปที่ได้รับสิทธิ์และแพลตฟอร์มให้ลงทะเบียนและรับการแจ้งเตือนเกี่ยวกับ CarVolumeGroupEvents
หากต้องการลงทะเบียนสำหรับการติดต่อกลับ ให้ใช้
CarAudioManager#registerCarVolumeGroupEventCallback()
หากต้องการยกเลิกการลงทะเบียน Callback ให้ใช้
CarAudioManager#unregisterCarVolumeGroupEventCallback()
หากแอปลงทะเบียนกับ CarVolumeGroupEventCallback
ใหม่และ CarVolumeCallback
เดิม ระบบจะให้ความสำคัญกับเหตุการณ์ CarVolumeGroupEventCallbacks
ก่อน
สแต็กเครื่องเสียงในรถยนต์ไม่ทริกเกอร์ CarVolumeCallback
แล้ว วิธีนี้จะช่วยป้องกันไม่ให้เกิดทริกเกอร์ซ้ำในแอปเดียวกันสำหรับเหตุการณ์เดียวกัน
เราขอแนะนำให้ใช้ CarVolumeGroupEventCallback
เพื่อจัดการระดับเสียงของกลุ่มและปิดเสียงการเปลี่ยนแปลง
Callback ของสัญญาณเสียงที่ได้รับ
ตั้งแต่ Android 13 เป็นต้นไป AudioControl HAL จะทริกเกอร์การเรียกกลับแบบไม่พร้อมกันเพื่อจัดการการอัปเดตระดับเสียงเนื่องจากการเปลี่ยนแปลงของระบบเสียงในรถยนต์
API ระดับ HAL
AudioControl @2.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 2.0 จะเพิ่ม API ต่อไปนี้
API | วัตถุประสงค์ |
---|---|
IAudioControl#registerGainCallback |
ลงทะเบียนอินสแตนซ์ของ IAudioGainCallback ด้วย AudioControl HAL |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback แบบไม่พร้อมกันเพื่อแจ้งเตือนการเปลี่ยนแปลงการกำหนดค่าการรับเสียง |
Callback ของ AudioControl HAL มีรายการเหตุผลและ AudioGainConfigInfo
ที่เกี่ยวข้อง ซึ่งประกอบด้วย
- รหัสโซน
- ที่อยู่พอร์ตของอุปกรณ์
- ดัชนีปริมาณ > ดัชนี อาจเป็นดัชนีที่จำกัดหรือดัชนีอัปเดตก็ได้
เหตุผลสามารถแบ่งหมวดหมู่กว้างๆ เป็น
- เหตุผลของการจำกัด เปลี่ยนเป็นระดับเสียงและปิดเสียงชั่วคราว
- เหตุผลในการอัปเดต การเปลี่ยนแปลงลักษณะการทำงานของระดับเสียงอย่างถาวร
ประเภทข้อจำกัด
ตั้งแต่วันที่ AudioControl
HAL AIDL
V3
เป็นต้นไป ประเภทข้อจำกัดที่รองรับมีดังนี้
- ปิดเสียง
- จะมีการบล็อก
- ข้อจำกัด
- การลดทอน
ข้อจำกัดที่ใช้งานอยู่ | การเปลี่ยนแปลงระดับเสียงที่ทริกเกอร์โดยผู้ใช้ | การเปิด/ปิดเสียงที่ทริกเกอร์โดยผู้ใช้ |
---|---|---|
ปิดเสียง | ❌ | ❌ (เปิดเสียง) ✔ (ปิดเสียง) |
จะมีการบล็อก | ❌ | ✔ |
ข้อจำกัด | ❌ (เกินขีดจํากัด) ✔ (ไม่เกินขีดจํากัด) |
✔ |
การลดทอน | ✔ | ✔ |
ลำดับความสำคัญระหว่างข้อจำกัดคือ ปิดเสียง > การบล็อก > ข้อจำกัด > การลดทอน
การจำกัดการปิดเสียง
ข้อจำกัดการปิดเสียงมีดังต่อไปนี้
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
เฟรมเวิร์กเครื่องเสียงรถยนต์จะมีสถานะปิดเสียง 2 สถานะต่อไปนี้เป็นการภายใน
ปิดเสียงผู้ใช้ สลับตามคำขอจากผู้ใช้ ไม่ว่าจะผ่าน
CarAudioManager
หรือเหตุการณ์สำคัญปิดเสียง HAL สลับตามข้อจำกัดการปิดเสียงที่ได้รับผ่านการติดต่อกลับของ
AudioGain
สำหรับผู้ฟังอย่างแอปการตั้งค่า สถานะการปิดเสียงโดยรวม (CarVolumeGroupInfo.isMuted()
) ของกลุ่มระดับเสียงจะอิงตามการเปิดใช้การปิดเสียงรายการใดรายการหนึ่งข้างต้น
เมื่อเปิดใช้การปิดเสียง HAL แล้ว ระบบจะไม่สนใจการเปลี่ยนแปลงระดับเสียงขาเข้าและคำขอเปิดเสียงกลุ่มทั้งหมดในช่วงที่มีการจำกัด
กรณีการโต้ตอบ: การปิดเสียง HAL เปิดใช้งานอยู่ และคำขอของผู้ใช้สำหรับการสลับการปิดเสียง
เมื่อเปิดใช้การปิดเสียง HAL และปิดใช้การปิดเสียงผู้ใช้
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
- คำขอจากผู้ใช้ให้เปิดใช้การปิดเสียงจะได้รับการดำเนินการ
- เหตุผล: ควรปฏิบัติตามคำขอซ่อนผู้ใช้เสมอเพื่อรักษาความเป็นส่วนตัวของผู้ใช้
เมื่อเปิดใช้การปิดเสียง HAL และเปิดใช้การปิดเสียงผู้ใช้ ให้ทำดังนี้
สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
คำขอจากผู้ใช้ให้ปิดใช้การปิดเสียงจะได้รับการประมวลผล
NOT
สถานะการปิดเสียงของผู้ใช้ที่แคชไว้ยังคงเปิดใช้อยู่เหตุผล: คำขอเปิดเสียงของผู้ใช้จะใช้งานได้ก็ต่อเมื่อไม่มีข้อจำกัดที่ใช้งานอยู่เท่านั้น
เหตุผล: การเปิดเสียงผู้ใช้ที่แคชไว้อาจทำให้เกิดเสียงระเบิดโดยไม่ได้ตั้งใจและเป็นอันตรายต่อผู้ใช้ โดยเฉพาะอย่างยิ่งหากเปิดใช้การปิดเสียงไว้ตลอดรอบการระเบิด ซึ่งจะทำให้การรับรู้ระดับเสียงของผู้ใช้ลดลง
กรณีการโต้ตอบ: การปิดเสียง HAL เปิดใช้อยู่และปิดใช้อยู่ในขณะที่การปิดเสียงผู้ใช้ไม่มีการเปลี่ยนแปลง
การเปิด/ปิดเสียง HAL จะเป็นการเปลี่ยนสถานะปิดเสียงโดยรวมของกลุ่มระดับเสียง แต่จะไม่อัปเดตสถานะปิดเสียงของผู้ใช้โดยตรง เมื่อปิดใช้การปิดเสียงผู้ใช้และมีการส่งคืน การปิดเสียง HAL เพื่อเปิดใช้ จะมีผลดังนี้
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
ระบบจะประมวลผลคำขอจากผู้ใช้ให้เปลี่ยนระดับเสียง
NOT
ในขณะที่เปิดใช้การปิดเสียง HALสาเหตุ: ผู้ใช้ไม่ได้ยินเสียงขณะที่เปิดใช้การปิดเสียงอยู่ การอนุญาตให้เปลี่ยนระดับเสียงอาจส่งผลให้เกิดเสียงระเบิดและความปลอดภัยที่เป็นอันตรายต่อผู้ใช้
เหตุผล: แอปปรับระดับเสียงจะลงทะเบียนการเรียกกลับและทริกเกอร์การเปิดเสียงได้ (CarAudioManager.setVolumeGroupMute(...,/* closed=*/ true,..)) โดยอัตโนมัติโดยไม่ต้องให้ผู้ใช้จัดการ หาก OEM เป็นลักษณะการทำงานที่คาดไว้
เมื่อปิดใช้การปิดเสียง 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
ผู้ใช้ใช้แอประดับเสียงเพื่อเปลี่ยนดัชนีระดับเสียงเป็น 30
ระบบจะแปลงดัชนีนี้เป็นการเพิ่มระดับเสียงและส่งไปยัง HAL ของเสียง
ผู้ให้บริการที่ติดตั้งใช้งาน
Audio HAL
จะได้รับการเพิ่มระดับเสียงใหม่และอัปเดตระบบเสียง (เช่น แอมป์ภายนอก)ระบบเสียงตอบสนองว่าระดับเสียงจะอัปเดตเป็นดัชนี 15 เท่านั้น (โดยเหตุผลที่ Android ไม่ทราบ)
การใช้งานทริกเกอร์
AudioControl HAL
ของผู้ให้บริการ:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
บริการเสียงรถยนต์ใช้ดัชนีใหม่จาก Callback ที่ใช้สำหรับความต่อเนื่องและ Callback ของแอประดับเสียง ดัชนีที่ผู้ใช้ขอคือ 30 อย่างไรก็ตาม การตอบสนองแบบไม่พร้อมกันของระบบเสียงจะอัปเดตดัชนีเป็น 15
กรณีการใช้งาน: การเล่นเสียงครั้งแรกหลังจากออกจากการระงับ
ดัชนีระดับเสียงก่อนการระงับมีการตั้งค่าเป็นระดับสูง 95 (ช่วง: [0-99])
Android จะเข้าสู่การระงับ
เมื่อมี Android อยู่แล้วให้ระงับ (เช่น กลับมาใช้งานต่อ)
ผู้ให้บริการ
Audio HAL/AudioControl HAL
ใช้ดัชนีที่ปลอดภัยเท่ากับ 30 กับระบบเสียงในเครื่องผู้ให้บริการ
AudioControl HAL
ยังเรียกให้การเรียกกลับสำหรับดัชนีที่ปลอดภัย:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
บริการเครื่องเสียงรถยนต์ใช้ดัชนีใหม่จาก Callback ที่ใช้สำหรับความต่อเนื่องและ Callback ของตนไปยังแอประดับเสียงที่ซิงค์ดัชนี ดัชนีปริมาณก่อนระงับคือ 95 อย่างไรก็ตาม หลังจากกลับมาทำงานอีกครั้ง เครื่องมือ
AudioControl HAL
จะตั้งค่าดัชนีนี้เป็นระดับปริมาณที่ปลอดภัย 30
การกำหนดค่าวอลุ่มแบบไดนามิก
สำหรับฟีเจอร์นี้ เราจะพิจารณากรณีการใช้งานหลักต่อไปนี้
การกำหนดค่า End-of-line (EOL) ของยานพาหนะ
ผู้ผลิตรถยนต์ต้องการอัปเดตการกำหนดค่าระดับเสียงที่ EOL โดยอิงตามการตั้งค่าระบบเสียงของรถ ปกติแล้วจะเป็นการโหลดจากแหล่งที่ไม่รู้จักโดยไม่อัปเดต อิมเมจ Android SW
ผู้ผลิตอัตโนมัติอาจต้องอัปเดตการกำหนดค่าระดับเสียงในระหว่างกำหนดการให้บริการ
การกำหนดค่ารันไทม์ ระบบเสียงในรถยนต์รองรับการกำหนดค่าเครื่องขยายสัญญาณภายนอกและ ECU เหล่านี้อาจโฮสต์การกำหนดค่าช่วงระดับเสียงที่จะค้นหาในระหว่างการเปิดเครื่อง
การกำหนดค่าแบบออนดีมานด์ มีไว้เพื่อรองรับความต้องการที่เพิ่มขึ้นของฟีเจอร์เสียงตามดีมานด์ ซึ่งผู้ใช้จะสมัครใช้บริการการประมวลผลสัญญาณที่เพิ่มประสิทธิภาพเป็นระยะเวลาหนึ่ง การกำหนดค่าช่วงปริมาณใหม่จะใช้ได้ในระยะเวลาการสมัครใช้บริการ
ออกแบบ
การกำหนดค่าระดับเสียงแบบไดนามิกทำได้ 3 ขั้นตอนดังนี้
การค้นพบ การใช้ AudioControl HAL ของผู้ให้บริการจะค้นหาการอัปเดตช่วงระดับเสียงใหม่ผ่านกลไก IPC ที่กำหนดเองซึ่งผู้ให้บริการเป็นเจ้าของ
เมื่อค้นพบแล้ว ระบบจะสร้าง Callback ผ่าน
AudioControl::IModuleChangeCallback
อัปเดต การซ้อนเครื่องเสียงในรถยนต์จะอัปเดตสถานะกลุ่มระดับเสียงด้วยช่วงระดับเสียงใหม่
เราพยายามที่จะรักษาระดับเสียงให้เท่าเดิมหลังจากอัปเดตช่วงระดับเสียง แต่หากดัชนีอยู่นอกขอบเขต ระบบจะตั้งค่าดัชนีปริมาณปัจจุบันเป็นค่าที่ปลอดภัย เช่น ระดับเริ่มต้นที่ผู้ให้บริการระบุไว้ระหว่างการเรียกกลับ
โทรกลับ
หลังการอัปเดตช่วงกลุ่มระดับเสียง สแต็กเครื่องเสียงในรถยนต์จะทริกเกอร์ Callback ไปยังแอปที่ลงทะเบียนผ่าน
CarVolumeGroupEventCallback
CarVolumeGroupEvent
จะมีCarVolumeGroupInfo
, ประเภทเหตุการณ์ (สิ่งที่เปลี่ยนแปลง) และข้อมูลเพิ่มเติม (สาเหตุที่มีการเปลี่ยนแปลง) ที่อัปเดตแล้ว
รูปที่ 1 การกำหนดค่าระดับเสียงแบบไดนามิก
API ระดับ HAL
AudioControl ที่ 3.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 3.0 เปิดตัว API ต่อไปนี้
API | |
---|---|
IAudioControl#setModuleChangeCallback | ตั้งค่าอินสแตนซ์ของ IModuleChangeCallback ด้วย AudioControl HAL |
IAudioControl#clearModuleChangeCallback | ล้างอินสแตนซ์ของ IModuleChangeCallback ที่ตั้งค่าไว้ก่อนหน้านี้ด้วย AudioControl HAL |
เปลี่ยน Callback ของ IModuleChange#onAudioPorts แล้ว | ติดต่อกลับเพื่อแจ้งการเปลี่ยนแปลงใน AudioPort |
ลำดับ
แผนภาพลำดับของการกำหนดค่าระดับเสียงแบบไดนามิกจะแสดงที่ด้านล่าง
รูปที่ 2 แผนภาพลำดับสำหรับการกำหนดค่าวอลุ่มแบบไดนามิก
ลักษณะสำคัญ
โปรดพิจารณาสิ่งต่อไปนี้เพื่อเพิ่มประสิทธิภาพฟีเจอร์นี้
AudioPort ที่ให้มาเป็นส่วนหนึ่งของ Callback ต้องตรงกับคำจำกัดความของ Automotive BUS
- พอร์ตของอุปกรณ์ วันที่
IN_DEVICE
เวลาOUT_DEVICE
- การเชื่อมต่อ
BUS
- ที่อยู่ ระบุไว้ในคำจำกัดความ HAL ของเสียง
- โหมดขยาย
JOINT
- พอร์ตของอุปกรณ์ วันที่
ผู้ให้บริการต้องกำหนดชุดคำจำกัดความของช่วงระดับเสียงขั้นสูงในนโยบาย HAL เสียง และใช้ Callback เพื่อปรับแต่งสำหรับตัวแปรยานพาหนะ ดูข้อมูลเพิ่มเติมได้ที่
IModuleChangeCallbac
คำจำกัดความของ AIDLเมื่อมี BUS เสียงมากกว่า 1 รายการอยู่ในกลุ่มระดับเสียงเดียวกัน ต้อง มีคำจำกัดความช่วงระดับเสียงที่เหมือนกัน มิเช่นนั้นเฟรมเวิร์กเสียงรถยนต์จะปฏิเสธการกำหนดช่วงระดับเสียงใหม่