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

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

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

ตั้งแต่ Android 14 เป็นต้นไป เฟรมเวิร์ก USB รองรับการกำหนดเส้นทางไปยังอุปกรณ์ USB หลายเครื่อง โดยอุปกรณ์ USB นั้นเป็นอุปกรณ์เสียงประเภทต่างๆ และมีเคอร์เนลและผู้จำหน่ายรองรับในการเชื่อมต่ออุปกรณ์ USB หลายเครื่องพร้อมกัน

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

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

มี API สองชุดใน Android 12 ที่รองรับฟีเจอร์นี้:

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

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

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

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

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

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

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

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

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

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

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

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

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

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

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

ประเภทข้อมูล

ในเสียง HIDL HAL V7 ความสามารถของอุปกรณ์จะถูกรายงานโดยใช้โครงสร้าง AudioProfile และ AudioTransport โครงสร้าง AudioTransport อธิบายความสามารถของพอร์ตเสียงที่มี AudioProfile สำหรับรูปแบบเสียงที่รู้จัก หรือด้วยตัวอธิบายฮาร์ดแวร์ดิบสำหรับรูปแบบที่แพลตฟอร์มไม่รู้จัก โครงสร้าง AudioProfile ประกอบด้วยรูปแบบเสียง อัตราตัวอย่างที่โปรไฟล์รองรับ และรายการ Channel Masks ดังที่แสดงในบล็อกโค้ดต่อไปนี้จาก 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 เดิม

เพื่อรองรับโปรไฟล์เสียงหลายโปรไฟล์ API เวอร์ชัน 3.2 จะเพิ่มโครงสร้างใหม่ที่เรียกว่า 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 system API อยู่ในเมธอด PreferredDeviceRoutingTest ซึ่งอยู่ใน GTS

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

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

การตรวจสอบ

ส่วนนี้ให้ข้อมูลเกี่ยวกับการตรวจสอบความถูกต้อง ของ CTS และ GTS (ชุดทดสอบบริการมือถือของ Google) ของตัวจัดการเสียง

การทดสอบซีทีเอส

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

ต่อไปนี้เป็นรายการการทดสอบ Audio Manager ที่ใช้งานได้:

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy และ AudioManagerTest#testPreferredDeviceForCapturePreset

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

การทดสอบจีทีเอส

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

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