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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

เครื่องมือจัดการนโยบายเสียงมีรายการ API ของระบบดังต่อไปนี้(ตามที่ระบุไว้ใน AudioManager.java)

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

    นําโปรแกรมฟังการเปลี่ยนแปลงของอุปกรณ์เสียงที่กลยุทธ์ต้องการซึ่งเพิ่มไว้ก่อนหน้านี้ออก

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

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

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

ใน HIDL HAL เวอร์ชัน 7 สำหรับเสียง ระบบจะรายงานความสามารถของอุปกรณ์โดยใช้โครงสร้าง 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 รุ่นเดิม

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 Services Test Suite) ของเครื่องมือจัดการเสียง

การทดสอบ CTS

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

รายการการทดสอบโปรแกรมจัดการเสียงที่ใช้ได้มีดังนี้

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy และ AudioManagerTest#testPreferredDeviceForCapturePreset

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

การทดสอบ GTS

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

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