การจัดการวอลุ่มอยู่ใน CarAudioService
ซึ่งใช้วอลุ่มคงที่
โดยคาดว่าฮาร์ดแวร์จะใช้วอลุ่มต่ำกว่า HAL
แอมป์ขยายเสียงแทนในซอฟต์แวร์ CarAudioService
จัดระเบียบอุปกรณ์เอาต์พุต
เป็นกลุ่มระดับเสียงเพื่อใช้กำไรเดียวกันกับอุปกรณ์ทั้งหมดที่เชื่อมโยงกับ
กลุ่มระดับเสียง
ปริมาณคงที่
การติดตั้งใช้งาน AAOS จะใช้โปรแกรมขยายสัญญาณฮาร์ดแวร์เพื่อควบคุมระดับเสียงแทน
โปรแกรมผสมซอฟต์แวร์ หากต้องการหลีกเลี่ยงผลข้างเคียง ให้ตั้งค่าสถานะ 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 เครื่องมีสตรีมที่เปิดใช้งานอยู่
เมื่อไรจะเป็ด
แม้ว่า 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
|
ข้อควรพิจารณาเมื่อลด
แอปและบริการบางอย่าง เช่น การนำทางหรือผู้ช่วย อาจใช้ เพื่อให้ผู้เล่นดำเนินการต่างๆ ได้ หลีกเลี่ยงการทำให้ข้อมูลไม่ราบรื่นมากเกินไปเมื่อมีสตรีมข้อมูล หยุดไหลผ่านอุปกรณ์เอาต์พุตเพื่อให้แน่ใจว่าสื่อจะไม่กลับสู่ความเต็ม ก่อนที่จะปิดเสียงก่อน3 เล่นครั้งต่อไปจากการนำทางหรือ แอป 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
เนื่องจากเป็น Matt แรก
ในไฟล์
<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
แล้ว Callback
สำหรับผู้ฟัง เช่น แอปการตั้งค่า การปิดเสียงโดยรวมของกลุ่มระดับเสียง
(CarVolumeGroupInfo.isMuted()
) จะขึ้นอยู่กับสถานะ
ปิดเสียงไว้ด้านบน
เมื่อเปิดใช้การปิดเสียง HAL ระดับเสียงขาเข้าทั้งหมดและการเปิดเสียงกลุ่ม ระบบจะไม่สนใจคำขอตลอดระยะเวลาการจำกัด
กรณีการโต้ตอบ: การปิดเสียง HAL เปิดใช้งานอยู่ และคำขอของผู้ใช้สำหรับการสลับการปิดเสียง
เมื่อเปิดใช้การปิดเสียง HAL และปิดใช้การปิดเสียงผู้ใช้
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
- คำขอจากผู้ใช้ให้เปิดใช้การปิดเสียงจะได้รับการดำเนินการ
- เหตุผล: ควรปฏิบัติตามคำขอซ่อนผู้ใช้เสมอเพื่อรักษาความเป็นส่วนตัวของผู้ใช้
เมื่อเปิดใช้การปิดเสียง HAL และเปิดใช้การปิดเสียงผู้ใช้ ให้ทำดังนี้
สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
คำขอจากผู้ใช้ให้ปิดใช้การปิดเสียงจะได้รับการประมวลผล
NOT
ผู้ใช้ที่แคชไว้ ยังคงเปิดใช้สถานะปิดเสียงอยู่เหตุผล: คำขอเปิดเสียงของผู้ใช้จะใช้งานได้ก็ต่อเมื่อไม่มีข้อจำกัดที่ใช้งานอยู่เท่านั้น
สาเหตุ: การเปิดเสียงผู้ใช้ที่แคชไว้อาจทำให้เกิดเสียงระเบิดโดยไม่ได้ตั้งใจและ ที่เป็นอันตรายต่อผู้ใช้ โดยเฉพาะอย่างยิ่งหากสถานะปิดเสียงเปิดใช้อยู่ ในรอบการติดไฟ ซึ่งจะทำให้ผู้ใช้ลดต่ำลง การรับรู้ระดับเสียง การรับรู้ได้
กรณีการโต้ตอบ: การปิดเสียง HAL เปิดใช้อยู่และปิดใช้อยู่ในขณะที่การปิดเสียงผู้ใช้ไม่มีการเปลี่ยนแปลง
การเปิด/ปิดเสียง HAL จะเป็นการเปลี่ยนสถานะปิดเสียงโดยรวมของกลุ่มระดับเสียง อย่างไรก็ตาม ไม่อัปเดตสถานะปิดเสียงของผู้ใช้โดยตรง เมื่อปิดฟีเจอร์การปิดเสียงของผู้ใช้และปิดเสียง HAL ได้รับการติดต่อกลับเพื่อเปิดใช้งาน:
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
คำขอจากผู้ใช้ให้เปลี่ยนระดับเสียงจะได้รับการ
NOT
ดำเนินการในขณะที่ปิดเสียง HAL ไว้เหตุผล: ผู้ใช้ไม่ได้ยินเสียงเมื่อเปิดใช้การปิดเสียง การอนุญาต การเปลี่ยนระดับเสียงอาจส่งผลให้เกิดเสียงระเบิดและความปลอดภัยที่เป็นอันตรายต่อผู้ใช้
สาเหตุ: แอประดับเสียงจะลงทะเบียนสำหรับ Callback และทริกเกอร์การเปิดเสียงได้ (CarAudioManager.setVolumeGroupMute(...,/* กีดเสียง=*/ 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 เป็น Callback CarVolumeGroupEvent
เพื่อซิงค์ข้อมูลด้วย
ดัชนี
ตัวอย่าง
กรณีการใช้งาน: ผู้ใช้อัปเดตดัชนีวอลุ่มเป็น 30
ผู้ใช้ใช้แอประดับเสียงเพื่อเปลี่ยนดัชนีระดับเสียงเป็น 30
ระบบจะแปลงดัชนีนี้เป็นการเพิ่มระดับเสียงและส่งไปยัง HAL ของเสียง
การใช้งาน
Audio HAL
ของผู้ให้บริการจะได้รับการเพิ่มและอัปเดตปริมาณใหม่ ระบบเสียง (เช่น แอมป์ภายนอก)ระบบเสียงตอบรับว่าระดับเสียงจะอัปเดตเป็นดัชนี 15 เท่านั้น (ด้วยเหตุผลที่ Android ไม่รู้จัก)
การใช้งานทริกเกอร์
AudioControl HAL
ของผู้ให้บริการ:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
บริการเสียงรถยนต์จะใช้ดัชนีใหม่จาก Callback ที่ใช้สำหรับ การคงอยู่และการเรียกกลับไปยังแอป Volume ดัชนีที่ผู้ใช้ขอคือ 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 ของตัวเองไปยังแอป Volume ที่ซิงค์ดัชนี ดัชนีปริมาณก่อนระงับคือ 95 อย่างไรก็ตาม หลังจากที่เปิดใช้งานอีกครั้ง ดัชนีนี้จะ กำหนดเป็นระดับเสียงที่ปลอดภัยที่ 30 โดยผู้ติดตั้งใช้งาน
AudioControl HAL
การกำหนดค่าวอลุ่มแบบไดนามิก
สำหรับฟีเจอร์นี้ เราจะพิจารณากรณีการใช้งานหลักต่อไปนี้
การกำหนดค่า End-of-line (EOL) ของยานพาหนะ
ผู้ผลิตรถยนต์ต้องการอัปเดตการกำหนดค่าระดับเสียงที่ EOL โดยอิงตามยานพาหนะ การตั้งค่าระบบเสียง โดยปกติแล้วจะเป็นการโหลดจากแหล่งที่ไม่รู้จักโดยไม่ต้องอัปเดต รูปภาพ Android SW
ผู้ผลิตอัตโนมัติอาจต้องอัปเดตการกำหนดค่าระดับเสียงระหว่าง กำหนดการของบริการ
การกำหนดค่ารันไทม์ ระบบเสียงในรถยนต์รองรับภายนอก การกำหนดค่าเครื่องขยายเสียงและ ECU เหล่านี้อาจโฮสต์ช่วงระดับเสียง ที่มีการค้นหาในระหว่างเปิดเครื่อง
การกำหนดค่าแบบออนดีมานด์ นำเสนอเพื่อรองรับความต้องการที่เพิ่มขึ้น ฟีเจอร์เสียงที่อิงตามดีมานด์ ซึ่งผู้ใช้จะสมัครรับสัญญาณที่เพิ่มประสิทธิภาพ การประมวลผลในช่วงเวลาหนึ่ง การกำหนดค่าช่วงระดับเสียงใหม่คือ ใช้ได้ตลอดระยะเวลาการสมัครใช้บริการ
การออกแบบ
การกำหนดค่าระดับเสียงแบบไดนามิกทำได้ 3 ขั้นตอนดังนี้
การค้นพบ การใช้ AudioControl HAL ของผู้ให้บริการค้นพบระดับเสียงใหม่ การอัปเดตช่วงผ่านกลไก IPC ที่กำหนดเองซึ่งผู้ให้บริการเป็นเจ้าของ
เมื่อค้นพบแล้ว Callback จะสร้างขึ้นโดยใช้
AudioControl::IModuleChangeCallback
อัปเดต ชุดอุปกรณ์เสียงในรถยนต์จะอัปเดตสถานะกลุ่มระดับเสียงด้วย ช่วงระดับเสียง
เราพยายามที่จะรักษาระดับเสียงให้เท่าเดิมหลังจากอัปเดตช่วงระดับเสียง แต่หากดัชนีอยู่นอกขอบเขต ระบบจะตั้งค่าดัชนีปริมาณปัจจุบันเป็น ค่าที่ปลอดภัย ตัวอย่างเช่น ระดับเริ่มต้นที่ผู้ให้บริการกำหนดระหว่าง Callback
โทรกลับ
โพสต์การอัปเดตช่วงกลุ่มระดับเสียง สแต็กเครื่องเสียงในรถยนต์จะเรียกใช้ Callback ไปยัง แอปที่ลงทะเบียนผ่าน
CarVolumeGroupEventCallback
CarVolumeGroupEvent
จะมีCarVolumeGroupInfo
ประเภทเหตุการณ์ที่อัปเดตแล้ว (สิ่งที่เปลี่ยนแปลง) และ Extra-info (สาเหตุที่มีการเปลี่ยนแปลง)
รูปที่ 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 สำหรับข้อมูลเพิ่มเติมเมื่อมีบัสเสียงมากกว่า 1 รายการอยู่ในกลุ่มระดับเสียงเดียวกัน แต่ละ BUS จะต้อง มีการกำหนดช่วงระดับเสียงที่เหมือนกัน หากไม่ปฏิบัติตาม จะเกิดเหตุรถติด เฟรมเวิร์กเสียงปฏิเสธการกำหนดช่วงระดับเสียงใหม่