การกำหนดเส้นทางอุปกรณ์เสียงแบบรวม

คุณลักษณะการกำหนดเส้นทางอุปกรณ์เสียงแบบรวมเพิ่มการสนับสนุนสำหรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกัน เมื่อใช้คุณสมบัตินี้ แอปที่มีสิทธิพิเศษสามารถเลือกอุปกรณ์ที่ต้องการได้หลายเครื่องสำหรับ กลยุทธ์ เฉพาะโดยใช้ API ของระบบ แอปสามารถค้นพบความสามารถของอุปกรณ์เสียงได้แม่นยำยิ่งขึ้นโดยใช้ API สาธารณะที่มีให้ในฟีเจอร์นี้ สำหรับ Android เวอร์ชัน 11 และต่ำกว่า การใช้งานเฟรมเวิร์กเสียงจะรองรับอุปกรณ์เสียงประเภทเดียวกันหลายเครื่อง (เช่น ชุดหูฟัง Bluetooth A2DP 2 ชุด) ที่เชื่อมต่อพร้อมกันอย่างจำกัด กฎการกำหนดเส้นทางเสียงเริ่มต้นยังไม่อนุญาตให้ผู้ใช้เลือกอุปกรณ์ประเภทเดียวกันหลายเครื่องสำหรับกรณีการใช้งานที่กำหนด

ตั้งแต่ Android 12 เป็นต้นไป ข้อจำกัดเหล่านี้จะถูกลบออกเพื่อให้สามารถใช้งานได้ใหม่ เช่น การกระจายเสียง มัลติคาสต์ไปยังกลุ่มของหูฟังเสียง BLE หรือใช้การ์ดเสียง USB หลายตัวพร้อมกัน

หน้านี้ครอบคลุมถึงวิธีการใช้การสนับสนุนสำหรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่อง และวิธีการตรวจสอบการใช้งานคุณลักษณะนี้ของคุณ

รองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายตัว

มี API สองชุดใน Android 12 ที่สนับสนุนคุณลักษณะนี้:

  • API ของระบบจัดการอุปกรณ์ที่ต้องการหลายตัวสำหรับกลยุทธ์
  • อินเทอร์เฟซ HIDL ซึ่งใช้งานโดยผู้จำหน่ายโดยเป็นส่วนหนึ่งของ Audio HAL จะรายงานความสามารถของอุปกรณ์

ส่วนต่อไปนี้จะกล่าวถึงแต่ละ API เหล่านี้โดยละเอียด

การจัดการอุปกรณ์ที่ต้องการหลายตัวสำหรับกลยุทธ์

ตัวจัดการนโยบายเสียงเสนอ API ของระบบเพื่อรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกันได้ดียิ่งขึ้น API ของระบบเหล่านี้เปิดใช้งานการตั้งค่า รับและลบอุปกรณ์ที่ต้องการ หลายตัว สำหรับกลยุทธ์ที่กำหนด คุณลักษณะนี้ได้รับการสนับสนุนสำหรับอุปกรณ์เครื่องเดียวเท่านั้นจนถึง Android 12

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

ต้องระบุอุปกรณ์เสียงเมื่อเปิดสตรีมเอาต์พุต อุปกรณ์สื่อที่ใช้งานอยู่คืออุปกรณ์ที่ใช้เมื่อมีการเปิดสตรีมเอาต์พุตในบริบทนี้

การเลือกอุปกรณ์สื่อที่ใช้งานอยู่สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับอุปกรณ์จริงที่เชื่อมต่อหรือตัดการเชื่อมต่อ ตัวจัดการนโยบายเสียงใช้ชุดกฎต่อไปนี้เพื่อเลือกอุปกรณ์สื่อที่ใช้งานอยู่:

  1. หากมีอุปกรณ์ที่ต้องการสำหรับสื่อทั้งหมด อุปกรณ์ทั้งหมดจะถูกเลือกเป็นอุปกรณ์ที่ใช้งานอยู่
  2. มิฉะนั้น จะเลือกอุปกรณ์ที่ถอดออกได้ที่เชื่อมต่อล่าสุด
  3. หากไม่มีอุปกรณ์ที่ถอดออกได้เชื่อมต่ออยู่ กฎนโยบายเสียงเริ่มต้นสำหรับการเลือกอุปกรณ์เอาต์พุตจะนำไปใช้กับการเลือกอุปกรณ์ที่ใช้งานอยู่

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

  • สตรีมเอาต์พุตต้องรองรับอุปกรณ์ที่ใช้งานอยู่
  • สตรีมเอาต์พุตต้องรองรับโปรไฟล์แบบไดนามิก
  • กระแสข้อมูลขาออกต้องไม่ถูกกำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่

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

