HAL صوتی

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

لایه انتزاعی سخت افزار صوتی اندروید (HAL) APIهای فریمورک سطح بالاتر و مخصوص صدا در android.media را به درایورهای صوتی و سخت افزار زیرین متصل می کند. Audio HAL رابط استانداردی را که سرویس های صوتی به آن فراخوانی می کنند، تعریف می کند. برای اینکه سخت افزار صوتی به درستی کار کند باید اجرا شود.

این صفحه یک نمای کلی از HAL صوتی و جزئیات API و الزامات پیاده سازی آن را ارائه می دهد.

رابط صوتی HAL

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

audio_hal

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

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

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

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

صوتی HAL API

HAL صوتی شامل APIهای زیر است:

  • هسته HAL
  • اثرات HAL
  • HAL معمولی

هر یک از این API ها در بخش های زیر توضیح داده شده است.

هسته HAL

Core HAL API اصلی است که توسط AudioFlinger برای پخش صدا و کنترل مسیریابی صدا استفاده می شود. برخی از رابط های کلیدی به شرح زیر است:

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

جدول زیر مکان اجزای مفید Core HAL را فهرست می کند.

جزء اصلی HAL محل
آخرین نسخه API /hardware/interfaces/audio/6.0
انواع مخصوص آخرین Core HAL API /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/ ) یک بسته‌بندی حول اجرای Pre-Treble HAL با استفاده از کتابخانه‌های مشترک قدیمی است. پیاده سازی پیش فرض همچنین می تواند به عنوان یک مرجع در هنگام اجرای نسخه های جدید HAL های صوتی که مستقیماً با درایورهای هسته تعامل دارند در نظر گرفته شود.

اثرات HAL

Effects HAL API توسط چارچوب افکت ها برای کنترل جلوه های صوتی استفاده می شود. همچنین می‌توانید جلوه‌های پیش‌پردازش مانند کنترل خودکار بهره و سرکوب نویز را از طریق Effects HAL API پیکربندی کنید.

جدول زیر مکان اجزای مفید Effects HAL را فهرست می کند.

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

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

HAL معمولی

Common HAL کتابخانه ای از انواع داده های رایج است که توسط Core و Effects HAL API ها استفاده می شود. هیچ رابط و هیچ تست VTS مرتبطی ندارد زیرا فقط ساختارهای داده را تعریف می کند. Common HAL API شامل موارد زیر است:

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

الزامات

علاوه بر اجرای HAL صوتی و ایجاد فایل پیکربندی خط مشی صوتی، الزامات HAL زیر باید رعایت شود:

  • اگر ضبط برای Sound Trigger (گرفتن از hotword DSP buffer) توسط یک نمایه ورودی پشتیبانی می‌شود، پیاده‌سازی باید از تعداد جریان‌های فعال در این نمایه مطابق با تعداد جلسات همزمان پشتیبانی شده توسط Sound Trigger HAL پشتیبانی کند.
  • همزمانی تماس صوتی TX و ضبط از پردازنده برنامه همانطور که در صفحه ضبط همزمان توضیح داده شده است.

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

به منظور رسیدگی به مشکلات سازگاری با عقب، AIDL پایدار برای همه تغییرات HAL از Android 13 اجباری است. برای پشتیبانی و بهبود پذیرش AIDL در Android 13 و بالاتر، Audio HAL V7 کارهای زیر را انجام می‌دهد:

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

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

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

شمارش ها

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

در صوتی HAL V6، مقادیر انواع enum (مانند AudioFormat ) در types.hal نیز در طرحواره پیکربندی خط مشی صوتی فایل XSD تعریف شده است و یک تکرار ایجاد می کند. برای جلوگیری از این امر در V7، انواع enum به string تغییر می کنند و به جای آن همه مقادیر شمارش ممکن در طرح XSD فهرست می شوند.

برای مقایسه برخی از تغییرات نوع Enum AudioFormat در V7 به شکل 2 مراجعه کنید.

audioformat-change

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

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

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

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

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

audio-passing-values

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

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

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

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

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

در ، به جای , (کاما) و | (نوار عمودی) نمادهای مورد استفاده در V6 و پایین تر. همانطور که در مثال زیر مشاهده می شود، از یک فاصله برای محدود کردن لیست مقادیر 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 مانند اتحادیه های امن استفاده می کنند.

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

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

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

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

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

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

  • AudioPortExtendedInfo := device | mix | session

    اتحادیه ها را در AudioPort/PortConfig جایگزین می کند

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

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

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

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

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

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

فاصله نام پسوندهای فروشنده

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

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

VX_{ vendor }_{ letters/numbers }

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

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

اطلاعات نسخه

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

نسخه اندروید نسخه HAL
اندروید 13 7.1
اندروید 12 7.0
اندروید 11 6.0
اندروید 10 5.0
اندروید 9 4.0
اندروید 8 2.0