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