مقارنة بين AIDL وHIDL Audio HAL

بدءًا من Android 14، ننصح الشركاء ومورّدي شرائح النظام على الرقاقة (SoC) باستبدال عملية التنفيذ الحالية لطبقة تجريد الأجهزة (HAL) المستندة إلى لغة تعريف واجهة HIDL بعملية تنفيذ لطبقة تجريد الأجهزة (HAL) المستندة إلى لغة تعريف واجهة AIDL.

لتسهيل الانتقال السلس من HIDL Audio HAL إلى AIDL Audio HAL، تم توضيح بعض الاختلافات الرئيسية في هذه الصفحة. تعرض هذه الصفحة أيضًا عملية الربط بين واجهات AIDL وHIDL الخاصة بطبقة تجريد الأجهزة (HAL) الصوتية.

الفرق بين تنفيذ AIDL وHIDL Audio HAL

في ما يلي الاختلافات الرئيسية بين بنية HIDL وبنية AIDL:

  • في AIDL Audio Core HAL، تم تقديم واجهة IConfig كبديل للمعلمات على مستوى النظام في ملفات XML في HIDL HAL. يقرأ إطار العمل هذه المَعلمات من Core HAL بدلاً من ملف إعدادات المورّد. على سبيل المثال، يتم توفير قائمة تنسيقات الصوت المحيطي التي تظهر للمستخدم ليتحكّم بها من خلال طريقة IConfig.getSurroundSoundConfig في Core HAL.

    في AIDL Audio Effects HAL، تم نقل منطق effectProxy المحدّد في ملفات XML في HIDL Effects HAL إلى إطار عمل الصوت. يستعلم إطار عمل الصوت عن جميع مثيلات التأثير في النظام باستخدام IFactory.queryEffects، وعن جميع عمليات معالجة التأثيرات باستخدام IFactory.queryProcessing.

  • لتجنُّب الخلط بين استخدام مصطلح الجهاز لأنواع أجهزة الصوت، تمت إعادة تسمية IDevice في HIDL Audio HAL إلى IModule في AIDL Audio HAL.

  • يتم استبدال IPrimaryDevice في AIDL Audio HAL. يتم إرسال التحديثات المتعلقة بوضع الصوت الحالي وتدوير الشاشة إلى كل مثيل من IModule. تتم معالجة المَعلمات ذات الصلة باتصال البلوتوث المتزامن الموجّه (BT SCO) وملف تعريف بدون لمس الجهاز (HFP) من خلال واجهة IBluetooth مخصّصة. توفّر واجهة ITelephony عناصر تحكّم خاصة بالهاتف. يمكن استرداد مثيلات كلتا الواجهتين من المثيل الأساسي لواجهة IModule. لمزيد من المعلومات، راجِع جداول المقارنة في Core HAL والوظائف ذات الصلة بالميزات.

  • تتم إزالة IDevicesFactory في AIDL Audio HAL لتجنُّب التكرار. يتم الآن تسجيل وحدات HAL (أي مثيلات واجهة IModule) مباشرةً في "مدير الخدمات" باستخدام أسمائها كأسماء مثيلات، مثل bluetooth أو r_submix. الاستثناء الوحيد هو الوحدة primary التي يتم تسجيلها ضمن اسم المثيل default.

ربط واجهات AIDL وHIDL Audio HAL

تعرض الجداول في الأقسام التالية عملية الربط بين واجهات HIDL وAIDL Audio HAL. راجِع ملف README الخاص بطبقة تجريد الأجهزة الصوتية للحصول على مزيد من المعلومات عن بنية الدليل.

Core HAL

تتوفّر جميع واجهات HIDL ضمن الحزمة android.hardware.audio@N.M، حيث يشير N.M إلى الإصدار Major.Minor. تتوفّر جميع واجهات AIDL ضمن حزمة android.hardware.audio.core.

واجهات برمجة التطبيقات وملفات الإعداد في HIDL واجهات AIDL API
IDevicesFactory تسجيل IModule باستخدام ServiceManager
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
ملفات سياسة الصوت القابلة للضبط استخدِم تنفيذ HIDL لنظام التشغيل Android 14.

منافذ الصوت والملفات الشخصية الديناميكية والمسارات والتصحيحات

في هذا الجدول، يتم تحديد عناصر ملفات XML باستخدام أقواس زاوية.

