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

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

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

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

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

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

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

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

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

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

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

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

برای پشتیبانی از چندین پروفایل صوتی، نسخه 3.2 API قدیمی ساختار جدیدی به نام 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);

زمانی که نسخه API قدیمی کمتر از 3.2 و نسخه HIDL HAL 7 یا بالاتر باشد، داده‌های دریافت API قدیمی get_audio_port باید در قالب AudioPort جدید پر شوند. در این مورد، تمام نرخ‌های نمونه گزارش‌شده و ماسک‌های کانال از 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 (مجموعه تست خدمات تلفن همراه Google) مدیر صوتی ارائه می‌دهد.

تست های CTS

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

در زیر لیستی از تست های مدیریت صوتی موجود است:

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy and AudioManagerTest#testPreferredDeviceForCapturePreset

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

تست های GTS

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

برای تأیید اینکه آیا APIهای دستگاه های ترجیحی برای استراتژی و ضبط از پیش تعیین شده به درستی کار می کنند، تست های AudioServiceHostTest#testPreferredDeviceRouting و AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset را اجرا کنید.