Audio Policy Manager มีรายการ API ของระบบดังต่อไปนี้ (ตามที่กำหนดไว้ใน AudioManager.java ):

  • setPreferredDeviceForStrategy

    ตั้งค่าอุปกรณ์ที่ต้องการสำหรับการกำหนดเส้นทางเสียงสำหรับกลยุทธ์ที่กำหนด โปรดทราบว่าอุปกรณ์อาจไม่พร้อมใช้งานในขณะที่ตั้งค่าอุปกรณ์ที่ต้องการ แต่จะใช้งานเมื่อพร้อมใช้งาน

  • removePreferredDeviceForStrategy

    ลบอุปกรณ์เสียงที่ต้องการซึ่งตั้งค่าไว้ก่อนหน้านี้ด้วย setPreferredDeviceForStrategy หรือ setPreferredDevicesForStrategy

  • getPreferredDeviceForStrategy

    ส่งคืนอุปกรณ์ที่ต้องการสำหรับกลยุทธ์ด้านเสียงที่ตั้งค่าไว้ก่อนหน้านี้ด้วย setPreferredDeviceForStrategy หรือ setPreferredDevicesForStrategy

  • setPreferredDevicesForStrategy

    ตั้งค่าอุปกรณ์ที่ต้องการสำหรับกลยุทธ์ที่กำหนด

  • getPreferredDevicesForStrategy

    ส่งคืนอุปกรณ์ที่ต้องการสำหรับกลยุทธ์ด้านเสียงที่ตั้งค่าไว้ก่อนหน้านี้ด้วย setPreferredDeviceForStrategy หรือ setPreferredDevicesForStrategy

  • OnPreferredDevicesForStrategyChangedListener

    กำหนดอินเทอร์เฟซสำหรับการแจ้งเตือนการเปลี่ยนแปลงในอุปกรณ์เสียงที่ต้องการซึ่งกำหนดไว้สำหรับกลยุทธ์ด้านเสียงที่กำหนด

  • addOnPreferredDevicesForStrategyChangedListener

    เพิ่มผู้ฟังเพื่อรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงอุปกรณ์เสียงที่เน้นกลยุทธ์

  • removeOnPreferredDevicesForStrategyChangedListener

    ลบ Listener ที่เพิ่มไว้ก่อนหน้านี้ของการเปลี่ยนแปลงไปยังอุปกรณ์เสียงที่เน้นกลยุทธ์

การรายงานความสามารถของอุปกรณ์

ในส่วนของการนำ Audio HAL ไปใช้งาน ผู้ขายจะใช้ API ที่สนับสนุนความสามารถของอุปกรณ์การรายงาน ส่วนนี้อธิบายประเภทข้อมูลและวิธีการที่ใช้ในการรายงานความสามารถของอุปกรณ์และแสดงรายการการเปลี่ยนแปลงบางอย่างใน HIDL HAL V7 เสียงเพื่อรองรับอุปกรณ์หลายเครื่อง

ชนิดข้อมูล

ในไฟล์เสียง HIDL HAL V7 ความสามารถของอุปกรณ์จะถูกรายงานโดยใช้โครงสร้าง AudioProfile และ AudioTransport โครงสร้าง AudioTransport อธิบายความสามารถของพอร์ตเสียงที่มี AudioProfile สำหรับรูปแบบเสียงที่รู้จัก หรือด้วยตัวบอกฮาร์ดแวร์ดิบสำหรับรูปแบบที่แพลตฟอร์มไม่รู้จัก โครงสร้าง AudioProfile ประกอบด้วยรูปแบบเสียง อัตราตัวอย่างที่สนับสนุนโดยโปรไฟล์ และรายการมาสก์ช่องดังที่แสดงในบล็อกโค้ดต่อไปนี้จาก types.hal :

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

ในเสียง HIDL HAL V7 ชนิดข้อมูล AudioPort ถูกกำหนดด้วยโครงสร้าง AudioTransport และ AudioProfile เพื่ออธิบายความสามารถของอุปกรณ์

วิธีการเสียง HAL

ตัวจัดการนโยบายเสียงใช้วิธีการต่อไปนี้เพื่อสอบถามความสามารถของอุปกรณ์:

  • getParameters: วิธีการทั่วไปในการดึงค่าพารามิเตอร์เฉพาะผู้จำหน่าย เช่น รูปแบบเสียงที่รองรับและอัตราการสุ่มตัวอย่างตามลำดับ
  • getAudioPort: ส่งคืนรายการแอตทริบิวต์ที่รองรับ (เช่น อัตราการสุ่มตัวอย่าง รูปแบบ ช่องสัญญาณ ตัวควบคุมเกน) สำหรับพอร์ตเสียงที่กำหนด

