ในเสียงของ Android ระบบจะใช้ audio_devices_t
เพื่อแสดงประเภทอุปกรณ์เสียง ซึ่งใช้ในซอร์สโค้ดเสียงอย่างแพร่หลายเป็นช่องบิตเพื่อกรองหรือเลือกอุปกรณ์ที่ระบุอย่างน้อย 1 เครื่อง ก่อนที่จะมี Android 11 อุปกรณ์อินพุต/เอาต์พุตเสียงมีได้สูงสุด 30 ประเภท และไม่มีช่องว่างเหลือสำหรับเพิ่มประเภทอุปกรณ์เสียงใหม่ เราได้ยกเลิกขีดจํากัดจํานวนประเภทอุปกรณ์เสียงเพื่ออนุญาตให้เพิ่มประเภทอุปกรณ์เสียงใหม่
ตอนนี้ประเภทอุปกรณ์เสียงเป็นค่าที่ระบุแทนหน้ากากบิตแล้ว เพื่อยกเลิกการจํากัดจํานวนประเภทอุปกรณ์เสียง
ประเภทอุปกรณ์เสียงที่มีอยู่ทั้งหมดจะยังคงเหมือนเดิม AUDIO_DEVICE_BIT_IN
จะยังคงใช้เพื่อแยกแยะอุปกรณ์อินพุตหรือเอาต์พุต เมื่อเพิ่มประเภทอุปกรณ์เสียงใหม่ ระบบจะจัดเรียงค่าเหล่านี้เป็นค่าที่ระบุระหว่างค่าที่มีอยู่
OEM ไม่ควรใช้ audio_devices_t
เป็นบิตมาสก์ เนื่องจากอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดเมื่อเพิ่มประเภทอุปกรณ์เสียงแบบแจกแจงรายการใหม่
ตัวอย่างและแหล่งที่มา
ก่อน Android 11 การใช้งานประเภทอุปกรณ์เสียงแบบบิตมาสก์มีอยู่ 2 ประเภท
- การใช้ค่า
audio_devices_t
เพื่อแสดงอุปกรณ์เสียงหลายเครื่อง - ตรวจสอบว่าค่า
audio_devices_t
มีประเภทอุปกรณ์เสียงจากหมวดหมู่ที่ระบุหรือไม่
หากต้องการแสดงอุปกรณ์เสียงหลายประเภท ระบบจะใช้คลาสชื่อ DeviceTypeSet
ใน
/libaudiofoundation/include/media/AudioContainers.h
ซึ่งก็คือคอนเทนเนอร์ std::set
ของ audio_devices_t
มีการประกาศคลาสในไลบรารี
libaudiofoundation
ที่พร้อมใช้งานสำหรับผู้ให้บริการ หากต้องการแสดงประเภทอุปกรณ์เสียงหลายประเภทในโค้ด C คุณสามารถใช้อาร์เรย์หรือรายการ audio_devices_t
หากต้องการตรวจสอบว่าอุปกรณ์ประเภทเดียวอยู่ในหมวดหมู่ที่ระบุหรือไม่ ให้ใช้ฟังก์ชันตัวช่วย
audio_is_.*_device
ใน
/system/media/audio/include/system/audio.h
สำหรับกรณีที่อุปกรณ์เสียงมีหลายประเภท ให้ใช้ฟังก์ชันตัวช่วยใน libaudiofoundation
ตัวอย่างเช่น ใช้ areAllOfSameDeviceType (DeviceTypeSet, std::function
ใน
AudioContainers.h
เพื่อตรวจสอบว่าอุปกรณ์เสียงทุกประเภทที่ระบุเป็นประเภทเดียวกันหรือไม่
การใช้งาน
OEM จะต้องนำการแสดงฟิลด์บิตประเภทอุปกรณ์เสียงออกจากการใช้งาน HAL เสียง
- นำพื้นที่เก็บข้อมูลทั้งหมดของอุปกรณ์ในช่องบิตออก
ไม่ควรใช้
audio_devices_t
เพื่อแสดงอุปกรณ์เสียงหลายประเภท แต่ให้ใช้ลิสต์หรือเวกเตอร์แทน - หยุดใช้การดำเนินการแบบบิตสำหรับการเปรียบเทียบประเภทอุปกรณ์
ก่อน Android 11 ประเภทอุปกรณ์เสียงจะใช้เป็นบิตฟิลด์ได้ ในกรณีนี้ การใช้การดำเนินการแบบบิตสําหรับการเปรียบเทียบประเภทอุปกรณ์เป็นแนวทางปฏิบัติทั่วไป เมื่อเพิ่มประเภทอุปกรณ์เสียงแบบแจกแจงรายการใหม่ การดำเนินการกับบิตอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด แต่ให้ใช้ฟังก์ชันตัวช่วยแทน หากมีอุปกรณ์เสียงเพียงประเภทเดียว ให้ใช้การเปรียบเทียบโดยตรงเพื่อเปรียบเทียบค่า 2 ค่า หากต้องการตรวจสอบว่าประเภทอุปกรณ์เสียงอยู่ในหมวดหมู่ที่ระบุหรือไม่ ให้ใช้ฟังก์ชันตัวช่วยใน
/system/media/audio/include/system/audio.h
เช่นaudio_is_output_device(audio_devices_t device)
- หยุดใช้ค่าที่กำหนดไว้ล่วงหน้าสำหรับกลุ่มประเภทอุปกรณ์เสียง
มีค่าที่กำหนดไว้ล่วงหน้าสำหรับกลุ่มประเภทอุปกรณ์เสียง นั่นคือ
AUDIO_DEVICE_OUT_ALL
ในsystem/media/audio/include/system/audio-base-utils.h
ค่าเหล่านี้ทั้งหมดสงวนไว้แล้ว แต่อาจเลิกใช้งานเนื่องจากจะไม่ถูกต้องเมื่อมีการเพิ่มประเภทอุปกรณ์เสียงแบบแจกแจงรายการใหม่ มีกลุ่มประเภทอุปกรณ์เสียงใหม่ที่กำหนดไว้ในaudio-base-utils.h
ซึ่งเป็นอาร์เรย์ของประเภทอุปกรณ์เสียง เช่นAUDIO_DEVICE_OUT_ALL_ARRAY
- ใช้เมธอด
create_audio_patch()
และrelease_audio_patch()
สำหรับการกำหนดเส้นทางแทนset_parameters
เมธอด
set_parameters
ใช้ประเภทอุปกรณ์เสียงเป็นบิตฟิลด์ จึงอาจให้ผลลัพธ์ที่ไม่คาดคิดหากมีการเพิ่มประเภทอุปกรณ์เสียงแบบแจกแจงใหม่ปัจจุบันต้องใช้แพตช์เสียง 2 ประเภท ได้แก่
- มิกซ์กับแพตช์อุปกรณ์สำหรับการเล่น
- อุปกรณ์สำหรับผสมแพตช์สำหรับการบันทึก
ในการอัปเดตครั้งต่อๆ ไป คุณอาจต้องใช้แพตช์เพิ่มเติมสำหรับการแชร์ระหว่างอุปกรณ์
เมื่อสร้างแพตช์เสียง หากไม่ได้ระบุแฮนเดิลแพตช์ HAL เสียงจะต้องสร้างแฮนเดิลแพตช์ที่ไม่ซ้ำกันซึ่งระบุแพตช์เสียงได้ มิเช่นนั้น HAL เสียงควรใช้แฮนเดิลการแก้ไขเสียงที่ระบุเพื่ออัปเดตการแก้ไขเสียง
หากใช้ HAL เสียงเดิมและ Wrapper HIDL ของ AOSP HAL เสียงเดิมควรตั้งค่าเวอร์ชันหลักของ HAL เป็น 3.0
หากต้องการเปิดใช้ฟีเจอร์การแก้ไขเสียง HAL ของเสียงควรตั้งค่าเวอร์ชันหลักของ HAL เป็น 3.0 ขึ้นไป ดูข้อมูลเพิ่มเติมได้ใน
Device::supportsAudioPatches()
ใน การใช้งาน HIDL เริ่มต้น ซึ่งดูได้ใน HAL เสียงสำหรับ Cuttlefish
การปรับแต่ง
คุณไม่สามารถปิดฟีเจอร์นี้หรือเปลี่ยนการจัดโครงสร้างอุปกรณ์เสียงในเฟรมเวิร์กที่ทำให้เพิ่มประเภทอุปกรณ์เสียงได้
อุปกรณ์เสียงทุกประเภทที่เพิ่มเข้ามาอนุญาตให้แสดงอุปกรณ์ประเภทหนึ่งๆ ด้วยชุดบิตเดียว ดังนั้นการใช้งาน HAL ปัจจุบันจะยังคงใช้งานได้
หากมีการเพิ่มประเภทอุปกรณ์เสียงใหม่และ OEM ต้องการใช้อุปกรณ์ดังกล่าว OEM จะต้องอัปเกรดการใช้งาน HAL เสียงและเปลี่ยนไปใช้ HIDL เวอร์ชัน 6.0 ขึ้นไป คุณต้องอัปเกรด HAL เวอร์ชันหลักเป็น 3.0 และใช้เมธอด create_audio_patch
และ release_audio_patch
เนื่องจากการใช้ set_parameters
เพื่อกำหนดเส้นทางสตรีมอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดเมื่อเพิ่มประเภทอุปกรณ์เสียงใหม่
การตรวจสอบความถูกต้อง
สิ่งที่ OEM ต้องทําคือการอัปเดตการใช้งาน HAL คุณสามารถใช้ VTS สำหรับ HAL เสียงเพื่อตรวจสอบว่าการติดตั้งใช้งานทำงานได้ตามที่ต้องการหรือไม่ คุณจะดูการทดสอบทั้งหมดได้ในไฟล์ VTS