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

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

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

تمام انواع دستگاه های صوتی موجود همانطور که هست حفظ می شوند. AUDIO_DEVICE_BIT_IN همچنان برای تشخیص دستگاه های ورودی یا خروجی استفاده می شود. هنگام اضافه کردن انواع دستگاه های صوتی جدید، آنها مقادیری را در شکاف بین مقادیر موجود برشمرده می شوند.

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

مثال ها و منبع

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

  • استفاده از مقدار 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. استفاده از عملیات بیت را برای مقایسه انواع دستگاه متوقف کنید.

    قبل از اندروید 11، انواع دستگاه های صوتی را می توان به عنوان یک بیت فیلد استفاده کرد. در این مورد، استفاده از عملیات بیت برای مقایسه انواع دستگاه ها معمول است. هنگامی که انواع دستگاه های صوتی جدید و شمارش شده اضافه می شوند، عملیات بیت ممکن است باعث نتایج غیرمنتظره شود. در عوض، از توابع کمکی به عنوان جایگزین استفاده کنید. اگر یک نوع دستگاه صوتی وجود دارد، از مقایسه مستقیم برای مقایسه دو مقدار استفاده کنید. برای بررسی اینکه آیا نوع دستگاه صوتی از یک دسته مشخص شده است، از توابع کمکی در /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. متدهای create_audio_patch() و release_audio_patch() را برای مسیریابی به جای set_parameters پیاده سازی کنید.

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

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

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

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

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

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

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

سفارشی سازی

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

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

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

اعتبار سنجی

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