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