ฟีเจอร์การกำหนดเส้นทางอุปกรณ์เสียงแบบรวมจะเพิ่มการรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกัน เมื่อใช้ฟีเจอร์นี้ แอปที่มีสิทธิ์จะเลือกอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ ได้ผ่าน API ของระบบ แอปจะค้นพบความสามารถของอุปกรณ์เสียงได้อย่างแม่นยำยิ่งขึ้นโดยใช้ API สาธารณะที่ฟีเจอร์นี้ให้ไว้ สำหรับ Android เวอร์ชัน 11 และต่ำกว่า การใช้งานเฟรมเวิร์กเสียงจะรองรับอุปกรณ์เสียงหลายเครื่องประเภทเดียวกัน (เช่น ชุดหูฟังบลูทูธ A2DP 2 เครื่อง) ที่เชื่อมต่อพร้อมกันได้แบบจำกัด นอกจากนี้ กฎการกำหนดเส้นทางเสียงเริ่มต้นยังไม่อนุญาตให้ผู้ใช้เลือกอุปกรณ์หลายเครื่องประเภทเดียวกันสำหรับกรณีการใช้งานหนึ่งๆ
ตั้งแต่ Android 12 เป็นต้นไป เราจะนำข้อจำกัดเหล่านี้ออกเพื่อเปิดใช้ Use Case ใหม่ๆ เช่น การออกอากาศเสียง มัลติแคสต์ไปยังกลุ่มหูฟังเสียง BLE หรือการเลือกการ์ดเสียง USB หลายใบพร้อมกัน ไม่รองรับการกำหนดเส้นทางไปยังอุปกรณ์ USB หลายเครื่องพร้อมกัน
ตั้งแต่ Android 14 เป็นต้นไป เฟรมเวิร์ก USB จะรองรับการกำหนดเส้นทางไปยังอุปกรณ์ USB หลายเครื่องได้ในกรณีที่อุปกรณ์ USB เป็นอุปกรณ์เสียงประเภทต่างๆ และมีการรองรับเคอร์เนลและผู้จำหน่ายเพื่อเชื่อมต่ออุปกรณ์ USB หลายเครื่องพร้อมกัน
หน้านี้จะอธิบายวิธีใช้การรองรับสตรีมมิงเสียงไปยังอุปกรณ์เสียงหลายเครื่อง และวิธีตรวจสอบการติดตั้งใช้งานฟีเจอร์นี้
รองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่อง
Android 12 มี API 2 ชุดที่รองรับฟีเจอร์นี้ ได้แก่
- API ของระบบจะจัดการอุปกรณ์ที่ต้องการหลายรายการสําหรับกลยุทธ์
- อินเทอร์เฟซ HIDL ที่ผู้ให้บริการนำมาใช้เป็นส่วนหนึ่งของ HAL เสียงจะรายงานความสามารถของอุปกรณ์
ส่วนต่อไปนี้จะอธิบาย API แต่ละรายการอย่างละเอียด
จัดการอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ
เครื่องมือจัดการนโยบายเสียงมี API ของระบบเพื่อรองรับการสตรีมเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกันได้ดียิ่งขึ้น API ของระบบเหล่านี้ช่วยให้คุณตั้งค่า รับ และนําอุปกรณ์ที่ต้องการหลายรายการออกสําหรับกลยุทธ์หนึ่งๆ ได้ ก่อนหน้านี้ Android รองรับฟีเจอร์นี้ในอุปกรณ์เครื่องเดียวเท่านั้น
เครื่องมือจัดการนโยบายเสียงจะแนะนำแนวคิดอุปกรณ์สื่อที่ใช้งานอยู่เพื่ออธิบายอุปกรณ์ที่มีแนวโน้มสูงที่สุดที่ระบบจะเลือกให้เล่นสื่อ เมื่อเชื่อมต่ออุปกรณ์แบบถอดได้ คุณอาจต้องเปิดและตรวจสอบแอตทริบิวต์ที่รองรับในสตรีมเอาต์พุต HAL เสียงที่กําหนดเส้นทางไปยังอุปกรณ์นี้ได้
คุณต้องระบุอุปกรณ์เสียงเมื่อเปิดสตรีมเอาต์พุต อุปกรณ์สื่อที่ใช้งานอยู่คืออุปกรณ์ที่ใช้เมื่อเปิดสตรีมเอาต์พุตในบริบทนี้
การเลือกอุปกรณ์สื่อที่ใช้งานอยู่อาจเปลี่ยนแปลงได้ ทั้งนี้ขึ้นอยู่กับอุปกรณ์จริงที่เชื่อมต่อหรือไม่ได้เชื่อมต่อ เครื่องมือจัดการนโยบายเสียงใช้ชุดกฎต่อไปนี้เพื่อเลือกอุปกรณ์สื่อที่ใช้งานอยู่
- หากอุปกรณ์ที่ต้องการทั้งหมดสําหรับสื่อพร้อมใช้งาน ระบบจะเลือกอุปกรณ์ทั้งหมดเป็นอุปกรณ์ที่ใช้งานอยู่
- ไม่เช่นนั้น ระบบจะเลือกอุปกรณ์แบบถอดได้ซึ่งเชื่อมต่อครั้งล่าสุด
- หากไม่มีอุปกรณ์แบบถอดได้เชื่อมต่ออยู่ ระบบจะใช้กฎนโยบายเสียงเริ่มต้นสำหรับเลือกอุปกรณ์เอาต์พุตเพื่อเลือกอุปกรณ์ที่ใช้งานอยู่
สตรีมเอาต์พุตต้องเป็นไปตามเกณฑ์ต่อไปนี้จึงจะเปิดใหม่และกำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่ได้เพื่อให้ระบบเลือกการกำหนดค่าที่ดีที่สุดสำหรับการเล่น
- สตรีมเอาต์พุตต้องรองรับอุปกรณ์ที่ใช้งานอยู่
- สตรีมเอาต์พุตต้องรองรับโปรไฟล์แบบไดนามิก
- ขณะนี้สตรีมเอาต์พุตต้องไม่กำหนดเส้นทางไปยังอุปกรณ์ที่ใช้งานอยู่
หากต้องการใช้การเลือกอุปกรณ์ใหม่ เครื่องมือจัดการนโยบายเสียงจะปิดและเปิดสตรีมเอาต์พุตอีกครั้งเมื่อเชื่อมต่ออุปกรณ์ หากสตรีมเอาต์พุตไม่มีการใช้งาน หรือเลื่อนเวลาไว้เมื่อสตรีมเอาต์พุตอยู่ในโหมดสแตนด์บาย
เครื่องมือจัดการนโยบายเสียงมีรายการ 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;
};
ใน 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 เหล่านี้จากเมธอดเหล่านี้
ตัวอย่างการใช้ API ของระบบ setPreferredDevicesForStrategy
,
getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
และ
OnPreferredDevicesForStrategyChangedListener
อยู่ในเมธอด PreferredDeviceRoutingTest
ซึ่งอยู่ใน GTS
หากต้องการดูตัวอย่างโครงสร้างใหม่ใน AudioDeviceInfo
ที่ใช้อยู่ ให้ดูวิธี AudioManagerTest#testGetDevices
ใน CTS
ตัวอย่างการใช้งาน get_audio_port_v7
อยู่ใน audio_hal.c
และแสดงวิธีค้นหาความสามารถของอุปกรณ์หลายเครื่อง
การตรวจสอบความถูกต้อง
ส่วนนี้ให้ข้อมูลเกี่ยวกับการตรวจสอบ 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