HIDL صوتی HAL

در اندروید ۱۳ و پایین‌تر، رابط صوتی HAL با استفاده از HIDL در فایل‌های HIDL HAL (با پسوند .hal ) و طرحواره‌های XSD برای فایل‌های پیکربندی تعریف می‌شود که به شرح زیر نشان داده شده است.

audio_hal

شکل 1. رابط صوتی HAL.

فایل‌های پیکربندی

فایل‌های پیکربندی XML مربوط به سیاست‌های صوتی و جلوه‌های صوتی، بخشی از رابط صوتی HIDL HAL محسوب می‌شوند. این فایل‌ها باید با طرحواره‌های خود مطابقت داشته باشند و این انطباق توسط آزمایش‌های VTS تأیید می‌شود.

به عنوان بخشی از پیاده‌سازی audio HIDL HAL، شما باید یک فایل پیکربندی audio policy ایجاد کنید که توپولوژی صوتی را توصیف کند. قابلیت‌های Audio HAL باید در فایل audio_policy_configuration.xml اعلام شوند تا چارچوب بتواند از آنها استفاده کند.

رابط برنامه‌نویسی کاربردی HIDL HAL صوتی

این بخش هسته، اثرات و APIهای رایج HAL برای HIDL را شرح می‌دهد.

هسته هال

برخی از رابط‌های کلیدی Core HAL، با استفاده از HIDL، به شرح زیر است:

  • IDeviceFactory.hal نقطه ورود به API است.
  • IDevice.hal و IPrimaryDevice.hal حاوی متدهایی مانند setMasterVolume یا openInputStream هستند.
  • جریان‌ها یک‌طرفه هستند و توسط AudioFlinger برای ارسال یا دریافت صدا به/از HAL از طریق IStream.hal ، IStreamOut.hal و IStreamIn.hal استفاده می‌شوند.

جدول زیر محل اجزای مفید Core HAL HIDL را فهرست می‌کند:

جزء اصلی HAL مکان
آخرین نسخه API /hardware/interfaces/audio/6.0
انواع خاص برای آخرین API هسته HAL /hardware/interfaces/audio/6.0/types.hal
طرحواره XSD فایل پیکربندی سیاست صوتی /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

پیاده‌سازی پیش‌فرض Core HAL API ( /hardware/interfaces/audio/core/all-versions/default/ ) یک پوشش پیرامون پیاده‌سازی HAL قبل از Treble با استفاده از کتابخانه‌های اشتراکی قدیمی است. پیاده‌سازی پیش‌فرض همچنین می‌تواند به عنوان یک مرجع هنگام پیاده‌سازی نسخه‌های جدید Audio HALهایی که مستقیماً با درایورهای هسته تعامل دارند، در نظر گرفته شود.

اثرات هال

جدول زیر محل اجزای مفید Effects HAL را با استفاده از HIDL فهرست می‌کند:

اثرات جزء HAL مکان
آخرین نسخه API /hardware/interfaces/audio/effect/6.0/
طرحواره XSD فایل پیکربندی افکت /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

برای اطلاعات بیشتر، به نمونه‌ای از پیاده‌سازی API مربوط به Effects HAL در /hardware/interfaces/audio/effect/all-versions/default/ و بخش Audio Effects مراجعه کنید.

هال مشترک

رابط برنامه‌نویسی کاربردی مشترک HAL با استفاده از HIDL شامل موارد زیر است:

  • تعاریف ( /hardware/interfaces/audio/common/6.0/types.hal ) که توسط APIهای Core و Effect به اشتراک گذاشته شده‌اند.
  • ابزارهای کمکی ( /hardware/interfaces/audio/common/all-versions ) که برای کمک به کدنویسی در برابر APIهای HIDL برای پیاده‌سازی‌ها، کلاینت‌ها و تست‌ها استفاده می‌شوند.

به‌روزرسانی‌های Audio HAL V7

همانطور که در این بخش ذکر شده است، تغییرات قابل توجهی در نسخه ۷ Audio HAL در اندروید ۱۲ وجود دارد. Audio HAL V7 موارد زیر را انجام می‌دهد:

  • مدل‌های داده مورد استفاده توسط چارچوب و HAL را یکپارچه می‌کند.
  • تکرار بین انواع داده HIDL (enums) و طرح XML مورد استفاده برای پیکربندی سیاست صوتی را به حداقل می‌رساند.

به طور خاص، تغییراتی در زمینه‌های زیر در Audio HAL V7 ایجاد شده است:

این تغییرات در بخش‌های مربوط به خود با جزئیات بیشتری مورد بحث قرار گرفته‌اند.

شمارش‌ها

با شروع از Audio HAL V7، انواع شمارشی مورد استفاده در فایل پیکربندی سیاست صوتی فقط در طرحواره XSD تعریف می‌شوند و نه در HIDL.

در Audio HAL نسخه ۶، مقادیر انواع شمارشی (مانند AudioFormat ) در types.hal نیز در فایل پیکربندی سیاست صوتی XSD schema تعریف شده‌اند و باعث ایجاد یک تکرار می‌شوند. برای جلوگیری از این امر در نسخه ۷، انواع شمارشی به string تغییر یافته و تمام مقادیر شمارشی ممکن در طرح XSD فهرست شده‌اند.

