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

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

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

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

OEM ไม่ควรใช้ 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 จำเป็นต้องลบการแสดงฟิลด์บิตประเภทอุปกรณ์เสียงออกจากการใช้งาน 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 ใช้ประเภทอุปกรณ์เสียงเป็นบิตฟิลด์ ดังนั้นจึงอาจได้รับผลลัพธ์ที่ไม่คาดคิดหากมีการเพิ่มประเภทอุปกรณ์เสียงที่แจกแจงใหม่

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

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

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

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

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

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

การปรับแต่ง

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

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

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

การตรวจสอบ

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