طُرق واجهة برمجة التطبيقات HIDL وعناصر ملفات الإعداد طُرق واجهة برمجة التطبيقات AIDL
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
IModule.connectExternalDevice
IModule.disconnectExternalDevice
IStream.getSupportedProfiles IModule.connectExternalDevice
<routes> IModule.getAudioRoutes
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
مواصفات الجهاز في IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

إعدادات منافذ الصوت وعمليات البث

طُرق واجهة برمجة التطبيقات HIDL طُرق واجهة برمجة التطبيقات AIDL
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource
IModule.getAudioPortConfigs
IModule.setAudioPortConfig
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer
IModule.openInputStream
IModule.openOutputStream
IStream.close IStreamCommon.close
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata
IStreamIn.updateMetadata
IStreamOut.updateMetadata
IStream.standby StreamDescriptor.Command.standby
IStream.pause
IStream.resume
IStream.start
IStream.stop
StreamDescriptor.Command.pause
.start
.start
.drain
IStreamOut.drain
IStreamOut.flush
StreamDescriptor.Command.drain
.flush
IStreamOut.setCallback
IStreamOut.clearCallback
IModule.openOutputStream
IStreamCommon.close
IStreamOut.getPresentationPosition وIStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount
تشكّل IModule.setAudioPatch ووقت الاستجابة الاسمي والحد الأدنى لحجم المخزن المؤقت جزءًا من بنية AudioPatch التي تعرضها طبقة HAL. يشكّل حجم المخزن المؤقت الفعلي في اللقطات جزءًا من بنية StreamDescriptor ، بالإضافة إلى حجم اللقطة بالبايت. يمكن حساب حجم المخزن المؤقت بالبايت من خلال ضرب هذين الرقمين.

ربط المؤثرات الصوتية

طُرق واجهة برمجة التطبيقات HIDL طُرق واجهة برمجة التطبيقات AIDL
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

الإعدادات على مستوى النظام

يجب توفير الإعدادات على مستوى النظام التي تم تحديدها سابقًا في ملفات إعداد XML الخاصة بسياسة الصوت (أي audio_policy_configuration.xml وaudio_policy_engine_configuration.xml) من خلال IConfig. ومع ذلك، لتسهيل عملية الانتقال إلى AIDL، يظل بإمكان المورّدين استخدام ملفات XML نفسها التي استخدموها سابقًا لضبط الإعدادات على مستوى النظام. يتضمّن التنفيذ المرجعي IConfig الرمز البرمجي اللازم لتمثيل المعلومات من ملف XML باستخدام أنواع بيانات AIDL، ما يسهّل عملية التحويل من XML إلى AIDL.

عناصر ملف إعداد HIDL طُرق واجهة برمجة التطبيقات AIDL
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
مفصولتان إلى طريقتَين مختلفتَين:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes>، أو
<volumeGroups>، <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. تتم إزالة speaker_drc_enabled من ملف الإعدادات لأنّ عنصر الإعدادات هذا غير مستخدَم في النظام. يجب تفعيل ميزة "التحكّم الديناميكي في النطاق" على جميع الأجهزة. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

الوظائف المتعلّقة بالميزة

طُرق واجهة برمجة التطبيقات HIDL واجهة برمجة تطبيقات AIDL
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute
IModule.\*
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume
ITelephony.TelecomConfig.\*
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\*
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation
IDevice.setScreenState
IDevice.getMicrophones
IModule.updateScreenState
IModule.getMicrophones
IDevice.getHwAvSync
IStream.setHwAvSync
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId
IStreamIn.setGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamIn.setHwGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes
IStreamOut.\*
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback
IModule.openOutputStream (يتم دمج عمليات معاودة الاتصال في IStreamOutEventCallback)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

الطرق القديمة

طُرق واجهة برمجة التطبيقات HIDL التعليقات
IDevice.initCheck
IDevice.close
ينشر وحدة HAL نفسها باستخدام ServiceManager فقط عند اكتمال عملية التهيئة بنجاح. في هذه الحالة، يُعتبر الحساب مغلقًا نهائيًا ولا يمكن إعادة فتحه.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
يجب توفير إمكانية تطبيق التصحيحات والإيقاف المؤقت والاستئناف والتفريغ.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
قديم

إضافات المورّدين