شکل ۲ برخی از تغییرات در نوع شمارشی AudioFormat در نسخه ۷ را مقایسه می‌کند:

audioformat-change

شکل ۲. مقایسه برخی از تغییرات اعمال شده در شمارش AudioFormat.

برای مشاهده‌ی انواع enum که به string تبدیل شده‌اند، به لیست زیر مراجعه کنید:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : قابل توسعه توسط فروشنده
  • AudioFormat : قابل توسعه توسط فروشنده
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

مقادیر رشته‌ای enum را ارسال کنید

مقادیر رشته‌ای برای انتقال اطلاعات به عنوان مقادیر شمارشی در مرز رابط HAL استفاده می‌شوند. هم چارچوب و هم بسته‌بندی HAL از مقادیر شمارشی صحیح برای پیاده‌سازی منطق کسب‌وکار استفاده می‌کنند و از رویکرد تبدیل نشان داده شده در شکل 3 استفاده می‌کنند:

audio-passing-values

شکل ۳. ارسال مقادیر رشته‌ای enum.

به عنوان مثال، برای ارسال مقداری از نوع فرمت صوتی از چارچوب به فروشنده:

  1. مقدار شمارشی AudioFormat به یک مقدار رشته‌ای در libaudiohal تبدیل شده و به HAL منتقل می‌شود.
  2. در سمت HAL، بسته‌بندی پیش‌فرض، رشته را به یک مقدار شمارشی تبدیل می‌کند که به HAL قدیمی منتقل می‌شود.

تغییرات طرحواره XML

داشتن لیست‌های کامل از مقادیر شمارشی در تعریف طرحواره XML (XSD) امکان اعتبارسنجی بهتر فایل XML پیکربندی سیاست صوتی توسط VTS را فراهم می‌کند. ما تغییراتی در فایل پیکربندی سیاست صوتی مورد استفاده با HAL V7 ایجاد کرده‌ایم تا با XSD مطابقت داشته باشد.

در نسخه ۷، به جای نمادهای , (کاما) و | (نوار عمودی) که در نسخه ۶ و پایین‌تر استفاده می‌شوند، از یک کاراکتر استاندارد (فاصله) برای جدا کردن لیست مقادیر در ویژگی‌ها (مانند نرخ نمونه‌برداری، ماسک‌های کانال و پرچم‌ها) استفاده می‌شود. همانطور که در مثال زیر مشاهده می‌شود، از یک فاصله برای جدا کردن لیست مقادیر برای channelMasks استفاده شده است:

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

برای ایجاد تغییرات نماد، از یک اسکریپت تبدیل خودکار به نام update_audio_policy_config.sh استفاده کنید. برای تبدیل فایل پیکربندی خط‌مشی صوتی V6 به نسخه V7 برای دستگاه Pixel 5 (Redfin) به دستور زیر مراجعه کنید:

hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0

انواع داده

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

برای مثال، در نسخه ۶ و پایین‌تر، اغلب از سه‌گانه <format, sampling rate, channel mask> در رابط‌ها و انواع HIDL استفاده می‌شود. برای حذف این افزونگی، در نسخه ۷، نوع داده AudioConfigBase و سایر انواع داده به صورت زیر تعریف شده‌اند:

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    استفاده شده توسط AudioConfig ، AudioOffloadInfo ، AudioPortConfig

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    جایگزین مجموعه‌های آزاد در AudioPort/PortConfig می‌شود.

  • AudioPortExtendedInfo := device | mix | session

    جایگزین unionها در AudioPort/PortConfig می‌شود.

برچسب‌های فروشنده

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

برای پخش و ضبط فراداده‌های آهنگ، فروشندگان می‌توانند برچسب‌های خود را که برای افزودن ویژگی‌ها به جریان‌های ورودی/خروجی صوتی استفاده می‌شوند، از برنامه‌ها به HAL منتقل کنند.

تگ‌های فروشنده برای فراداده‌های آهنگ پخش‌شده، همانطور که در مثال زیر مشاهده می‌شود، اضافه می‌شوند:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

ساختار RecordTrackMetadata با افزودن تگ‌های مخصوص متادیتای آهنگ ضبط، به روشی مشابه پیاده‌سازی می‌شود.

فضای نام افزونه‌های فروشنده

از نسخه ۷ به بعد HAL، افزونه‌های فروشنده به یک پیشوند اضافی {vendor} نیاز دارند که در نسخه ۶ لازم نیست. برای اینکه پیشوند {vendor} معتبر باشد، باید سه یا چند کاراکتر الفبایی-عددی داشته باشد.

از فرمت زیر در V7 استفاده کنید:

VX_{ vendor }_{ letters/numbers }

در زیر چند نمونه از افزونه‌های معتبر فروشندگان V7 آمده است:

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

اطلاعات نسخه

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

نسخه اندروید نسخه HIDL HAL
اندروید ۱۳ ۷.۱
اندروید ۱۲ ۷.۰
اندروید ۱۱ ۶.۰
اندروید ۱۰ ۵.۰
اندروید ۹ ۴.۰
اندروید ۸ ۲.۰