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