ขีดจำกัดประเภทอุปกรณ์

เสียง Android ของ audio_devices_t ถูกนำมาใช้เพื่อเป็นตัวแทนของประเภทเครื่องเสียง มีการใช้กันอย่างแพร่หลายในซอร์สโค้ดเสียงเป็นฟิลด์บิตเพื่อกรองหรือเลือกอุปกรณ์ที่ระบุอย่างน้อยหนึ่งเครื่อง ก่อน Android 11 มีการจำกัดประเภทอุปกรณ์อินพุต/เอาต์พุตเสียง 30 ประเภท และไม่มีช่องสำรองสำหรับเพิ่มประเภทอุปกรณ์เสียงใหม่ เราได้ยกเลิกการจำกัดจำนวนประเภทอุปกรณ์เสียงเพื่อให้สามารถเพิ่มประเภทอุปกรณ์เสียงใหม่ได้

หากต้องการยกเลิกการจำกัดจำนวนประเภทอุปกรณ์เสียง ตอนนี้ประเภทของอุปกรณ์เสียงจะถูกระบุค่าแทนบิตมาสก์

ประเภทของอุปกรณ์เสียงที่มีอยู่ทั้งหมดจะถูกเก็บไว้ตามที่เป็นอยู่ AUDIO_DEVICE_BIT_IN ยังคงใช้ในการแยกแยะความแตกต่าง input หรือ output อุปกรณ์ เมื่อเพิ่มประเภทอุปกรณ์เสียงใหม่ จะมีการระบุค่าในช่องว่างระหว่างค่าที่มีอยู่

OEMs ไม่ควรใช้ audio_devices_t เป็นหน้ากากบิตเพราะที่สามารถก่อให้เกิดผลที่ไม่คาดคิดเมื่อนับใหม่ประเภทเครื่องเสียงที่มีการเพิ่ม

ตัวอย่างและที่มา

ก่อน Android 11 มีการใช้งานอุปกรณ์เสียงทั่วไปสองประเภทเป็นบิตมาสก์

  • ใช้ 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 ) areAllOfSameDeviceType (DeviceTypeSet, std::function ) ใน AudioContainers.h เพื่อตรวจสอบว่าได้รับทุกประเภทเครื่องเสียงเป็นชนิดเดียวกัน

การดำเนินการ

