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

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

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

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

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