ฟีเจอร์การกำหนดเส้นทางอุปกรณ์เสียงแบบรวมช่วยเพิ่มการรองรับการสตรีมเสียงไปยัง อุปกรณ์เสียงหลายเครื่องพร้อมกัน การใช้ฟีเจอร์นี้จะช่วยให้แอปที่มีสิทธิ์สามารถ เลือกอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์หนึ่งๆ ผ่าน 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 แต่ละรายการโดยละเอียด
จัดการอุปกรณ์ที่ต้องการหลายเครื่องสำหรับกลยุทธ์
Audio Policy Manager มี API ของระบบเพื่อรองรับการสตรีมเสียงไปยัง อุปกรณ์เสียงหลายเครื่องพร้อมกันได้ดียิ่งขึ้น API ของระบบเหล่านี้ช่วยให้ตั้งค่า รับ และนำอุปกรณ์ที่ต้องการหลายเครื่องออกสำหรับกลยุทธ์ที่กำหนดได้ ก่อน Android 12 ฟีเจอร์นี้รองรับเฉพาะอุปกรณ์เครื่องเดียว
Audio Policy Manager นำเสนอแนวคิดของอุปกรณ์สื่อที่ใช้งานอยู่เพื่อ อธิบายอุปกรณ์ที่มีแนวโน้มมากที่สุดที่จะได้รับการเลือกสำหรับการเล่นสื่อ เมื่อเชื่อมต่ออุปกรณ์ที่ถอดออกได้ สตรีมเอาต์พุต HAL ของเสียงที่กำหนดเส้นทางไปยังอุปกรณ์นี้ได้ อาจต้องเปิดและตรวจสอบแอตทริบิวต์ที่รองรับ
ต้องระบุอุปกรณ์เสียงเมื่อเปิดสตรีมเอาต์พุต อุปกรณ์สื่อที่ใช้งานอยู่คืออุปกรณ์ที่ใช้เมื่อเปิดสตรีมเอาต์พุตในบริบทนี้
การเลือกอุปกรณ์สื่อที่ใช้งานอยู่สามารถเปลี่ยนแปลงได้โดยขึ้นอยู่กับอุปกรณ์จริงที่ เชื่อมต่อหรือยกเลิกการเชื่อมต่อ Audio Policy Manager ใช้ชุดกฎต่อไปนี้ เพื่อเลือกอุปกรณ์สื่อที่ใช้งานอยู่
- หากอุปกรณ์ที่ต้องการทั้งหมดสำหรับสื่อพร้อมใช้งาน ระบบจะเลือกอุปกรณ์ทั้งหมดเป็นอุปกรณ์ที่ใช้งานอยู่
- ไม่เช่นนั้น ระบบจะเลือกอุปกรณ์แบบถอดได้ที่เชื่อมต่อล่าสุด
- หากไม่มีอุปกรณ์แบบถอดได้เชื่อมต่ออยู่ ระบบจะใช้กฎนโยบายเสียงเริ่มต้น สำหรับการเลือกอุปกรณ์เอาต์พุตเพื่อเลือกอุปกรณ์ที่ใช้งานอยู่
สตรีมเอาต์พุตต้องเป็นไปตามเกณฑ์ต่อไปนี้จึงจะเปิดอีกครั้งและกำหนดเส้นทาง ไปยังอุปกรณ์ที่ใช้งานอยู่เพื่อให้ระบบเลือกการกำหนดค่าที่ดีที่สุดสำหรับการเล่น
- สตรีมเอาต์พุตต้องรองรับอุปกรณ์ที่ใช้งานอยู่
- สตรีมเอาต์พุตต้องรองรับโปรไฟล์แบบไดนามิก
- ต้องไม่ได้กำหนดเส้นทางสตรีมเอาต์พุตไปยังอุปกรณ์ที่ใช้งานอยู่ในปัจจุบัน
หากต้องการใช้การเลือกอุปกรณ์ใหม่ Audio Policy Manager จะปิดและ เปิดสตรีมเอาต์พุตอีกครั้งเมื่อมีการเชื่อมต่ออุปกรณ์ หากสตรีมเอาต์พุตไม่ได้ใช้งาน หรือ เลื่อนการดำเนินการไว้เมื่อสตรีมเอาต์พุตเข้าสู่โหมดสแตนด์บาย
Audio Policy Manager มีรายการ API ของระบบต่อไปนี้(ตามที่กำหนดไว้ใน
AudioManager.java
)
setPreferredDeviceForStrategy
ตั้งค่าอุปกรณ์ที่ต้องการสำหรับการกำหนดเส้นทางเสียงสำหรับกลยุทธ์ที่ระบุ โปรดทราบ ว่าอุปกรณ์อาจไม่พร้อมใช้งานในขณะที่ตั้งค่าอุปกรณ์ที่ต้องการ แต่จะใช้เมื่อพร้อมใช้งาน
removePreferredDeviceForStrategy
นำอุปกรณ์เสียงที่ต้องการซึ่งตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
ออกgetPreferredDeviceForStrategy
แสดงอุปกรณ์ที่ต้องการสำหรับกลยุทธ์เสียงที่ตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
setPreferredDevicesForStrategy
ตั้งค่าอุปกรณ์ที่ต้องการสําหรับกลยุทธ์ที่ระบุ
getPreferredDevicesForStrategy
แสดงอุปกรณ์ที่ต้องการสำหรับกลยุทธ์เสียงที่ตั้งค่าไว้ก่อนหน้านี้ด้วย
setPreferredDeviceForStrategy
หรือsetPreferredDevicesForStrategy
OnPreferredDevicesForStrategyChangedListener
กำหนดอินเทอร์เฟซสำหรับการแจ้งเตือนการเปลี่ยนแปลงในอุปกรณ์เสียงที่ต้องการ ซึ่งตั้งค่าไว้สำหรับกลยุทธ์เสียงที่กำหนด
addOnPreferredDevicesForStrategyChangedListener
เพิ่ม Listener เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงอุปกรณ์เสียงที่กลยุทธ์ต้องการ
removeOnPreferredDevicesForStrategyChangedListener
นำ Listener ที่เพิ่มไว้ก่อนหน้านี้ของการเปลี่ยนแปลงอุปกรณ์เสียงที่กลยุทธ์ต้องการออก
รายงานความสามารถของอุปกรณ์
ผู้ให้บริการจะใช้ API ที่รองรับ การรายงานความสามารถของอุปกรณ์ ซึ่งเป็นส่วนหนึ่งของการติดตั้งใช้งาน HAL เสียง ส่วนนี้จะอธิบายประเภทข้อมูลและวิธีการ ที่ใช้ในการรายงานความสามารถของอุปกรณ์ รวมถึงแสดงการเปลี่ยนแปลงบางอย่างที่ทำใน 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
เพื่ออธิบายความสามารถของอุปกรณ์
วิธีการของ 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, AudioPo
rt 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 au
dio_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
System API อยู่ในเมธอด
PreferredDeviceRoutingTest
ซึ่งอยู่ใน GTS
หากต้องการดูตัวอย่างโครงสร้างใหม่ใน AudioDeviceInfo
ที่ใช้งานอยู่ โปรดดูเมธอด
AudioManagerTest#testGetDevices
ซึ่งอยู่ใน CTS
ตัวอย่างการใช้งานสำหรับ get_audio_port_v7
อยู่ใน
audio_hal.c
และแสดงวิธีค้นหาความสามารถของอุปกรณ์หลายเครื่อง
การตรวจสอบความถูกต้อง
ส่วนนี้ให้ข้อมูลเกี่ยวกับการตรวจสอบความถูกต้องของ Audio Manager ใน 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