การจัดการระดับเสียงอยู่ใน 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
คือจํานวนกลุ่มระดับเสียงในโซนนั้น วิธีนี้ทำให้รหัสกลุ่มโวลุ่มซ้ำกันได้ในโซนต่างๆ ตัวระบุเหล่านี้ใช้สำหรับ 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 จะเป็นข้อผิดพลาด
คุณเป็นผู้ตัดสินใจว่าจะนําค่าเหล่านี้ไปใช้อย่างไรและวิธีแสดงค่าต่อผู้ใช้ โดยอาจใช้กับสื่อเท่านั้น หรือใช้กับเสียงทั้งหมดใน Android ก็ได้ นอกจากนี้ Android 11 ยังรองรับการใช้เอฟเฟกต์เสียงกับอุปกรณ์เอาต์พุตด้วย ซึ่งจะช่วยให้คุณจัดการการเลือนและการปรับสมดุลผ่านเอฟเฟกต์เสียงในอุปกรณ์เอาต์พุตที่เหมาะสมแทนที่จะใช้ API เหล่านี้ได้
การลดเสียง
การลดเสียงจะเกิดขึ้นเมื่อรถลดอัตราขยายสำหรับสตรีมหนึ่งเพื่อให้ได้ยินสตรีมอื่นที่เล่นพร้อมกันได้ชัดเจนยิ่งขึ้น ใน AAOS ระบบ HAL จะเป็นผู้ลดเสียง Android ไม่สามารถควบคุมเสียงได้นอกเหนือจากระบบปฏิบัติการ ใน Android 11 ข้อมูลหลักที่ HAL มีให้เพื่อตัดสินใจเกี่ยวกับการทำให้เสียงเบาลงคืออุปกรณ์เอาต์พุต 2 เครื่องมีสตรีมทำงานอยู่หรือไม่
กรณีที่ควรหลบ
แม้ว่า OEM แต่ละรายจะเป็นผู้กำหนดวิธีจัดการการลดเสียงของ HAL แต่เราขอแนะนำให้ใช้หลักเกณฑ์ต่อไปนี้
การเล่นสตรีมหลายรายการใน Android มักเกิดขึ้นเมื่อแอปหรือบริการ 2 แอปหรือบริการ 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
|
ข้อควรพิจารณาเมื่อใช้การลดเสียง
แอปและบริการบางอย่าง เช่น การนําทางหรือผู้ช่วย อาจใช้เพลเยอร์หลายรายการเพื่อดําเนินการ หลีกเลี่ยงการลดระดับเสียงอย่างรุนแรงเมื่อสตรีมข้อมูลหยุดไหลผ่านอุปกรณ์เอาต์พุตเพื่อให้แน่ใจว่าสื่อจะไม่กลับมาเป็นระดับเสียงดังเต็มที่ก่อนที่จะถูกลดระดับเสียงก่อนที่จะเริ่มการเล่นครั้งถัดไปจากการนําทางหรือแอปผู้ช่วย
สำหรับยานพาหนะที่มีหลายสเตจเสียงที่มีการแยกเสียงได้ดีพอ คุณสามารถกําหนดเส้นทางเสียงไปยังส่วนต่างๆ ของรถแทนการลดระดับเสียง เช่น ระบบสามารถส่งเส้นทางไปยังลำโพงบนพนักพิงศีรษะของผู้โดยสารด้านหน้าขณะที่เล่นเพลงทั่วทั้งห้องโดยสารด้วยระดับเสียงปกติ
เสียงที่มีความสำคัญต่อความปลอดภัย
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()
เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง
เหตุการณ์กลุ่มระดับเสียงของรถยนต์
Use Case ยานยนต์ของการอัปเดตระดับเสียงและการสลับปิดเสียงมีรากฐานตามบริบทที่อาจกำหนดการดำเนินการของแอปบางแอป เช่น การตั้งค่าระดับเสียง การเรียกกลับระดับเสียงและปิดเสียงปัจจุบันจากกองซ้อนเสียงของรถยนต์จะให้ข้อมูลตามบริบทแบบจำกัด เราได้เพิ่ม CarVolumeGroupEvent ลงใน Android 14 เพื่อรองรับกรณีการใช้งานยานยนต์และความสามารถในการปรับขนาดในอนาคตได้ดียิ่งขึ้น แต่ละเหตุการณ์มีข้อมูลสำคัญ 3 ประเภท ได้แก่
- รายการ
CarVolumeGroupInfo
EventTypes
(แมปบิต)- รายการ
ExtraInfos
CarVolumeGroupInfo
ผู้รับการเรียกกลับเหตุการณ์จะเข้าถึงข้อมูลกลุ่มปริมาณรถที่ได้รับผลกระทบได้ทันที ซึ่งหมายความว่าแอปไม่จําเป็นต้องเรียกใช้เฟรมเวิร์กเสียงรถยนต์เพิ่มเติมเพื่อรับสถานะล่าสุด เพียงแค่ใช้ CarVolumeGroupInfos
ที่ได้รับเพื่ออัปเดต UI หรือสถานะภายใน เราได้ระบุแง่มุมที่เปลี่ยนแปลงในกลุ่มปริมาณการฟังเพลงในรถยนต์ไว้ใน EventTypes
ด้วย ตามที่อธิบายไว้ด้านล่าง เพื่อให้แอปทำงานได้ง่ายขึ้น
EventTypes
กำหนดว่าCarVolumeGroupInfo
มีการเปลี่ยนแปลงในด้านใด แอปสามารถใช้ข้อมูลนี้เพื่อระบุการเปลี่ยนแปลงและดำเนินการที่จำเป็น เช่น EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
บ่งชี้ว่าดัชนีการเพิ่มขึ้นของปริมาณสูงสุด CarVolumeGroups
ที่เกี่ยวข้องมีการเปลี่ยนแปลงและสามารถค้นหาได้โดยใช้ CarVolumeGroupInfo.getMaxVolumeGainIndex()
ตารางต่อไปนี้แสดงความสัมพันธ์ระหว่าง EventType
กับ CarVolumeGroupInfo
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.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
ให้ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่ 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 สามารถเรียกใช้การเรียกกลับแบบไม่พร้อมกันเพื่อจัดการการอัปเดตระดับเสียงเนื่องจากการเปลี่ยนแปลงระบบเสียงของรถยนต์
HAL API
AudioControl @2.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 2.0 เพิ่ม API ต่อไปนี้
API | วัตถุประสงค์ |
---|---|
IAudioControl#registerGainCallback |
ลงทะเบียนอินสแตนซ์ของ IAudioGainCallback กับ HAL ของ AudioControl |
IAudioGainCallback#onAudioDeviceGainsChanged |
การเรียกกลับแบบไม่พร้อมกันเพื่อแจ้งการเปลี่ยนแปลงการกำหนดค่าการขยายเสียง |
การเรียกกลับ HAL ของ AudioControl มีรายการเหตุผลและ AudioGainConfigInfo
ที่เกี่ยวข้อง ซึ่งประกอบด้วย
- รหัสโซน
- ที่อยู่พอร์ตของอุปกรณ์
- ดัชนีของปริมาณ > ดัชนีอาจเป็นดัชนีที่จํากัดหรือดัชนีการอัปเดตก็ได้
สาเหตุอาจแบ่งออกเป็น 2 หมวดหมู่ใหญ่ๆ ดังนี้
- เหตุผลในการจำกัด การเปลี่ยนแปลงชั่วคราวของระดับเสียงและลักษณะการปิดเสียง
- อัปเดตเหตุผล การเปลี่ยนแปลงลักษณะการทำงานระดับเสียงอย่างถาวร
ประเภทข้อจำกัด
ณ วันที่ AudioControl
HAL AIDL
V3
ประเภทข้อจำกัดที่รองรับมีดังนี้
- ปิดเสียง
- จะมีการบล็อก
- ข้อจํากัด
- การลดทอน
การจํากัดที่ใช้งานอยู่ | การเปลี่ยนแปลงระดับเสียงที่ผู้ใช้เรียกให้แสดง | ปุ่มเปิด/ปิดเสียงที่ผู้ใช้ทริกเกอร์ |
---|---|---|
ปิดเสียง | ❌ | ❌ (เปิดเสียง) ✔ (ปิดเสียง) |
จะมีการบล็อก | ❌ | ✔ |
ข้อจํากัด | ❌ (เกินขีดจำกัด) ✔ (ไม่เกินขีดจำกัด) |
✔ |
การลดทอน | ✔ | ✔ |
ลำดับความสำคัญของข้อจำกัดคือ ปิดเสียง > การบล็อก > การจํากัด > การลดระดับ
การจำกัดการปิดเสียง
ข้อจำกัดในการปิดเสียงมีดังนี้
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
เฟรมเวิร์กระบบเสียงของรถยนต์จะรักษาสถานะปิดเสียง 2 สถานะนี้ไว้ภายใน
ปิดเสียงผู้ใช้ เปิด/ปิดตามคําขอจากผู้ใช้ผ่าน
CarAudioManager
หรือเหตุการณ์สําคัญHAL ปิดเสียง เปิด/ปิดตามข้อจำกัดการปิดเสียงที่ได้รับผ่าน
AudioGain
การเรียกกลับ
สําหรับผู้ฟัง เช่น แอปการตั้งค่า สถานะการปิดเสียงโดยรวมของกลุ่มระดับเสียง (CarVolumeGroupInfo.isMuted()
) จะขึ้นอยู่กับว่ามีการเปิดใช้การปิดเสียงอย่างใดอย่างหนึ่งข้างต้นหรือไม่
เมื่อเปิดใช้การปิดเสียง HAL ระบบจะไม่สนใจคำขอเปลี่ยนระดับเสียงและคำขอเลิกปิดเสียงกลุ่มทั้งหมดที่เข้ามาในระหว่างที่จำกัด
กรณีการโต้ตอบ: HAL mute เปิดใช้งานอยู่และผู้ใช้ขอเปิด/ปิดการปิดเสียง
เมื่อเปิดใช้การปิดเสียง HAL และปิดใช้การปิดเสียงของผู้ใช้
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
- ระบบจะดำเนินการตามคำขอของผู้ใช้เพื่อเปิดใช้การปิดเสียง
- เหตุผล: เราควรดำเนินการตามคำขอปิดเสียงของผู้ใช้เสมอเพื่อรักษาความเป็นส่วนตัวของผู้ใช้
เมื่อเปิดใช้การปิดเสียง HAL และเปิดใช้การปิดเสียงของผู้ใช้
สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
ระบบจะดำเนินการตามคำขอของผู้ใช้ให้ปิดใช้การปิดเสียง
NOT
สถานะการปิดเสียงของผู้ใช้ที่แคชไว้จะยังคงเปิดใช้อยู่เหตุผล: ระบบจะดำเนินการตามคำขอเลิกระงับของผู้ใช้ก็ต่อเมื่อไม่มีข้อจำกัดที่ใช้งานอยู่
เหตุผล: การเลิกปิดเสียงที่แคชไว้ของผู้ใช้อาจทำให้เกิดเสียงดังโดยไม่ตั้งใจและทําให้ผู้ใช้ไม่ปลอดภัย โดยเฉพาะอย่างยิ่งหากเปิดใช้สถานะปิดเสียงในรอบการจุดระเบิด ซึ่งทำให้ผู้ใช้รับรู้ระดับเสียงได้น้อยลง
กรณีการโต้ตอบ: เปิดใช้และปิดใช้การปิดเสียง HAL ขณะที่การปิดเสียงของผู้ใช้ไม่มีการเปลี่ยนแปลง
การปิด/เปิดการปิดเสียง HAL จะเปลี่ยนสถานะการปิดเสียงโดยรวมของกลุ่มระดับเสียง แต่จะไม่อัปเดตสถานะการปิดเสียงของผู้ใช้โดยตรง เมื่อปิดใช้การปิดเสียงของผู้ใช้และได้รับ callback เพื่อเปิดใช้การปิดเสียง HAL ให้ทำดังนี้
- สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น
true
ระบบ
NOT
จะดำเนินการตามคำขอของผู้ใช้เพื่อเปลี่ยนระดับเสียงขณะที่เปิดใช้การปิดเสียง HALเหตุผล: ผู้ใช้ไม่ได้ยินเสียงขณะที่เปิดใช้การปิดเสียง การอนุญาตให้เปลี่ยนระดับเสียงอาจส่งผลให้มีเสียงดังมากและอาจเป็นอันตรายต่อความปลอดภัยของผู้ใช้
เหตุผล: แอประดับเสียงสามารถลงทะเบียนการเรียกกลับและทริกเกอร์การเลิกปิดเสียง (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 จึงอัปเดตดัชนีปัจจุบันของกลุ่มระดับเสียงเป็นดัชนีที่ระบุได้ ข้อมูลนี้ใช้เป็นหลักเป็นฟีดแบ็กจากระบบเสียงสำหรับคำขอเปลี่ยนระดับเสียงจากเฟรมเวิร์กระบบเสียงของรถยนต์ นอกจากนี้ ระบบจะสื่อสารการอัปเดตดัชนีกับแอปเป็นCarVolumeGroupEvent
การเรียกกลับเพื่อซิงค์ดัชนี
ตัวอย่าง
Use Case: ผู้ใช้อัปเดตดัชนีระดับเสียงเป็น 30
ผู้ใช้ใช้แอป Volume เพื่อเปลี่ยนดัชนีระดับเสียงเป็น 30
ระบบจะแปลงดัชนีนี้เป็นการเพิ่มระดับเสียงและส่งไปยัง Audio HAL
การใช้งาน
Audio HAL
ของผู้ให้บริการจะได้รับการเพิ่มระดับเสียงใหม่และอัปเดตระบบเสียง (เช่น แอมป์ภายนอก)ระบบเสียงตอบกลับว่าระดับเสียงอัปเดตเป็นดัชนี 15 เท่านั้น (Android ไม่ทราบสาเหตุ)
การใช้งานทริกเกอร์
AudioControl HAL
ของผู้ให้บริการIAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
บริการเสียงของรถยนต์จะใช้ดัชนีใหม่จากการเรียกกลับที่ใช้เพื่อการเก็บรักษาและการเรียกกลับไปยังแอประดับเสียง ดัชนีที่ผู้ใช้ขอคือ 30 อย่างไรก็ตาม ความคิดเห็นแบบไม่พร้อมกันของระบบเสียงจะอัปเดตดัชนีเป็น 15
Use Case: การเล่นเสียงครั้งแรกหลังจากออกจากโหมดหยุดชั่วคราว
ดัชนีระดับเสียงก่อนการระงับตั้งค่าไว้ที่ระดับสูง 95 (ช่วง: [0-99])
Android เข้าสู่โหมดระงับ
เมื่อ Android หยุดทำงานชั่วคราว (เช่น กลับมาทำงานต่อ)
ผู้ให้บริการ
Audio HAL/AudioControl HAL
ใช้ดัชนีที่ปลอดภัย 30 กับระบบเสียงในพื้นที่ผู้ให้บริการ
AudioControl HAL
ยังเรียกใช้การเรียกกลับสําหรับดัชนีที่ปลอดภัยด้วย
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
บริการเสียงของรถยนต์จะใช้ดัชนีใหม่จากการเรียกกลับที่ใช้เพื่อการเก็บรักษาและการเรียกกลับของตัวเองไปยังแอประดับเสียงที่ซิงค์ดัชนี ดัชนีปริมาณก่อนการระงับคือ 95 อย่างไรก็ตาม หลังจากเล่นต่อ ผู้ติดตั้งใช้งาน
AudioControl HAL
จะตั้งค่าดัชนีนี้เป็นระดับเสียงที่ปลอดภัยที่ 30
การกําหนดค่าระดับเสียงแบบไดนามิก
ฟีเจอร์นี้พิจารณากรณีการใช้งานหลักดังต่อไปนี้
การกำหนดค่ารุ่นสุดท้าย (EOL) ของยานพาหนะ
ผู้ผลิตรถยนต์ต้องการอัปเดตการกำหนดค่าระดับเสียงเมื่อสิ้นสุดการรองรับตามการตั้งค่าระบบเสียงของยานพาหนะ โดยปกติแล้ว กรณีนี้เป็นการโหลดจากภายนอกโดยไม่อัปเดตภาพ SW ของ Android
ผู้ผลิตรถยนต์อาจต้องอัปเดตการกำหนดค่าระดับเสียงในระหว่างกำหนดการบริการ
การกําหนดค่ารันไทม์ ระบบเสียงยานยนต์รองรับการกำหนดค่าแอมพลิฟายเออร์ภายนอก และ ECU เหล่านี้อาจโฮสต์การกำหนดค่าช่วงระดับเสียงที่ระบบจะค้นหาระหว่างการบูต
การกำหนดค่าแบบออนดีมานด์ ให้บริการเพื่อรองรับความต้องการที่เพิ่มขึ้นสำหรับฟีเจอร์เสียงตามดีมานด์ ซึ่งผู้ใช้จะสมัครใช้บริการการประมวลผลสัญญาณที่มีประสิทธิภาพมากขึ้นเป็นระยะเวลาหนึ่ง การกําหนดค่าช่วงปริมาณใหม่จะใช้ได้ตลอดระยะเวลาการสมัครใช้บริการ
การออกแบบ
การกำหนดค่าระดับเสียงแบบไดนามิกทำได้ 3 ระยะดังนี้
Discovery การใช้งาน HAL ของ AudioControl ของผู้ให้บริการจะค้นหาการอัปเดตช่วงระดับเสียงใหม่ผ่านกลไก IPC ที่กําหนดเองซึ่งผู้ให้บริการเป็นเจ้าของ
เมื่อพบแล้ว ระบบจะสร้างการติดต่อกลับผ่าน
AudioControl::IModuleChangeCallback
อัปเดต สแต็กเสียงรถยนต์จะอัปเดตสถานะกลุ่มระดับเสียงด้วยช่วงระดับเสียงใหม่
ระบบพยายามรักษาระดับเสียงให้เหมือนเดิมหลังการอัปเดตช่วงระดับเสียง อย่างไรก็ตาม หากดัชนีอยู่นอกขอบเขต ระบบจะตั้งค่าดัชนีปริมาณปัจจุบันเป็นค่าที่ปลอดภัย เช่น ระดับเริ่มต้นที่ผู้ให้บริการระบุระหว่างการติดต่อกลับ
การติดต่อกลับ
หลังจากอัปเดตช่วงของกลุ่มระดับเสียงแล้ว สแต็กเสียงรถยนต์จะเรียกใช้การติดต่อกลับไปยังแอปที่ลงทะเบียนผ่าน
CarVolumeGroupEventCallback
CarVolumeGroupEvent
มีCarVolumeGroupInfo
ที่อัปเดตแล้ว ประเภทเหตุการณ์ (สิ่งที่เปลี่ยนแปลง) และข้อมูลเพิ่มเติม (สาเหตุที่เปลี่ยนแปลง)
รูปที่ 1 การกําหนดค่าระดับเสียงแบบไดนามิก
HAL API
AudioControl @ 3.0 AIDL
AudioControl AIDL HAL เวอร์ชัน 3.0 เปิดตัว API ต่อไปนี้
API | |
---|---|
IAudioControl#setModuleChangeCallback | ตั้งค่าอินสแตนซ์ของ IModuleChangeCallback ด้วย HAL ของ AudioControl |
IAudioControl#clearModuleChangeCallback | ล้างอินสแตนซ์ของ IModuleChangeCallback ที่ตั้งไว้ก่อนหน้านี้ด้วย HAL ของ AudioControl |
IModuleChangeCallback#onAudioPortsChanged | การเรียกกลับเพื่อแจ้งการเปลี่ยนแปลงใน AudioPorts |
ลำดับ
แผนภาพลำดับขั้นของการกำหนดค่าปริมาณแบบไดนามิกแสดงอยู่ด้านล่าง
รูปที่ 2 ลำดับแผนภาพสำหรับการกำหนดค่าระดับเสียงแบบไดนามิก
แง่มุมสำคัญ
โปรดพิจารณาสิ่งต่อไปนี้เพื่อเพิ่มประสิทธิภาพฟีเจอร์นี้
AudioPorts ที่ระบุเป็นส่วนหนึ่งของการเรียกกลับต้องตรงกับคำจำกัดความของ Automotive ดังนี้
- พอร์ตของอุปกรณ์
IN_DEVICE
,OUT_DEVICE
- การเชื่อมต่อ
BUS
- ที่อยู่ กำหนดไว้ในคำจำกัดความของ HAL เสียง
- โหมดเพิ่ม
JOINT
- พอร์ตของอุปกรณ์
ผู้ให้บริการต้องกำหนดชุดค่าผสมของคำจำกัดความช่วงระดับเสียงในนโยบาย Audio HAL และใช้การเรียกกลับเพื่อปรับแต่งสำหรับตัวแปรของยานพาหนะ ดูข้อมูลเพิ่มเติมที่
IModuleChangeCallbac
คำจำกัดความ AIDLเมื่อ BUS เสียงมากกว่า 1 รายการอยู่ในกลุ่มระดับเสียงเดียวกัน แต่ละ BUS ต้องมีการกำหนดช่วงระดับเสียงเหมือนกัน ไม่เช่นนั้นเฟรมเวิร์กเสียงของรถยนต์จะปฏิเสธคำจำกัดความช่วงระดับเสียงใหม่