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

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

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

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

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

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

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

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

ส่วนต่อไปนี้จะอธิบาย API แต่ละรายการเหล่านี้โดยละเอียด

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

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

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

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

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

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

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

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

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

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

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

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

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

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

ใน Audio 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;
};

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

เมธอด Audio HAL

Audio Policy Manager ใช้เมธอดต่อไปนี้เพื่อค้นหาความสามารถของอุปกรณ์

  • 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 API เดิมเวอร์ชัน 3.2 จึงเพิ่ม 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 เหล่านี้

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

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

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

การตรวจสอบ

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

การทดสอบ CTS

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

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

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy และ AudioManagerTest#testPreferredDeviceForCapturePreset

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

การทดสอบ GTS

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

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