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

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