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

ฟีเจอร์การกำหนดเส้นทางอุปกรณ์เสียงแบบรวมช่วยเพิ่มการรองรับการสตรีมเสียงไปยัง อุปกรณ์เสียงหลายเครื่องพร้อมกัน การใช้ฟีเจอร์นี้จะช่วยให้แอปที่มีสิทธิ์สามารถ เลือกอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ ผ่าน 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 แต่ละรายการโดยละเอียด

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

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

Audio Policy Manager นำเสนอแนวคิดของอุปกรณ์สื่อที่ใช้งานอยู่เพื่อ อธิบายอุปกรณ์ที่มีแนวโน้มมากที่สุดที่จะได้รับการเลือกสำหรับการเล่นสื่อ เมื่อเชื่อมต่ออุปกรณ์ที่ถอดออกได้ สตรีมเอาต์พุต 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 ที่รองรับ การรายงานความสามารถของอุปกรณ์ ซึ่งเป็นส่วนหนึ่งของการติดตั้งใช้งาน HAL เสียง ส่วนนี้จะอธิบายประเภทข้อมูลและวิธีการ ที่ใช้ในการรายงานความสามารถของอุปกรณ์ รวมถึงแสดงการเปลี่ยนแปลงบางอย่างที่ทำใน 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 เพื่ออธิบายความสามารถของอุปกรณ์

วิธีการของ 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 เหล่านี้ได้ที่วิธีการต่อไปนี้

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

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

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

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

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

การทดสอบ 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