รหัสต่อไปนี้จาก IDevice.hal แสดงอินเทอร์เฟซสำหรับวิธี getAudioPort :

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

การเปลี่ยนแปลง API เดิม

เพื่อรองรับโปรไฟล์เสียงหลายโปรไฟล์ เวอร์ชัน 3.2 ของ API เดิมจะเพิ่มโครงสร้างใหม่ที่เรียกว่า audio_port_v7 ดู ซอร์สโค้ด สำหรับรายละเอียดเพิ่มเติม

เนื่องจากการเพิ่ม audio_port_v7 เวอร์ชัน 3.2 ของ API ดั้งเดิมจึงเพิ่ม API ใหม่ที่เรียกว่า get_audio_port_v7 เพื่อสืบค้นความสามารถของอุปกรณ์โดยใช้โครงสร้าง audio_port_v7

รหัสต่อไปนี้จาก audio.h แสดงคำจำกัดความของ get_audio_port_v7 API:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

ข้อมูลจาก get_audio_port API เดิมจะต้องเติมลงในรูปแบบ AudioPort ใหม่ เมื่อเวอร์ชัน API ดั้งเดิมต่ำกว่า 3.2 และเวอร์ชัน HIDL HAL คือ 7 ขึ้นไป ในกรณีนี้ อัตราตัวอย่างและมาสก์ช่องสัญญาณที่รายงานทั้งหมดจาก get_audio_port จะถือว่าได้รับการสนับสนุนสำหรับรูปแบบที่ส่งคืนทั้งหมด ทำให้สามารถแมปตรงไปตรงมาจากค่า get_audio_port กับโครงสร้าง AudioPort ใหม่

ตัวอย่างการใช้งาน API

ส่วนนี้อธิบายชุดทดสอบหลายชุดที่มีเมธอดที่ใช้ API ที่กล่าวถึงในส่วนก่อนหน้านี้ อ้างถึงวิธีการเหล่านี้สำหรับตัวอย่างวิธีการปรับใช้และใช้งาน API เหล่านี้

ตัวอย่างการใช้งาน setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy และ OnPreferredDevicesForStrategyChangedListener API ของระบบ API อยู่ในเมธอด PreferredDeviceRoutingTest ซึ่งอยู่ใน GTS

หากต้องการดูตัวอย่างโครงสร้างใหม่ใน AudioDeviceInfo ที่ใช้งาน โปรดดูวิธี AudioManagerTest#testGetDevices ซึ่งอยู่ใน CTS

ตัวอย่างการใช้งาน get_audio_port_v7 อยู่ใน audio_hal.c และแสดงวิธีการสอบถามความสามารถสำหรับอุปกรณ์หลายเครื่อง

การตรวจสอบความถูกต้อง

ส่วนนี้ให้ข้อมูลเกี่ยวกับการตรวจสอบ CTS และ GTS (Google Mobile Services Test Suite) ของโปรแกรมจัดการเสียง

การทดสอบ CTS

การทดสอบ CTS อยู่ใน android.media.cts.AudioManagerTest

ต่อไปนี้คือรายการการทดสอบโปรแกรมจัดการเสียงที่มี:

  • AudioManagerTest#testGetDevices

    ตรวจสอบความสามารถที่แม่นยำของอุปกรณ์เสียง นอกจากนี้ยังตรวจสอบว่าโปรไฟล์เสียงที่ส่งคืนในโครงสร้าง AudioDeviceInfo รักษาเนื้อหาจากรูปแบบอาร์เรย์ที่เก่ากว่าและแบนราบ แต่อยู่ในรูปแบบ AudioProfile ใหม่

  • AudioManagerTest#testPreferredDevicesForStrategy and AudioManagerTest#testPreferredDeviceForCapturePreset

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

การทดสอบ GTS

การทดสอบ GTS อยู่ใน com.google.android.gts.audioservice.AudioServiceHostTest

หากต้องการตรวจสอบว่า API สำหรับอุปกรณ์ที่ต้องการสำหรับกลยุทธ์และการตั้งค่าล่วงหน้าการดักจับทำงานอย่างถูกต้องหรือไม่ ให้เรียกใช้การ AudioServiceHostTest#testPreferredDeviceRouting และ AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset