ویژگی مسیریابی دستگاه صوتی ترکیبی، پشتیبانی از جاریسازی همزمان صدا به چندین دستگاه صوتی را اضافه میکند. بااستفاده از این ویژگی، برنامههای دارای امتیاز میتوانند چندین دستگاه ترجیحی را برای استراتژی خاصی ازطریق میاناهای برنامهسازی کاربردی سیستم انتخاب کنند. برنامهها میتوانند بااستفاده از میاناهای برنامهسازی کاربردی عمومی ارائهشده توسط این ویژگی، قابلیتهای دستگاههای صوتی را با دقت بیشتری کشف کنند. برای نسخههای Android 11 و پایینتر، پیادهسازی چارچوب صوتی از پشتیبانی محدودی برای چندین دستگاه صوتی از یک نوع (برای مثال، ۲ هدست بلوتوث A2DP) که بهطور همزمان متصل شدهاند برخوردار است. قوانین مسیریابی صوتی پیشفرض همچنین به کاربران اجازه نمیدهد چندین دستگاه از یک نوع را برای یک مورد استفاده خاص انتخاب کنند.
از Android 12، این محدودیتها برداشته شده است تا امکان استفاده از موارد جدید مثل همهفرستی صوتی، همهفرستی به گروهی از هدفونهای صوتی BLE، یا انتخاب همزمان چند کارت صدای USB فراهم شود. مسیردهی به چند دستگاه USB بهطور همزمان پشتیبانی نمیشود.
از Android 14، چارچوب USB از مسیریابی به چندین دستگاه USB پشتیبانی میکند، بهشرطی که دستگاههای USB از انواع دستگاه صوتی مختلف باشند و هسته و فروشنده از اتصال همزمان چندین دستگاه USB پشتیبانی کنند.
این صفحه نحوه پیادهسازی پشتیبانی از جاریسازی صدا به چندین دستگاه صوتی و نحوه اعتبارسنجی پیادهسازی این ویژگی را پوشش میدهد.
پشتیبانی از جاریسازی صدا به چند دستگاه صوتی
دو مجموعه API در Android 12 وجود دارد که از این ویژگی پشتیبانی میکنند:
- میاناهای برنامهسازی کاربردی سیستم چندین دستگاه ترجیحی را برای یک استراتژی مدیریت میکنند.
- میانای HIDL که فروشنده بهعنوان بخشی از HAL صوتی پیادهسازی کرده است، قابلیتهای دستگاه را گزارش میکند.
بخشهای زیر هریک از این «میاناهای برنامهسازی کاربردی» را با جزئیات بیشتری مورد بحث قرار میدهند.
مدیریت چندین دستگاه ترجیحی برای یک استراتژی
«مدیر خطمشی صوتی» میاناهای برنامهسازی کاربردی سیستم را برای پشتیبانی بهتر از جاریسازی صدا به چند دستگاه صوتی بهطور همزمان ارائه میدهد. این میاناهای برنامهسازی کاربردی سیستم امکان تنظیم، دریافت، و برداشتن چندین دستگاه ترجیحی را برای یک استراتژی معین فراهم میکنند. تا قبلاز Android 12، این ویژگی فقط برای یک دستگاه پشتیبانی میشد.
«مدیر خطمشی صوتی» مفهوم دستگاههای رسانهای فعال را برای توصیف دستگاههایی که احتمالاً برای بازپخش رسانه انتخاب میشوند معرفی میکند. وقتی دستگاه جداشدنی متصل میشود، جاریسازیهای خروجی HAL صوتی که میتوانند به این دستگاه هدایت شوند ممکن است نیاز داشته باشند برای ویژگیهای پشتیبانیشده باز و کاوش شوند.
هنگام باز کردن جاریسازی خروجی، باید دستگاه صوتی مشخص شود. دستگاه رسانه فعال دستگاهی است که هنگام باز شدن جریانهای خروجی در این زمینه استفاده میشود.
انتخاب دستگاه رسانهای فعال میتواند بسته به دستگاههای متصل یا قطعشده تغییر کند. «مدیر خطمشی صوتی» از مجموعه قوانین زیر برای انتخاب دستگاههای رسانهای فعال استفاده میکند:
- اگر همه دستگاههای انتخابی برای رسانه دردسترس باشند، همه آنها بهعنوان دستگاههای فعال انتخاب میشوند.
- درغیراینصورت، آخرین دستگاه جانبی متصل انتخاب میشود.
- اگر دستگاه جداشدنیای متصل نباشد، قوانین خطمشی صوتی پیشفرض برای انتخاب دستگاههای خروجی برای انتخاب دستگاههای فعال اعمال میشود.
جاریسازی خروجی باید معیارهای زیر را برآورده کند تا دوباره باز شود و به دستگاههای فعال هدایت شود تا بهترین پیکربندی برای بازپخش انتخاب شود:
- جاریسازی برونداد باید از دستگاههای فعال پشتیبانی کند.
- جاریسازی برونداد باید از نمایههای پویا پشتیبانی کند.
- جاریسازی برونداد نباید درحالحاضر به دستگاههای فعال هدایت شود.
برای اعمال انتخاب دستگاه جدید، «مدیر خطمشی صوتی» بسته میشود و جاریسازی برونداد را پساز اتصال دستگاه باز میکند اگر جاریسازی برونداد در حالت آمادهبهکار باشد، یا آن را به زمانی موکول میکند که جاریسازی برونداد در حالت آمادهبهکار قرار میگیرد.
«مدیر خطمشی صدا» فهرست زیر از «میاناهای برنامهسازی کاربردی سیستم» را ارائه میدهد(همانطور که در
AudioManager.java تعریف شده است):
setPreferredDeviceForStrategyدستگاه ترجیحی را برای مسیریابی صوتی برای یک استراتژی معین تنظیم میکند. توجه داشته باشید که ممکن است دستگاه در زمانی که دستگاه ترجیحی تنظیم میشود دردسترس نباشد، اما پساز دردسترس قرار گرفتن از آن استفاده میشود.
removePreferredDeviceForStrategyدستگاه(های) صوتی ترجیحی را که قبلاً با
setPreferredDeviceForStrategyیاsetPreferredDevicesForStrategyتنظیم شده است برمیدارد.getPreferredDeviceForStrategyدستگاه ترجیحی را برای استراتژی صوتی که قبلاً با
setPreferredDeviceForStrategyیاsetPreferredDevicesForStrategyتنظیم شده است برمیگرداند.setPreferredDevicesForStrategyدستگاههای ترجیحی را برای استراتژی معینی تنظیم میکند.
getPreferredDevicesForStrategyدستگاههای ترجیحی را برای استراتژی صوتی که قبلاً با
setPreferredDeviceForStrategyیاsetPreferredDevicesForStrategyتنظیم شده است برمیگرداند.OnPreferredDevicesForStrategyChangedListenerمیانایی را برای اعلان تغییرات در دستگاههای صوتی ترجیحی که برای استراتژی صوتی معینی تنظیم شدهاند تعریف میکند.
addOnPreferredDevicesForStrategyChangedListenerشنوندهای اضافه میکند تا از تغییرات دستگاه صوتی ترجیحی استراتژی مطلع شود.
removeOnPreferredDevicesForStrategyChangedListenerشنونده تغییرات دستگاه صوتی ترجیحی استراتژی را که قبلاً اضافه شده است برمیدارد.
گزارش قابلیتهای دستگاه
بهعنوان بخشی از پیادهسازی Audio HAL، فروشندگان میاناهای برنامهسازی کاربردی را پیادهسازی میکنند که از گزارش قابلیتهای دستگاه پشتیبانی میکنند. این بخش انواع داده و روشهای مورد استفاده برای گزارش قابلیتهای دستگاه را توضیح میدهد و برخیاز تغییرات ایجادشده در audio HIDL HAL V7 را برای پشتیبانی از دستگاههای متعدد فهرست میکند.
انواع داده
در audio 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 تعریف میشود تا قابلیتهای دستگاه را توصیف کند.
روشهای لایه انتزاع سختافزار صوتی
«مدیر خطمشی صدا» از روشهای زیر برای پُرسمان کردن قابلیتهای دستگاه استفاده میکند:
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);
تغییرات در میانای برنامهسازی کاربردی قدیمی
برای پشتیبانی از چندین نمایه صوتی، نسخه ۳.۲ از «میانای برنامهسازی کاربردی» قدیمی ساختار جدیدی به نام audio_port_v7 اضافه میکند. برای جزئیات بیشتر، کد منبع را ببینید.
بهدلیل اضافه شدن audio_port_v7، نسخه ۳.۲ از API قدیمی یک
API جدید به نام get_audio_port_v7 اضافه میکند تا قابلیتهای دستگاهها را بااستفاده از
ساختار audio_port_v7 جستجو کند.
کد زیر از audio.h
تعریف میانای برنامهسازی کاربردی get_audio_port_v7 را نشان میدهد:
/**
* 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);
وقتی نسخه API قدیمی پایینتر از ۳.۲ و نسخه HIDL HAL برابر با ۷ یا بالاتر باشد، دادههای API قدیمی get_audio_port باید در قالب جدید AudioPort تکمیل شود. در این مورد، فرض میشود که همه نرخهای نمونه و پوششهای کانال گزارششده از get_audio_port برای همه قالبهای برگشتی پشتیبانی میشوند، که این امر امکان نگاشت مستقیم از مقادیر get_audio_port به ساختار جدید AudioPort را فراهم میکند.
پیادهسازیهای نمونه میانای برنامهسازی کاربردی
این بخش چندین مجموعه آزمایشی را توصیف میکند که حاوی روشهایی هستند که از میاناهای برنامهسازی کاربردی پوششدادهشده در بخشهای قبلی استفاده میکنند. برای دیدن چند نمونه از نحوه پیادهسازی و استفاده از این «میاناهای برنامهسازی کاربردی»، به این روشها مراجعه کنید.
مثالی از استفاده از 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 قرار دارند.
فهرست آزمایشهای دردسترس «مدیر صوتی» در زیر آمده است:
AudioManagerTest#testGetDevicesقابلیتهای دقیق دستگاه صوتی را درستیسنجی میکند. همچنین تأیید میکند که نمایههای صوتی برگشتی در ساختار
AudioDeviceInfoمحتوای قالب آرایه قدیمیتر و مسطحشده را حفظ میکنند، اما در قالب جدیدAudioProfileهستند.AudioManagerTest#testPreferredDevicesForStrategyوAudioManagerTest#testPreferredDeviceForCapturePresetتأیید کنید که دستگاههای ترجیحی برای استراتژی و پیشتنظیم ضبط مربوط به آزمایشهای API با موفقیت تکمیل میشوند.
آزمایشهای GTS
آزمایشهای GTS در com.google.android.gts.audioservice.AudioServiceHostTest قرار دارند.
برای اعتبارسنجی اینکه آیا میاناهای برنامهسازی کاربردی برای دستگاههای ترجیحی برای استراتژی و پیشتنظیم ضبط
بهدرستی کار میکنند، آزمایشهای AudioServiceHostTest#testPreferredDeviceRouting و AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset را اجرا کنید.