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

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

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

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

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

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

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

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

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

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

Audio Policy Manager มี 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

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

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

ในการใช้งาน 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 เดิม

เพื่อรองรับโปรไฟล์เสียงหลายโปรไฟล์ 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 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 และ วันที่ AudioManagerTest#testPreferredDeviceForCapturePreset

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

การทดสอบ GTS

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

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