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

ในระบบเสียงของ 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 เสียง

  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