OEM จำเป็นต้องลบการแสดงข้อมูลบิตฟิลด์ประเภทอุปกรณ์เสียงออกจากการใช้งาน Audio HAL

  1. ลบที่เก็บข้อมูลของอุปกรณ์ทั้งหมดบนบิตฟิลด์

    audio_devices_t ไม่ควรที่จะใช้ในการแสดงหลายประเภทเครื่องเสียง ให้ใช้รายการหรือเวกเตอร์แทน

  2. หยุดใช้การดำเนินการบิตสำหรับการเปรียบเทียบประเภทอุปกรณ์

    ก่อน Android 11 ประเภทของอุปกรณ์เสียงสามารถใช้เป็นบิตฟิลด์ได้ ในกรณีนั้น เป็นเรื่องปกติที่จะใช้การดำเนินการบิตสำหรับการเปรียบเทียบประเภทอุปกรณ์ เมื่อมีการเพิ่มประเภทอุปกรณ์เสียงที่แจกแจงใหม่ การทำงานของบิตอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด ให้ใช้ฟังก์ชันตัวช่วยแทนแทน หากมีอุปกรณ์เสียงประเภทเดียว ให้ใช้การเปรียบเทียบโดยตรงเพื่อเปรียบเทียบค่าทั้งสอง เพื่อตรวจสอบว่าประเภทเครื่องเสียงเป็นของหมวดหมู่ที่กำหนดฟังก์ชั่นการใช้งานผู้ช่วยใน /system/media/audio/include/system/audio.h ยกตัวอย่างเช่น audio_is_output_device(audio_devices_t device)

  3. หยุดใช้ค่าที่กำหนดไว้ล่วงหน้าสำหรับกลุ่มประเภทอุปกรณ์เสียง

    มีบางค่าที่กำหนดไว้ล่วงหน้าสำหรับกลุ่มของประเภทเครื่องเสียงเป็น AUDIO_DEVICE_OUT_ALL ใน system/media/audio/include/system/audio-base-utils.h ค่าทั้งหมดเหล่านี้สงวนไว้แต่อาจเลิกใช้แล้ว เนื่องจากจะไม่ถูกต้องเมื่อมีการเพิ่มประเภทอุปกรณ์เสียงที่แจกแจงใหม่ มีกลุ่มใหม่ประเภทอุปกรณ์เสียงที่กำหนดไว้ในเป็น audio-base-utils.h ซึ่งเป็นอาร์เรย์ของอุปกรณ์ประเภทเสียงเช่น AUDIO_DEVICE_OUT_ALL_ARRAY

  4. ใช้ create_audio_patch() และ release_audio_patch() วิธีการสำหรับการกำหนดเส้นทางแทน set_parameters

    set_parameters วิธีการใช้อุปกรณ์ประเภทเสียง bitfield เพื่อให้สามารถมีผลที่ไม่คาดคิดถ้านับใหม่ประเภทเครื่องเสียงที่มีการเพิ่ม

    ปัจจุบันจำเป็นต้องมีแพตช์เสียงสองประเภท:

    • มิกซ์กับแพตช์อุปกรณ์สำหรับการเล่น
    • อุปกรณ์สำหรับผสมแพตช์ สำหรับบันทึก

    ในการอัปเดตครั้งต่อๆ ไป อาจจำเป็นต้องมีแพตช์เพิ่มเติมสำหรับอุปกรณ์ต่ออุปกรณ์

    เมื่อสร้างโปรแกรมแก้ไขเสียง หากไม่มีการระบุหมายเลขอ้างอิงโปรแกรมแก้ไข เสียง HAL จะต้องสร้างหมายเลขอ้างอิงโปรแกรมแก้ไขเฉพาะที่สามารถระบุโปรแกรมแก้ไขเสียงได้ มิฉะนั้น HAL เสียงควรใช้ตัวจัดการโปรแกรมแก้ไขเสียงที่ระบุเพื่ออัปเดตโปรแกรมแก้ไขเสียง

    หากใช้ HAL ของเสียงดั้งเดิมและ wrapper AOSP HIDL เสียง HAL ดั้งเดิมควรตั้งค่า HAL เวอร์ชันหลักเป็น 3.0

    ในการเปิดใช้งานคุณลักษณะแพตช์เสียง HAL เสียงควรตั้งค่า HAL เวอร์ชันหลักเป็น 3.0 หรือสูงกว่า อ้างถึง Device::supportsAudioPatches() ใน การดำเนินการ HIDL เริ่มต้น สำหรับข้อมูลเพิ่มเติมซึ่งยังสามารถพบได้บนระบบ HAL เสียงสำหรับปลาหมึก

การปรับแต่ง

เป็นไปไม่ได้ที่จะปิดคุณสมบัตินี้ หรือคืนค่าการปรับโครงสร้างอุปกรณ์เสียงในเฟรมเวิร์กที่ทำให้สามารถเพิ่มประเภทอุปกรณ์เสียงได้

ประเภทของอุปกรณ์เสียงทั้งหมดที่เพิ่มเข้ามาช่วยให้สามารถแสดงประเภทอุปกรณ์ที่มีชุดบิตเดียว ดังนั้นการใช้งาน HAL ในปัจจุบันจึงยังคงใช้งานได้

หากมีการเพิ่มประเภทอุปกรณ์เสียงใหม่และ OEM ต้องการใช้ พวกเขาจะต้องอัปเกรดการใช้งาน Audio HAL และเปลี่ยนไปใช้ HIDL เวอร์ชัน 6.0 หรือสูงกว่า มันบังคับให้อัพเกรดรุ่น HAL ใหญ่ถึง 3.0 และใช้ create_audio_patch และ release_audio_patch วิธีเพราะใช้ set_parameters เส้นทางกระแสสามารถก่อให้เกิดผลที่ไม่คาดคิดเมื่อใหม่ประเภทเครื่องเสียงที่มีการเพิ่ม

การตรวจสอบความถูกต้อง

งานที่จำเป็นสำหรับ OEM คือการอัปเดตการใช้งาน HAL สามารถใช้ VTS สำหรับเสียง HAL เพื่อตรวจสอบว่าการใช้งานเป็นไปตามที่ตั้งใจไว้หรือไม่ การทดสอบทั้งหมดที่สามารถพบได้ใน ไฟล์ VTS