محدودیت نوع دستگاه

در بخش صوتی اندروید، audio_devices_t برای نمایش نوع دستگاه صوتی استفاده می‌شود. این متغیر به طور گسترده در کد منبع صوتی به عنوان یک فیلد بیتی برای فیلتر کردن یا انتخاب یک یا چند دستگاه مشخص استفاده می‌شود. قبل از اندروید ۱۱، محدودیت ۳۰ نوع دستگاه ورودی/خروجی صوتی وجود داشت و هیچ فضای خالی برای اضافه کردن انواع دستگاه‌های صوتی جدید وجود نداشت. ما محدودیت تعداد انواع دستگاه‌های صوتی را حذف کرده‌ایم تا امکان اضافه کردن انواع دستگاه‌های صوتی جدید فراهم شود.

برای حذف محدودیت تعداد انواع دستگاه‌های صوتی، انواع دستگاه‌های صوتی اکنون به جای ماسک‌های بیتی، مقادیر شمارشی هستند.

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

تولیدکنندگان اصلی تجهیزات (OEM) نباید audio_devices_t به عنوان ماسک بیتی استفاده کنند، زیرا این امر می‌تواند هنگام اضافه شدن انواع دستگاه‌های صوتی شمارش‌شده جدید، نتایج غیرمنتظره‌ای ایجاد کند.

مثال‌ها و منابع

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

  • استفاده از مقدار audio_devices_t برای نمایش چندین دستگاه صوتی.
  • بررسی اینکه آیا مقدار audio_devices_t شامل انواع دستگاه‌های صوتی از یک دسته مشخص شده است یا خیر.

برای نمایش چندین نوع دستگاه صوتی، از کلاسی به نام DeviceTypeSet در فایل /libaudiofoundation/include/media/AudioContainers.h استفاده می‌شود که یک کانتینر std::set از audio_devices_t است. این کلاس در کتابخانه libaudiofoundation که توسط فروشنده در دسترس است، تعریف شده است. برای نمایش چندین نوع دستگاه صوتی در کد C، می‌توان از یک آرایه یا لیستی از audio_devices_t استفاده کرد.

برای بررسی اینکه آیا یک نوع دستگاه واحد از یک دسته مشخص شده است یا خیر، از توابع کمکی audio_is_.*_device در /system/media/audio/include/system/audio.h استفاده کنید. برای حالت چندین نوع دستگاه صوتی، از توابع کمکی در libaudiofoundation استفاده کنید. به عنوان مثال، areAllOfSameDeviceType (DeviceTypeSet, std::function ) استفاده کنید. areAllOfSameDeviceType (DeviceTypeSet, std::function ) در AudioContainers.h برای بررسی اینکه آیا همه انواع دستگاه‌های صوتی داده شده از یک نوع هستند یا خیر.

پیاده‌سازی

تولیدکنندگان تجهیزات اصلی (OEM) باید نمایش فیلد بیتی نوع دستگاه صوتی را از پیاده‌سازی HAL صوتی حذف کنند.

  1. تمام حافظه دستگاه‌ها را در فیلد بیت حذف کنید.

    audio_devices_t نباید برای نمایش چندین نوع دستگاه صوتی استفاده شود. در عوض، از یک لیست یا بردار استفاده کنید.

  2. استفاده از عملیات بیتی برای مقایسه انواع دستگاه‌ها را متوقف کنید.

    قبل از اندروید ۱۱، انواع دستگاه‌های صوتی می‌توانستند به عنوان یک فیلد بیتی استفاده شوند. در این صورت، استفاده از عملیات بیتی برای مقایسه انواع دستگاه‌ها رایج بود. وقتی انواع دستگاه‌های صوتی جدید و شمارشی اضافه می‌شوند، عملیات بیتی ممکن است نتایج غیرمنتظره‌ای ایجاد کند. در عوض، از توابع کمکی به عنوان جایگزین استفاده کنید. اگر یک نوع دستگاه صوتی وجود دارد، از مقایسه مستقیم برای مقایسه دو مقدار استفاده کنید. برای بررسی اینکه آیا نوع دستگاه صوتی از یک دسته مشخص شده است یا خیر، از توابع کمکی در /system/media/audio/include/system/audio.h استفاده کنید. به عنوان مثال، audio_is_output_device(audio_devices_t device) .

  3. استفاده از مقادیر از پیش تعریف شده برای گروه‌هایی از انواع دستگاه‌های صوتی را متوقف کنید.

    تعدادی مقادیر از پیش تعریف شده برای گروه‌هایی از انواع دستگاه‌های صوتی، AUDIO_DEVICE_OUT_ALL ، در system/media/audio/include/system/audio-base-utils.h وجود دارد. همه این مقادیر رزرو شده‌اند اما ممکن است منسوخ شوند زیرا با اضافه شدن انواع دستگاه‌های صوتی شمارشی جدید، صحیح نخواهند بود. گروه‌های جدیدی از انواع دستگاه‌های صوتی در audio-base-utils.h تعریف شده‌اند که آرایه‌هایی از انواع دستگاه‌های صوتی هستند، مانند AUDIO_DEVICE_OUT_ALL_ARRAY .

  4. به جای set_parameters متدهای create_audio_patch() و release_audio_patch() را برای مسیریابی پیاده‌سازی کنید.

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

    در حال حاضر، دو نوع وصله صوتی مورد نیاز است:

    • برای پخش، پچ‌های دستگاه را میکس کنید
    • دستگاهی برای میکس کردن پَچ‌ها، برای ضبط

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

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

    اگر از یک HAL صوتی قدیمی و بسته‌بندی AOSP HIDL استفاده می‌کنید، HAL صوتی قدیمی باید نسخه اصلی HAL را روی ۳.۰ تنظیم کند.

    برای فعال کردن ویژگی وصله صوتی، HAL صوتی باید نسخه اصلی HAL را روی ۳.۰ یا بالاتر تنظیم کند. برای اطلاعات بیشتر به Device::supportsAudioPatches() در پیاده‌سازی پیش‌فرض HIDL مراجعه کنید، که می‌توانید آن را در HAL صوتی برای ماهی مرکب نیز پیدا کنید.

سفارشی‌سازی

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

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

اگر انواع جدیدی از دستگاه‌های صوتی اضافه شوند و تولیدکنندگان اصلی تجهیزات (OEM) بخواهند از آنها استفاده کنند، باید پیاده‌سازی HAL صوتی خود را ارتقا داده و به نسخه HIDL 6.0 یا بالاتر منتقل شوند. ارتقاء نسخه اصلی HAL به 3.0 و پیاده‌سازی متدهای create_audio_patch و release_audio_patch الزامی است، زیرا استفاده از set_parameters برای مسیریابی جریان می‌تواند هنگام اضافه شدن انواع جدید دستگاه‌های صوتی، نتایج غیرمنتظره‌ای ایجاد کند.

اعتبارسنجی

کار مورد نیاز برای تولیدکنندگان اصلی تجهیزات (OEM) به‌روزرسانی پیاده‌سازی‌های HAL خود است. VTS برای HAL صوتی می‌تواند برای اعتبارسنجی اینکه آیا پیاده‌سازی طبق انتظار کار می‌کند یا خیر، استفاده شود. تمام آزمایش‌ها را می‌توان در فایل‌های VTS یافت.