مسیریابی دستگاه صوتی ترکیبی

ویژگی مسیریابی ترکیبی دستگاه صوتی، پشتیبانی از پخش همزمان صدا به چندین دستگاه صوتی را اضافه می‌کند. با استفاده از این ویژگی، برنامه‌های دارای امتیاز می‌توانند چندین دستگاه ترجیحی را برای یک استراتژی خاص از طریق APIهای سیستم انتخاب کنند. برنامه‌ها می‌توانند با استفاده از APIهای عمومی ارائه شده توسط این ویژگی، قابلیت‌های دستگاه‌های صوتی را با دقت بیشتری کشف کنند. برای نسخه‌های اندروید ۱۱ و پایین‌تر، پیاده‌سازی چارچوب صوتی، پشتیبانی محدودی برای چندین دستگاه صوتی از یک نوع (به عنوان مثال، ۲ هدست بلوتوث A2DP) که به طور همزمان متصل هستند، دارد. قوانین پیش‌فرض مسیریابی صوتی همچنین به کاربران اجازه نمی‌دهد چندین دستگاه از یک نوع را برای یک مورد استفاده خاص انتخاب کنند.

با شروع اندروید ۱۲، این محدودیت‌ها برداشته شده‌اند تا موارد استفاده جدیدی مانند پخش صوتی، پخش چندگانه به گروهی از هدفون‌های صوتی BLE یا انتخاب همزمان چندین کارت صدای USB فراهم شود. مسیریابی همزمان به چندین دستگاه USB پشتیبانی نمی‌شود.

با شروع از اندروید ۱۴، چارچوب USB از مسیریابی به چندین دستگاه USB پشتیبانی می‌کند، مشروط بر اینکه دستگاه‌های USB از انواع مختلف دستگاه‌های صوتی باشند و پشتیبانی هسته و فروشنده برای اتصال همزمان چندین دستگاه USB وجود دارد.

این صفحه نحوه پیاده‌سازی پشتیبانی از پخش صدا به چندین دستگاه صوتی و نحوه اعتبارسنجی پیاده‌سازی این ویژگی را پوشش می‌دهد.

پشتیبانی از پخش صدا به چندین دستگاه صوتی

دو مجموعه API در اندروید ۱۲ وجود دارد که از این ویژگی پشتیبانی می‌کنند:

  • APIهای سیستم، چندین دستگاه ترجیحی را برای یک استراتژی مدیریت می‌کنند.
  • رابط HIDL که توسط فروشنده به عنوان بخشی از HAL صوتی پیاده‌سازی شده است، قابلیت‌های دستگاه را گزارش می‌دهد.

در بخش‌های بعدی، هر یک از این APIها را با جزئیات بیشتری بررسی خواهیم کرد.

مدیریت چندین دستگاه ترجیحی برای یک استراتژی

مدیر سیاست صوتی، APIهای سیستمی را برای پشتیبانی بهتر از پخش همزمان صدا به چندین دستگاه صوتی ارائه می‌دهد. این APIهای سیستمی، تنظیم، دریافت و حذف چندین دستگاه ترجیحی را برای یک استراتژی مشخص امکان‌پذیر می‌کنند. تا اندروید ۱۲، این ویژگی فقط برای یک دستگاه واحد پشتیبانی می‌شد.

مدیر سیاست صوتی، مفهوم دستگاه‌های رسانه‌ای فعال را برای توصیف دستگاه‌هایی که به احتمال زیاد برای پخش رسانه انتخاب می‌شوند، معرفی می‌کند. هنگامی که یک دستگاه جداشدنی متصل می‌شود، جریان‌های خروجی HAL صوتی که می‌توانند به این دستگاه هدایت شوند، ممکن است نیاز به باز شدن و بررسی ویژگی‌های پشتیبانی‌شده داشته باشند.

هنگام باز کردن یک جریان خروجی، باید یک دستگاه صوتی مشخص شود. دستگاه رسانه فعال، دستگاهی است که هنگام باز کردن جریان‌های خروجی در این زمینه استفاده می‌شود.

انتخاب دستگاه رسانه فعال می‌تواند بسته به دستگاه‌های متصل یا جدا شده تغییر کند. مدیر سیاست صوتی از مجموعه‌ای از قوانین زیر برای انتخاب دستگاه‌های رسانه فعال استفاده می‌کند:

  1. اگر همه دستگاه‌های ترجیحی برای رسانه در دسترس باشند، همه آنها به عنوان دستگاه‌های فعال انتخاب می‌شوند.
  2. در غیر این صورت، آخرین دستگاه قابل جابجایی متصل انتخاب می‌شود.
  3. اگر هیچ دستگاه قابل جابجایی متصل نباشد، قوانین پیش‌فرض سیاست صوتی برای انتخاب دستگاه‌های خروجی برای انتخاب دستگاه‌های فعال اعمال می‌شود.

یک جریان خروجی باید معیارهای زیر را برای بازگشایی و هدایت به دستگاه‌های فعال داشته باشد تا بهترین پیکربندی برای پخش انتخاب شود:

  • جریان خروجی باید از دستگاه‌های فعال پشتیبانی کند.
  • جریان خروجی باید از پروفایل‌های پویا پشتیبانی کند.
  • جریان خروجی نباید در حال حاضر به دستگاه‌های فعال هدایت شود.

برای اعمال انتخاب دستگاه جدید، مدیر سیاست صوتی در صورت غیرفعال بودن جریان خروجی، جریان خروجی را پس از اتصال دستگاه می‌بندد و دوباره باز می‌کند، یا آن را به زمانی که جریان خروجی در حالت آماده به کار قرار می‌گیرد، موکول می‌کند.

مدیر سیاست صوتی (Audio Policy Manager) فهرست زیر از APIهای سیستم را ارائه می‌دهد (مطابق تعریف در AudioManager.java ):

  • setPreferredDeviceForStrategy

    دستگاه مورد نظر برای مسیریابی صوتی را برای یک استراتژی مشخص تنظیم می‌کند. توجه داشته باشید که ممکن است دستگاه مورد نظر در زمان تنظیم در دسترس نباشد، اما پس از در دسترس قرار گرفتن، مورد استفاده قرار می‌گیرد.

  • removePreferredDeviceForStrategy

    دستگاه(های) صوتی ترجیحی که قبلاً با setPreferredDeviceForStrategy یا setPreferredDevicesForStrategy تنظیم شده بودند را حذف می‌کند.

  • getPreferredDeviceForStrategy

    دستگاه ترجیحی برای یک استراتژی صوتی که قبلاً با setPreferredDeviceForStrategy یا setPreferredDevicesForStrategy تنظیم شده است را برمی‌گرداند.

  • setPreferredDevicesForStrategy

    دستگاه‌های ترجیحی را برای یک استراتژی مشخص تنظیم می‌کند.

  • getPreferredDevicesForStrategy

    دستگاه‌های ترجیحی برای یک استراتژی صوتی که قبلاً با setPreferredDeviceForStrategy یا setPreferredDevicesForStrategy تنظیم شده است را برمی‌گرداند.

  • OnPreferredDevicesForStrategyChangedListener

    رابطی را برای اطلاع‌رسانی در مورد تغییرات در دستگاه‌های صوتی ترجیحی که برای یک استراتژی صوتی معین تنظیم شده‌اند، تعریف می‌کند.

  • addOnPreferredDevicesForStrategyChangedListener

    یک شنونده اضافه می‌کند تا از تغییرات دستگاه صوتی مورد نظر استراتژی مطلع شود.

  • removeOnPreferredDevicesForStrategyChangedListener

    شنونده‌ای که قبلاً به تغییرات دستگاه صوتی مورد نظر استراتژی اضافه شده است را حذف می‌کند.

گزارش قابلیت‌های دستگاه

به عنوان بخشی از پیاده‌سازی Audio HAL، فروشندگان APIهایی را پیاده‌سازی می‌کنند که از گزارش قابلیت‌های دستگاه پشتیبانی می‌کنند. این بخش انواع داده‌ها و روش‌های مورد استفاده برای گزارش قابلیت‌های دستگاه را توضیح می‌دهد و برخی از تغییرات ایجاد شده در 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;
};

در audio 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 قدیمی، ساختار جدیدی به نام audio_port_v7 اضافه کرده است. برای جزئیات بیشتر به کد منبع مراجعه کنید.

به دلیل اضافه شدن audio_port_v7 ، نسخه ۳.۲ از API قدیمی، یک API جدید به نام get_audio_port_v7 اضافه می‌کند تا با استفاده از ساختار audio_port_v7 قابلیت‌های دستگاه‌ها را جستجو کند.

کد زیر از audio.h تعریف API 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 قدیمی get_audio_port باید در فرمت جدید AudioPort قرار داده شوند، زمانی که نسخه API قدیمی پایین‌تر از ۳.۲ و نسخه 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 (مجموعه تست سرویس‌های موبایل گوگل) از Audio Manager ارائه می‌دهد.

آزمایش‌های CTS

تست‌های CTS در android.media.cts.AudioManagerTest قرار دارند.

لیست تست‌های موجود برای Audio Manager به شرح زیر است:

  • AudioManagerTest#testGetDevices

    قابلیت‌های دقیق دستگاه صوتی را تأیید می‌کند. همچنین تأیید می‌کند که پروفایل‌های صوتی برگردانده شده در ساختار AudioDeviceInfo ، محتوای فرمت آرایه مسطح قدیمی‌تر را حفظ می‌کنند، اما در قالب جدید AudioProfile هستند.

  • AudioManagerTest#testPreferredDevicesForStrategy and AudioManagerTest#testPreferredDeviceForCapturePreset

    تأیید کنید که دستگاه‌های ترجیحی برای استراتژی و ضبط، تست‌های API مرتبط از پیش تعیین‌شده با موفقیت انجام شوند.

تست‌های GTS

تست‌های GTS در com.google.android.gts.audioservice.AudioServiceHostTest قرار دارند.

برای تأیید صحت عملکرد APIهای دستگاه‌های ترجیحی برای strategy و capture preset، تست‌های AudioServiceHostTest#testPreferredDeviceRouting و AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset را اجرا کنید.