ฟีเจอร์การกำหนดเส้นทางอุปกรณ์เสียงแบบรวมจะเพิ่มการรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกัน เมื่อใช้ฟีเจอร์นี้ แอปที่มีสิทธิ์จะเลือกอุปกรณ์ที่ต้องการหลายเครื่องสำหรับ กลยุทธ์หนึ่งๆ ผ่าน 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 ใช้ชุดกฎต่อไปนี้เพื่อเลือกอุปกรณ์สื่อที่ใช้งานอยู่
- หากอุปกรณ์ที่ต้องการทั้งหมดสำหรับสื่อพร้อมใช้งาน ระบบจะเลือกอุปกรณ์เหล่านั้นทั้งหมดเป็นอุปกรณ์ที่ใช้งานอยู่
- ไม่เช่นนั้น ระบบจะเลือกอุปกรณ์ที่ถอดออกได้ที่เชื่อมต่อล่าสุด
- หากไม่มีอุปกรณ์ที่ถอดออกได้เชื่อมต่ออยู่ ระบบจะใช้กฎนโยบายเสียงเริ่มต้นสำหรับการเลือกอุปกรณ์เอาต์พุตเพื่อเลือกอุปกรณ์ที่ใช้งานอยู่
สตรีมเอาต์พุตต้องเป็นไปตามเกณฑ์ต่อไปนี้เพื่อให้ระบบเปิดขึ้นอีกครั้งและกำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่ เพื่อให้เลือกการกำหนดค่าที่ดีที่สุดสำหรับการเล่น
- สตรีมเอาต์พุตต้องรองรับอุปกรณ์ที่ใช้งานอยู่
- สตรีมเอาต์พุตต้องรองรับโปรไฟล์แบบไดนามิก
- สตรีมเอาต์พุตต้องไม่ได้กำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่ในปัจจุบัน
หากต้องการใช้การเลือกอุปกรณ์ใหม่ Audio Policy Manager จะปิดและเปิดสตรีมเอาต์พุตอีกครั้งเมื่อเชื่อมต่ออุปกรณ์หากสตรีมเอาต์พุตไม่มีการใช้งาน หรือเลื่อนการดำเนินการออกไปจนกว่าสตรีมเอาต์พุตจะเข้าสู่โหมดสแตนด์บาย
Audio Policy Manager มี API ของระบบรายการต่อไปนี้(ตามที่กำหนดไว้ใน
AudioManager.java)
setPreferredDeviceForStrategyตั้งค่าอุปกรณ์หลักสำหรับการกำหนดเส้นทางเสียงสำหรับกลยุทธ์หนึ่งๆ โปรดทราบว่าอุปกรณ์อาจไม่พร้อมใช้งานในขณะที่ตั้งค่าอุปกรณ์ที่ต้องการ แต่จะใช้เมื่อพร้อมใช้งาน
removePreferredDeviceForStrategyนำอุปกรณ์เสียงที่ต้องการซึ่งตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategyหรือsetPreferredDevicesForStrategyออกgetPreferredDeviceForStrategyแสดงผลอุปกรณ์หลักสำหรับกลยุทธ์เสียงซึ่งตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategyหรือsetPreferredDevicesForStrategysetPreferredDevicesForStrategyตั้งค่าอุปกรณ์ที่ต้องการสำหรับกลยุทธ์หนึ่งๆ
getPreferredDevicesForStrategyแสดงผลอุปกรณ์ที่ต้องการสำหรับกลยุทธ์เสียงซึ่งตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategyหรือsetPreferredDevicesForStrategyOnPreferredDevicesForStrategyChangedListenerกำหนดอินเทอร์เฟซสำหรับการแจ้งเตือนการเปลี่ยนแปลงอุปกรณ์เสียงที่ต้องการซึ่งตั้งค่าไว้สำหรับกลยุทธ์เสียงหนึ่งๆ
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