การจัดการระดับเสียงมีอยู่ใน CarAudioService
ซึ่งใช้ระดับเสียงคงที่โดยคาดหวังว่าระดับเสียงจะถูกใช้ต่ำกว่า HAL โดยเครื่องขยายสัญญาณฮาร์ดแวร์แทนในซอฟต์แวร์ CarAudioService
จัดระเบียบอุปกรณ์เอาท์พุตออกเป็นกลุ่มวอลลุมเพื่อปรับใช้เกนเดียวกันกับอุปกรณ์ทั้งหมดที่เกี่ยวข้องกับกลุ่มวอลลุม
ปริมาณคงที่
การใช้งาน AAOS ใช้เครื่องขยายสัญญาณฮาร์ดแวร์เพื่อควบคุมระดับเสียงแทนตัวผสมซอฟต์แวร์ เพื่อหลีกเลี่ยงผลข้างเคียง ให้ตั้งค่าแฟล็ก config_useFixedVolume
เป็น true
(ซ้อนทับตามความจำเป็น):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
เมื่อไม่ได้ตั้งค่าแฟล็ก 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>
แต่ละกลุ่มวอลุ่มควรมีอุปกรณ์เอาต์พุตตั้งแต่หนึ่งตัวขึ้นไปซึ่งมีที่อยู่ที่เกี่ยวข้องกัน ที่อยู่ควรสอดคล้องกับอุปกรณ์เอาต์พุตที่กำหนดไว้ใน 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 ID มีตั้งแต่ 0
ถึง N-1
ภายในโซนเสียง โดยที่ N
คือจำนวนกลุ่มวอลุ่มในโซนนั้น ด้วยวิธีนี้ ID กลุ่มวอลุ่มจะไม่ซ้ำกันในโซนต่างๆ ตัวระบุเหล่านี้ใช้สำหรับ CarAudioManager
API ที่เชื่อมโยงกับกลุ่มวอลุ่ม API ใดๆ ที่รับ groupId
โดยไม่มี zoneId
จะมีค่าเริ่มต้นเป็นโซนเสียงหลัก
การจัดการระดับเสียงแบบหลายโซน
แต่ละโซนเสียงคาดว่าจะมีกลุ่มวอลุ่มตั้งแต่หนึ่งกลุ่มขึ้นไป และกลุ่มวอลุ่มแต่ละกลุ่มจะเชื่อมโยงกับโซนเสียงเดียวเท่านั้น ความสัมพันธ์นี้ถูกกำหนดให้เป็นส่วนหนึ่งของ 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 ทั้งสองเวอร์ชันมี 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 ถือเป็นข้อผิดพลาด
คุณเป็นผู้ตัดสินใจว่าควรใช้ค่าเหล่านี้อย่างไร และจะแสดงค่าต่อผู้ใช้อย่างไร สามารถนำไปใช้กับสื่อหรือใช้กับเสียง Android ทั้งหมดได้อย่างทั่วถึง Android 11 ยังแนะนำการรองรับการใช้เอฟเฟกต์เสียงกับอุปกรณ์เอาท์พุต ด้วยเหตุนี้ จึงเป็นไปได้ที่จะจัดการการเฟดและความสมดุลผ่านเอฟเฟกต์เสียงบนอุปกรณ์เอาท์พุตที่เหมาะสม แทนที่จะจัดการผ่าน API เหล่านี้
การปิดเสียง
การลดเสียงเกิดขึ้นเมื่อยานพาหนะลดเกนสำหรับสตรีมหนึ่ง เพื่อให้สตรีมอื่นที่เล่นพร้อมกันสามารถได้ยินได้ชัดเจนยิ่งขึ้น ใน AAOS การลดเสียงจะดำเนินการโดย HAL Android ไม่สามารถควบคุมเสียงได้นอกเหนือจากระบบปฏิบัติการ ใน Android 11 ข้อมูลหลักที่ HAL มีให้ในการตัดสินใจในการหลบคืออุปกรณ์เอาท์พุตสองตัวมีสตรีมที่ใช้งานอยู่หรือไม่
เมื่อจะเป็ด
แม้ว่าจะขึ้นอยู่กับ OEM แต่ละรายในการพิจารณาว่า HAL จัดการการหลบอย่างไร แต่เราขอแนะนำแนวทางต่อไปนี้
การเล่นสตรีมหลายรายการใน Android มักเกิดขึ้นเมื่อแอปหรือบริการสองตัวจับโฟกัสเสียงพร้อมกัน หากต้องการเรียนรู้ว่าเมื่อใดที่ Android อาจให้โฟกัสพร้อมกัน โปรดดูเมทริกซ์การโต้ตอบใน ประเภทข้อจำกัด การเปิดตัวปลั๊กอินเครื่องเสียงรถยนต์จะขึ้นอยู่กับการจัดการ AudioFocus ของคุณด้วย
การสตรีมใด ๆ ที่ผสมเข้าด้วยกันโดย Android จะต้องดำเนินการก่อนที่จะมีการใช้กำไรใด ๆ ด้วยเหตุนี้ สตรีมใด ๆ ที่ควรถูกเป็ดเมื่อเล่นพร้อมกันกับอีกเครื่องหนึ่งควรถูกกำหนดเส้นทางไปยังอุปกรณ์เอาท์พุตแยกกัน เพื่อให้ HAL สามารถใช้การเป็ดก่อนที่จะผสมพวกมัน
พฤติกรรมการเป็ดที่แนะนำ
ต่อไปนี้คือคำแนะนำในการโต้ตอบที่อาจเกิดขึ้นพร้อมกัน
ปฏิสัมพันธ์ | การกระทำ |
---|---|
EMERGENCY | เป็ดหรือปิดเสียงทุกอย่าง ยกเว้น SAFETY |
SAFETY | เป็ดทุกอย่างยกเว้น EMERGENCY |
NAVIGATION | เป็ดทุกอย่าง ยกเว้น SAFETY และ EMERGENCY |
CALL | หลบเลี่ยงทุกสิ่ง ยกเว้น SAFETY EMERGENCY และ NAVIGATION |
VOICE | เป็ด CALL_RING |
VEHICLE_SOUNDS | คุณเป็นผู้กำหนดความสำคัญของเสียงที่แอ็กทีฟและพิจารณาว่าเสียงนั้นจะหลบเสียงอื่นหรือไม่ |
MUSIC และ ANNOUNCEMENT | โดนหลอกทุกอย่าง. ข้อยกเว้นคือเสียงโต้ตอบการสัมผัสที่เล่นเป็น SYSTEM_SOUND |
ข้อควรพิจารณาเมื่อทำการหลบ
แอพและบริการบางอย่าง เช่น การนำทางหรือผู้ช่วย อาจใช้ผู้เล่นหลายคนในการดำเนินการ หลีกเลี่ยงการปล่อยข้อมูลอย่างรุนแรงเมื่อสตรีมข้อมูลหยุดไหลผ่านอุปกรณ์เอาท์พุต เพื่อให้แน่ใจว่าสื่อจะไม่กลับสู่ระดับเสียงสูงสุดก่อนที่จะถูกดักออกก่อน3 การเล่นครั้งถัดไปจากการนำทางหรือแอปผู้ช่วยจะเริ่มขึ้น
สำหรับรถยนต์ที่มีเวทีเสียงหลายระดับและมีการแยกเสียงที่ดีเพียงพอ คุณสามารถกำหนดเส้นทางเสียงไปยังบริเวณต่างๆ ของรถแทนการหลบเสียงได้ ตัวอย่างเช่น คำแนะนำการนำทางสามารถกำหนดเส้นทางไปยังลำโพงพนักพิงศีรษะของผู้ขับขี่ ในขณะที่ยังคงเล่นเพลงไปทั่วทั้งห้องโดยสารในระดับเสียงปกติ
เสียงวิกฤตด้านความปลอดภัย
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
เนื่องจากเป็นการจับคู่แรกในไฟล์
<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()
เพื่อรับการแจ้งเตือนการเปลี่ยนแปลงปริมาณ
งานกลุ่มปริมาณรถยนต์
กรณีการใช้งานในยานยนต์ของการอัปเดตระดับเสียงและการสลับการปิดเสียงมีพื้นฐานตามบริบทที่อาจกำหนดการทำงานของแอปบางตัว เช่น การตั้งค่าระดับเสียง ระดับเสียงปัจจุบันและการโทรกลับแบบปิดเสียงจากชุดเครื่องเสียงรถยนต์ให้ข้อมูลบริบทที่จำกัด เพื่อให้บริการกรณีการใช้งานด้านยานยนต์ได้ดียิ่งขึ้นและความสามารถในการปรับขนาดในอนาคต CarVolumeGroupEvent จะถูกเพิ่มลงใน Android 14 แต่ละกิจกรรมประกอบด้วยข้อมูลที่สำคัญ 3 ประเภท:
- รายชื่อ
CarVolumeGroupInfo
-
EventTypes
(บิตแมป) - รายการ
ExtraInfos
ข้อมูลกลุ่มปริมาณรถยนต์
ผู้รับการเรียกกลับเหตุการณ์สามารถเข้าถึงรายการข้อมูลกลุ่มปริมาณรถยนต์ที่ได้รับผลกระทบได้ทันที ซึ่งหมายความว่าแอปไม่จำเป็นต้องทำการเรียกเฟรมเวิร์กเครื่องเสียงรถยนต์เพิ่มเติมเพื่อรับสถานะล่าสุด สามารถใช้ CarVolumeGroupInfos
ที่ได้รับ to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of
EventTypes` ดังที่อธิบายไว้ด้านล่าง
ประเภทเหตุการณ์
กำหนดลักษณะของ CarVolumeGroupInfo ที่มีการเปลี่ยนแปลง แอพสามารถใช้สิ่งนี้เพื่อระบุการเปลี่ยนแปลงและดำเนินการที่จำเป็น ตัวอย่างเช่น EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
บ่งชี้ว่า CarVolumeGroups' maximum volume gain index has changed and can be queried by
CarVolumeGroupInfo.getMaxVolumeGainIndex()`
ตารางต่อไปนี้แสดงความสัมพันธ์ระหว่าง EventType
และ CarVolumeGroupInfo
ประเภทเหตุการณ์ | ข้อมูลกลุ่มปริมาณรถยนต์ |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED | CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED | CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED | CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED | CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isลดทอน() |
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 ให้การโทรกลับใหม่สำหรับแอปสิทธิพิเศษและแพลตฟอร์มเพื่อลงทะเบียนและรับการแจ้งเตือน CarVolumeGroupEvents
หากต้องการลงทะเบียนสำหรับการโทรกลับ ให้ใช้
CarAudioManager#registerCarVolumeGroupEventCallback()
หากต้องการยกเลิกการลงทะเบียนการโทรกลับ ให้ใช้
CarAudioManager#unregisterCarVolumeGroupEventCallback()
หากแอปลงทะเบียนด้วย CarVolumeGroupEventCallback
ใหม่และ CarVolumeCallback
รุ่นเก่า กิจกรรม CarVolumeGroupEventCallbacks
จะได้รับการจัดลำดับความสำคัญ สแต็คเครื่องเสียงรถยนต์ไม่ทริกเกอร์ CarVolumeCallback
อีกต่อไป วิธีนี้จะป้องกันไม่ให้มีทริกเกอร์ซ้ำในแอปเดียวกันสำหรับเหตุการณ์เดียวกัน
เราขอแนะนำอย่างยิ่งให้คุณใช้ CarVolumeGroupEventCallback
เพื่อจัดการระดับเสียงของกลุ่มและการปิดเสียงการเปลี่ยนแปลง
เสียงได้รับการโทรกลับ
ตั้งแต่ Android 13 เป็นต้นมา AudioControl HAL สามารถกระตุ้นการโทรกลับแบบอะซิงโครนัสเพื่อจัดการการอัปเดตระดับเสียงเนื่องจากการเปลี่ยนแปลงระบบเครื่องเสียงรถยนต์
ฮาล API
ควบคุมเสียง @2.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 2.0 เพิ่ม API ต่อไปนี้:
เอพีไอ | วัตถุประสงค์ |
---|---|
IAudioControl#registerGainCallback | ลงทะเบียน IAudioGainCallback ด้วย AudioControl HAL |
IAudioGainCallback#onAudioDeviceGainsChanged | การโทรกลับแบบอะซิงโครนัสเพื่อแจ้งการเปลี่ยนแปลงการกำหนดค่าการรับเสียง |
การเรียกกลับ AudioControl HAL ประกอบด้วยรายการเหตุผลและ AudioGainConfigInfo
ที่เกี่ยวข้อง ซึ่งประกอบด้วย:
- รหัสโซน
- ที่อยู่พอร์ตอุปกรณ์
- ดัชนีปริมาณ > ดัชนีอาจเป็นดัชนีแบบจำกัดหรือดัชนีอัปเดตก็ได้
สาเหตุสามารถแบ่งได้กว้างๆ ดังนี้:
- เหตุผลในการจำกัด การเปลี่ยนแปลงระดับเสียงและพฤติกรรมการปิดเสียงชั่วคราว
- สาเหตุการอัพเดท การเปลี่ยนแปลงพฤติกรรมของวอลุ่มอย่างถาวร
ประเภทข้อจำกัด
สำหรับ AudioControl
HAL AIDL
V3
ประเภทของข้อจำกัดที่รองรับมีดังนี้:
- ปิดเสียง
- การปิดกั้น
- ข้อจำกัด
- การลดทอน
ข้อ จำกัด ที่ใช้งานอยู่ | การเปลี่ยนแปลงระดับเสียงที่ผู้ใช้กระตุ้น | สลับการปิดเสียงที่ผู้ใช้ทริกเกอร์ |
---|---|---|
ปิดเสียง | ❌ | ❌ (เปิดเสียง) ✔ (ปิดเสียง) |
การปิดกั้น | ❌ | ✔ |
ข้อจำกัด | ❌ (เกินขีดจำกัด) ✔ (ไม่เกินขีดจำกัด) | ✔ |
การลดทอน | ✔ | ✔ |
ลำดับความสำคัญระหว่างข้อจำกัดคือ ปิดเสียง > การบล็อก > ข้อจำกัด > การลดทอน
ข้อจำกัดการปิดเสียง
ข้อจำกัดการปิดเสียงคือ:
-
Reasons.TCU_MUTE
-
Reasons.REMOTE_MUTE
เฟรมเวิร์กเครื่องเสียงรถยนต์จะรักษาสถานะการปิดเสียงทั้งสองนี้ไว้ภายใน:
ผู้ใช้ปิดเสียง สลับตามคำขอจากผู้ใช้ ไม่ว่าจะผ่าน
CarAudioManager
หรือเหตุการณ์สำคัญฮาล ปิดเสียง สลับตามข้อจำกัดการปิดเสียงที่ได้รับผ่านการโทรกลับ
AudioGain
สำหรับผู้ฟังเช่นแอปการตั้งค่า สถานะการปิดเสียงโดยรวมของกลุ่มวอลุ่ม ( CarVolumeGroupInfo.isMuted()
) จะขึ้นอยู่กับว่ามีการเปิดใช้งานการปิดเสียงอย่างใดอย่างหนึ่งข้างต้นหรือไม่
เมื่อเปิดใช้งานการปิดเสียง HAL การเปลี่ยนแปลงระดับเสียงขาเข้าทั้งหมดและคำขอเปิดเสียงแบบกลุ่มจะถูกละเว้นตลอดระยะเวลาของข้อจำกัด
กรณีการโต้ตอบ: การปิดเสียง HAL ทำงานอยู่ และคำขอของผู้ใช้สำหรับการสลับการปิดเสียง
เมื่อเปิดใช้งานการปิดเสียง HAL และการปิดเสียงผู้ใช้ถูกปิดใช้งาน:
- สถานะการปิดเสียงโดยรวมของกลุ่มวอลุ่มถูกเปลี่ยนเป็น
true
- คำขอจากผู้ใช้เพื่อเปิดใช้งานการปิดเสียงจะได้รับการประมวลผล
- เหตุผล: ควรปฏิบัติตามคำขอปิดเสียงของผู้ใช้ตลอดเวลาเพื่อรักษาความเป็นส่วนตัวของผู้ใช้
เมื่อเปิดใช้งานการปิดเสียง HAL และการปิดเสียงผู้ใช้เปิดใช้งานอยู่:
สถานะการปิดเสียงโดยรวมของกลุ่มวอลุ่มถูกเปลี่ยนเป็น
true
คำร้องขอจากผู้ใช้ให้ปิดการใช้งานการปิดเสียงจะ
NOT
ได้รับการประมวลผล สถานะปิดเสียงผู้ใช้แคชยังคงเปิดใช้งานอยู่เหตุผล: คำขอเปิดเสียงของผู้ใช้จะได้รับการยอมรับก็ต่อเมื่อไม่มีข้อจำกัดที่ใช้งานอยู่
เหตุผล: การยกเลิกการปิดเสียงที่แคชไว้ การปิดเสียงผู้ใช้อาจทำให้เกิดเสียงระเบิดโดยไม่ได้ตั้งใจและเป็นอันตรายต่อความปลอดภัยของผู้ใช้ โดยเฉพาะอย่างยิ่งหากเปิดใช้งานสถานะปิดเสียงตลอดวงจรการจุดระเบิด ซึ่งจะลดการรับรู้ของผู้ใช้เกี่ยวกับการรับรู้ระดับเสียง
กรณีการโต้ตอบ: เปิดใช้งานและปิดใช้งาน HAL Mute ในขณะที่การปิดเสียงผู้ใช้ไม่มีการเปลี่ยนแปลง
การสลับการปิดเสียง HAL จะเปลี่ยนสถานะการปิดเสียงโดยรวมของกลุ่มวอลุ่ม อย่างไรก็ตาม จะไม่อัปเดตสถานะการปิดเสียงของผู้ใช้โดยตรง เมื่อปิดเสียงผู้ใช้ถูกปิดใช้งานและได้รับการโทรกลับเพื่อปิดเสียง HAL เพื่อเปิดใช้งาน:
- สถานะการปิดเสียงโดยรวมของกลุ่มวอลุ่มถูกเปลี่ยนเป็น
true
คำร้องขอเปลี่ยนระดับเสียงจากผู้ใช้จะ
NOT
ได้รับการประมวลผลในขณะที่เปิดใช้งานการปิดเสียง HALเหตุผล: ผู้ใช้ไม่สามารถรับรู้เสียงได้ในขณะที่เปิดใช้งานการปิดเสียง การปล่อยให้เปลี่ยนระดับเสียงอาจส่งผลให้เกิดเสียงระเบิดและเป็นอันตรายต่อความปลอดภัยของผู้ใช้
เหตุผล: แอพ Volume สามารถลงทะเบียนสำหรับการโทรกลับและทริกเกอร์การเปิดเสียง (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ 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 จึงสามารถอัพเดตดัชนีปัจจุบันของกลุ่มวอลุ่มเป็นดัชนีที่ระบุได้ โดยหลักแล้วจะใช้เป็นการตอบรับจากระบบเสียงสำหรับคำขอเปลี่ยนระดับเสียงจากเฟรมเวิร์กเครื่องเสียงรถยนต์ การอัปเดตดัชนียังได้รับการสื่อสารกับ Apps ในรูปแบบการโทรกลับ CarVolumeGroupEvent
เพื่อซิงโครไนซ์ดัชนี
ตัวอย่าง
กรณีการใช้งาน: ผู้ใช้อัปเดตดัชนีปริมาณเป็น 30
ผู้ใช้ใช้แอพ Volume เพื่อเปลี่ยนดัชนีระดับเสียงเป็น 30
ดัชนีนี้จะถูกแปลงเป็นการเพิ่มระดับเสียงและส่งไปยัง Audio HAL
การใช้งาน
Audio HAL
ของผู้จำหน่ายจะได้รับระดับเสียงที่เพิ่มขึ้นและอัพเดตระบบเสียง (เช่น แอมป์ภายนอก)ระบบเสียงตอบสนองว่าระดับเสียงได้รับการอัปเดตเป็นดัชนี 15 เท่านั้น (ด้วยเหตุผลที่ Android ไม่รู้จัก)
การใช้งานของผู้จำหน่ายทริกเกอร์
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
บริการเครื่องเสียงรถยนต์ใช้ดัชนีใหม่จากการโทรกลับที่ใช้สำหรับการคงอยู่และการโทรกลับไปยังแอประดับเสียง ดัชนีที่ผู้ใช้ร้องขอคือ 30 อย่างไรก็ตาม ผลตอบรับแบบอะซิงโครนัสของระบบเสียงจะอัปเดตดัชนีเป็น 15
กรณีการใช้งาน: การเล่นเสียงครั้งแรกหลังจากออกจากการระงับ
ดัชนีระดับเสียงก่อนการระงับถูกตั้งค่าไว้ที่ระดับสูงที่ 95 (ช่วง: [0-99])
Android เข้าสู่การระงับ
เมื่อ Android มีอยู่ ให้ระงับ (เช่น ดำเนินการต่อ):
ผู้จัดจำหน่าย
Audio HAL/AudioControl HAL
ใช้ดัชนีความปลอดภัย 30 กับระบบเสียงภายในเครื่องผู้ขาย
AudioControl HAL
ยังทริกเกอร์การเรียกกลับสำหรับดัชนีที่ปลอดภัย:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
บริการเครื่องเสียงรถยนต์ใช้ดัชนีใหม่จากการโทรกลับที่ใช้สำหรับการคงอยู่และการเรียกกลับของตัวเองไปยังแอพระดับเสียงที่ซิงโครไนซ์ดัชนี ดัชนีระดับเสียงก่อนการหยุดชั่วคราวคือ 95 อย่างไรก็ตาม หลังจากดำเนินการต่อ ดัชนีนี้จะถูกตั้งค่าเป็นระดับเสียงที่ปลอดภัยที่ 30 โดยตัวดำเนินการ
AudioControl HAL
การกำหนดค่าไดรฟ์ข้อมูลแบบไดนามิก
สำหรับฟีเจอร์นี้ เราจะพิจารณากรณีการใช้งานหลักดังต่อไปนี้:
การกำหนดค่าจุดสิ้นสุดสายการผลิต (EOL) ของยานพาหนะ
ผู้ผลิตรถยนต์ต้องการอัปเดตการกำหนดค่าระดับเสียงที่ EOL ตามการตั้งค่าระบบเครื่องเสียงรถยนต์ โดยทั่วไป นี่คือไซด์โหลดโดยไม่ต้องอัปเดตอิมเมจ Android SW
ผู้ผลิตรถยนต์อาจจำเป็นต้องอัปเดตการกำหนดค่าระดับเสียงระหว่างกำหนดการให้บริการ
การกำหนดค่ารันไทม์ ระบบเครื่องเสียงรถยนต์รองรับการกำหนดค่าเครื่องขยายเสียงภายนอก และ ECU เหล่านี้อาจโฮสต์การกำหนดค่าช่วงระดับเสียงที่มีการสอบถามระหว่างเวลาบูต
การกำหนดค่าตามความต้องการ นำเสนอเพื่อรองรับความต้องการที่เพิ่มขึ้นสำหรับฟีเจอร์เสียงตามความต้องการ ซึ่งผู้ใช้สมัครรับการประมวลผลสัญญาณที่ได้รับการปรับปรุงเป็นระยะเวลาหนึ่ง การกำหนดค่าช่วงวอลุ่มใหม่ใช้ได้ตลอดระยะเวลาการสมัครรับข้อมูล
ออกแบบ
การกำหนดค่าไดนามิกวอลุ่มทำได้ในสามขั้นตอน:
การค้นพบ. การใช้งาน AudioControl HAL ของผู้จำหน่ายจะค้นพบการอัพเดตช่วงวอลุ่มใหม่ผ่านกลไก IPC แบบกำหนดเองที่ผู้จำหน่ายเป็นเจ้าของ
เมื่อค้นพบแล้ว การโทรกลับจะถูกสร้างขึ้นผ่าน
AudioControl::IModuleChangeCallback
อัปเดต. กลุ่มเครื่องเสียงรถยนต์จะอัพเดตสถานะกลุ่มระดับเสียงด้วยช่วงระดับเสียงใหม่
มีความพยายามในการรักษาระดับเสียงเดิมหลังการอัปเดตช่วงระดับเสียง อย่างไรก็ตาม หากดัชนีอยู่นอกขอบเขต ดัชนีปริมาณปัจจุบันจะถูกตั้งค่าเป็นค่าที่ปลอดภัย ตัวอย่างเช่น ระดับเริ่มต้นที่ผู้ขายระบุไว้ในระหว่างการโทรกลับ
โทรกลับ.
หลังการอัปเดตช่วงกลุ่มวอลุ่ม สแต็คเครื่องเสียงรถยนต์จะทริกเกอร์การเรียกกลับไปยังแอพที่ลงทะเบียนผ่าน
CarVolumeGroupEventCallback
CarVolumeGroupEvent
มีCarVolumeGroupInfo
ที่อัปเดตแล้ว ประเภทเหตุการณ์ (สิ่งที่เปลี่ยนแปลง) และข้อมูลเพิ่มเติม (เหตุใดจึงเปลี่ยน)
รูปที่ 1. การกำหนดค่าวอลุ่มแบบไดนามิก
ฮาล API
ระบบควบคุมเสียง @ 3.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 3.0 แนะนำ API ต่อไปนี้:
เอพีไอ | |
---|---|
IAudioControl#setModuleChangeCallback | ตั้งค่าอินสแตนซ์ของ IModuleChangeCallback ด้วย AudioControl HAL |
IAudioControl#clearModuleChangeCallback | ล้างอินสแตนซ์ของ IModuleChangeCallback ที่ตั้งค่าไว้ก่อนหน้านี้ด้วย AudioControl HAL |
IModuleChangeCallback#onAudioPortsChanged | โทรกลับเพื่อแจ้งการเปลี่ยนแปลง AudioPorts |
ลำดับ
แผนภาพลำดับของการกำหนดค่าไดนามิกวอลุ่มแสดงอยู่ด้านล่าง
รูปที่ 2 แผนภาพลำดับสำหรับการกำหนดค่าวอลุ่มแบบไดนามิก
ประเด็นสำคัญ
หากต้องการปรับคุณลักษณะนี้ให้เหมาะสม ให้พิจารณาสิ่งต่อไปนี้
AudioPort ที่ให้มาเป็นส่วนหนึ่งของการโทรกลับ จะต้อง ตรงกับคำจำกัดความของ Automotive BUS:
- พอร์ตอุปกรณ์
IN_DEVICE
,OUT_DEVICE
- การเชื่อมต่อ.
BUS
- ที่อยู่. กำหนดไว้ในคำจำกัดความของ Audio HAL
- โหมดกำไร
JOINT
- พอร์ตอุปกรณ์
ผู้ขาย จะต้อง กำหนดชุดพิเศษของคำจำกัดความช่วงระดับเสียงในนโยบาย Audio HAL และใช้การโทรกลับเพื่อปรับแต่งให้เหมาะกับรุ่นต่างๆ ของยานพาหนะ ดูคำจำกัดความ
IModuleChangeCallbac
AIDL สำหรับข้อมูลเพิ่มเติมเมื่อ Audio BUS มากกว่าหนึ่งตัวอยู่ในกลุ่มวอลุ่มเดียวกัน แต่ละบัส จะต้อง มีคำจำกัดความช่วงระดับเสียงที่เหมือนกัน หากไม่ทำเช่นนั้นส่งผลให้เฟรมเวิร์กเครื่องเสียงรถยนต์ปฏิเสธคำจำกัดความช่วงระดับเสียงใหม่