في واجهة HIDL API، يتم تنفيذ إضافات المورّد باستخدام الطريقتَين getParameters أو setParameters من الواجهتَين IDevice وIStream. تقبل هذه الطرق سلاسل عشوائية. في واجهة AIDL API، تتوفّر طرق مماثلة، مثل getVendorParameters أو setVendorParameters، والتي تقبل مثيلات Parcelable عشوائية باستخدام التغليف ضمن ParcelableHolders.

تغييرات أخرى

في ما يلي التغييرات العامة الأخرى:

  1. لتحسين قابلية اختبار واجهات برمجة تطبيقات HAL، نقدّم في إصدار AIDL خيارات تصحيح الأخطاء التي تستخدمها اختبارات VTS وتتوفّر من خلال النوع ModuleDebug القابل للتسلسل. توجّه هذه الخيارات طبقة HAL لمحاكاة وظائف معيّنة (مثل توصيل الأجهزة الخارجية)، والتي تتطلّب عادةً تدخّلاً يدويًا واستخدام معدّات اختبار خارجية.

  2. يجب إعادة تشغيل خدمات HAL عندما يتم ضبط قيمة سمة النظام sys.audio.restart.hal على 1. تتم إعادة التشغيل من خلال audioserver.rc. أثناء تنفيذ طبقة تجريد الأجهزة (HAL)، استخدِم اسم خدمة HAL المناسب المُدرَج في ملف audioserver.rc. في نظام التشغيل Android 14، تتم إضافة الاسم vendor.audio-hal-aidl خصيصًا لإصدار AIDL من HAL.

طبقة تجريد الأجهزة (HAL) الخاصة بالتأثيرات

تتوفّر جميع واجهات HIDL ضمن الحزمة android.hardware.audio.effect@N.M*، حيث يمثّل N.M الإصدار Major.Minor. تتوفّر جميع واجهات AIDL ضمن حزمة android.hardware.audio.effect.

واجهات برمجة التطبيقات وملفات الإعداد في HIDL واجهات AIDL API
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Effect Factory

واجهات HIDL API
(android.hardware.audio.effect@X.X)
واجهات AIDL API
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects مع مَعلمة UUID فارغة
IEffectsFactory.getDescriptor IFactory.queryEffects مع مَعلمة المعرّف الفريد العالمي
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

واجهات المؤثرات

واجهات HIDL API
(android.hardware.audio.effect@X.X)
واجهات AIDL API
(android.hardware.audio.effect)
IEffect.init IEffect.open
IEffect.setConfig IEffect.setParameter
IEffect.enable IEffect.command(CommandId::START)
IEffect.disable IEffect.command(CommandId::STOP)
IEffect.reset IEffect.command(CommandId::RESET)
IEffect.getDescriptor IEffect.getDescriptor
IEffect.command يتم الربط بـ IEffect.command أو
IEffect.setParameter أو
IEffect.getParameter استنادًا إلى نوع أمر HIDL القديم.
لا ينطبق IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

أوامر التأثيرات

واجهات HIDL API
(android.hardware.audio.effect@X.X)
واجهات AIDL API
(android.hardware.audio.effect)
EFFECT_CMD_INIT IEffect.open
EFFECT_CMD_RESET CommandId.RESET
EFFECT_CMD_ENABLE IEffect.command(CommandId::START)
EFFECT_CMD_DISABLE IEffect.command(CommandId::STOP)
EFFECT_CMD_SET_PARAM_DEFERRED تم إيقافها نهائيًا في Effects AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT تم إيقافها نهائيًا في Effects AIDL HAL
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE
IEffect.setParameter
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
(مطابق لـ VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD متوقّف نهائيًا
في AIDL، تتم معالجة عمليات التبديل بين وضعَي "التنفيذ خارج الجهاز" و"التنفيذ داخل الجهاز" في إطار العمل.
EFFECT_CMD_DUMP يتم التعامل معها من خلال معاملة binder المضمّنة AIBinder_dump.

تعريف مَعلمات التأثير الشائعة

تعريف HIDL
(android.hardware.audio.effect@X.X)
تعريف AIDL
Types.hal Flags.aidl
Parameter.aidl

تعريف "التأثيرات المحدّدة"

واجهات HIDL API
(android.hardware.audio.effect@X.X)
واجهات AIDL API
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl