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

ใน Android Audio จะมีการใช้ 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 ของเสียง

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

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

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

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

    ปัจจุบันแพตช์เสียงมี 2 ประเภท ได้แก่

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

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

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

    หากใช้ HAL เสียงเดิมและ AOSP HIDL Wrapper ควรตั้งค่า 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