ฟีเจอร์การกำหนดเส้นทางอุปกรณ์เสียงแบบรวมจะเพิ่มการรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกัน เมื่อใช้ฟีเจอร์นี้ แอปที่มีสิทธิ์จะเลือกอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ ได้ผ่าน API ของระบบ แอปจะค้นพบความสามารถของอุปกรณ์เสียงได้อย่างแม่นยำยิ่งขึ้นโดยใช้ API สาธารณะที่ฟีเจอร์นี้ให้ไว้ สำหรับ Android เวอร์ชัน 11 และต่ำกว่า การใช้งานเฟรมเวิร์กเสียงจะรองรับอุปกรณ์เสียงหลายประเภทเดียวกัน (เช่น ชุดหูฟังบลูทูธ A2DP 2 ชุด) ที่เชื่อมต่อพร้อมกันได้แบบจำกัด การกำหนดเส้นทางเสียงเริ่มต้น และไม่ได้อนุญาตให้ผู้ใช้เลือกอุปกรณ์ประเภทเดียวกันได้หลายเครื่องสำหรับ Use Case ที่กำหนด
ตั้งแต่ Android 12 เป็นต้นไป เราจะนำข้อจำกัดเหล่านี้ออกเพื่อเปิดใช้ Use Case ใหม่ๆ เช่น การออกอากาศเสียง มัลติแคสต์ไปยังกลุ่มหูฟังเสียง BLE หรือการเลือกการ์ดเสียง USB หลายใบพร้อมกัน ไม่รองรับการกำหนดเส้นทางไปยังอุปกรณ์ USB หลายเครื่องพร้อมกัน
เฟรมเวิร์ก USB รองรับใน Android 14 เป็นต้นไป การกำหนดเส้นทางไปยังอุปกรณ์ USB หลายเครื่องในกรณีที่อุปกรณ์ USB มีสัญญาณเสียงที่แตกต่างกัน ประเภทอุปกรณ์ และมีเคอร์เนลและการสนับสนุนของผู้ให้บริการในการเชื่อมต่อ USB หลายตัว พร้อมกัน
หน้านี้จะอธิบายวิธีใช้การรองรับสตรีมมิงเสียงไปยังอุปกรณ์เสียงหลายเครื่อง และวิธีตรวจสอบการติดตั้งใช้งานฟีเจอร์นี้
รองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่อง
API ใน Android 12 ที่รองรับฟีเจอร์นี้มีอยู่ 2 ชุดดังนี้
- API ของระบบจะรองรับอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ
- อินเทอร์เฟซ HIDL ที่ผู้ให้บริการนำมาใช้เป็นส่วนหนึ่งของ HAL เสียงจะรายงานความสามารถของอุปกรณ์
ส่วนต่อไปนี้จะกล่าวถึง API แต่ละรายการโดยละเอียดยิ่งขึ้น
จัดการอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์
เครื่องมือจัดการนโยบายเสียงมี API ของระบบเพื่อรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกันได้ดียิ่งขึ้น API ระบบเหล่านี้จะเปิดใช้การตั้งค่า ซึ่งทำให้ และนำอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์ที่ระบุออก ก่อนหน้านี้ Android รองรับฟีเจอร์นี้ในอุปกรณ์เครื่องเดียวเท่านั้น
เครื่องมือจัดการนโยบายเสียงจะแนะนำแนวคิดอุปกรณ์สื่อที่ใช้งานอยู่เพื่ออธิบายอุปกรณ์ที่มีแนวโน้มสูงที่สุดที่ระบบจะเลือกให้เล่นสื่อ เมื่อเชื่อมต่ออุปกรณ์แบบถอดได้ คุณอาจต้องเปิดและตรวจสอบแอตทริบิวต์ที่รองรับในสตรีมเอาต์พุต HAL เสียงที่กําหนดเส้นทางไปยังอุปกรณ์นี้ได้
คุณต้องระบุอุปกรณ์เสียงเมื่อเปิดสตรีมเอาต์พุต อุปกรณ์สื่อที่ใช้งานอยู่คืออุปกรณ์ที่ใช้เมื่อเปิดสตรีมเอาต์พุตในบริบทนี้
การเลือกอุปกรณ์สื่อที่ใช้งานอยู่อาจเปลี่ยนแปลงได้ตามอุปกรณ์จริง เชื่อมต่ออยู่หรือตัดการเชื่อมต่อแล้ว เครื่องมือจัดการนโยบายเสียงใช้ชุดกฎต่อไปนี้เพื่อเลือกอุปกรณ์สื่อที่ใช้งานอยู่
- หากมีอุปกรณ์ที่ต้องการสำหรับสื่อทั้งหมดพร้อมใช้งาน ระบบจะเลือกอุปกรณ์เหล่านั้นทั้งหมด เป็นอุปกรณ์ที่ใช้งานอยู่
- ไม่เช่นนั้น ระบบจะเลือกอุปกรณ์แบบถอดได้ซึ่งเชื่อมต่อล่าสุด
- หากไม่ได้เชื่อมต่ออุปกรณ์แบบถอดออก กฎของนโยบายเสียงเริ่มต้น สำหรับการเลือกอุปกรณ์เอาต์พุตจะนำไปใช้กับการเลือกอุปกรณ์ที่ใช้งานอยู่
สตรีมเอาต์พุตต้องเป็นไปตามเกณฑ์ต่อไปนี้จึงจะเปิดใหม่และกำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่ได้เพื่อให้ระบบเลือกการกำหนดค่าที่ดีที่สุดสำหรับการเล่น
- สตรีมเอาต์พุตต้องรองรับอุปกรณ์ที่ใช้งานอยู่
- สตรีมเอาต์พุตต้องรองรับโปรไฟล์แบบไดนามิก
- ขณะนี้สตรีมเอาต์พุตต้องไม่กำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่
หากต้องการใช้การเลือกอุปกรณ์ใหม่ เครื่องมือจัดการนโยบายเสียงจะปิดและเปิดสตรีมเอาต์พุตอีกครั้งเมื่อเชื่อมต่ออุปกรณ์ หากสตรีมเอาต์พุตไม่มีการใช้งาน หรือจะเลื่อนเวลาไว้จนกว่าสตรีมเอาต์พุตจะเข้าสู่โหมดสแตนด์บายก็ได้
Audio Policy Manager จะมีรายชื่อ API ระบบดังต่อไปนี้(ตามที่กำหนดไว้ใน
AudioManager.java
)
setPreferredDeviceForStrategy
ตั้งค่าอุปกรณ์ที่ต้องการสำหรับการกำหนดเส้นทางเสียงสำหรับกลยุทธ์ที่ระบุ โปรดทราบว่าอุปกรณ์อาจไม่พร้อมใช้งานเมื่อตั้งค่าอุปกรณ์ที่ต้องการ แต่ระบบจะใช้อุปกรณ์ดังกล่าวเมื่อพร้อมใช้งาน
removePreferredDeviceForStrategy
นำอุปกรณ์เสียงที่ต้องการที่ตั้งค่าไว้ก่อนหน้านี้ออก
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
getPreferredDeviceForStrategy
แสดงอุปกรณ์ที่ต้องการสำหรับกลยุทธ์ด้านเสียงที่ตั้งค่าไว้ก่อนหน้านี้
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
setPreferredDevicesForStrategy
ตั้งค่าอุปกรณ์ที่ต้องการสำหรับกลยุทธ์ที่ระบุ
getPreferredDevicesForStrategy
แสดงอุปกรณ์ที่ต้องการสำหรับกลยุทธ์เสียงที่ตั้งไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
OnPreferredDevicesForStrategyChangedListener
กําหนดอินเทอร์เฟซสําหรับการแจ้งเตือนการเปลี่ยนแปลงในอุปกรณ์เสียงที่ต้องการซึ่งตั้งค่าไว้สําหรับกลยุทธ์เสียงหนึ่งๆ
addOnPreferredDevicesForStrategyChangedListener
เพิ่มผู้ฟังเพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงในอุปกรณ์เสียงที่กลยุทธ์ต้องการ
removeOnPreferredDevicesForStrategyChangedListener
นำ Listener ของการเปลี่ยนแปลงที่เคยเพิ่มไว้ในกลยุทธ์ที่ต้องการออก อุปกรณ์เสียง
รายงานความสามารถของอุปกรณ์
ในการนำไปใช้งาน Audio 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;
};
ใน HAL V7 ของเสียง HIDL ระบบจะกำหนดประเภทข้อมูล 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
ต่อไปนี้เป็นรายการการทดสอบของ Audio Manager ที่พร้อมใช้งาน
AudioManagerTest#testGetDevices
ยืนยันความสามารถที่แน่นอนของอุปกรณ์เสียง และยังช่วยยืนยันว่า โปรไฟล์เสียงที่แสดงผลในโครงสร้าง
AudioDeviceInfo
เก็บรักษา เนื้อหาจากรูปแบบอาร์เรย์ที่แยกเป็นหลายรายการเก่า แต่อยู่ในรูปแบบใหม่AudioProfile
AudioManagerTest#testPreferredDevicesForStrategy
และAudioManagerTest#testPreferredDeviceForCapturePreset
ยืนยันว่าอุปกรณ์ที่ต้องการสําหรับกลยุทธ์และบันทึกการทดสอบ API ที่เกี่ยวข้องล่วงหน้าเสร็จสมบูรณ์
การทดสอบ GTS
การทดสอบ GTS จะอยู่ใน com.google.android.gts.audioservice.AudioServiceHostTest
หากต้องการตรวจสอบว่า API สําหรับอุปกรณ์ที่ต้องการสําหรับกลยุทธ์และการตั้งค่าล่วงหน้าทํางานอย่างถูกต้องหรือไม่ ให้ทําการทดสอบ AudioServiceHostTest#testPreferredDeviceRouting
และ AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset