بدءًا من 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.
- يحلّ AIDL Audio HAL محل - IPrimaryDevice. يرسل إطار العمل تحديثات حول وضع الصوت الحالي وتدوير الشاشة إلى كل مثيل من- IModule. تتعامل واجهة- IBluetoothمخصّصة مع المَعلمات ذات الصلة بالاتصال المتزامن الموجّه عبر البلوتوث (BT SCO) وملف "بدون لمس الجهاز" (HFP). توفّر واجهة- ITelephonyمخصّصة عناصر تحكّم خاصة بالاتصالات الهاتفية. يمكنك استرداد مثيلات كلتا الواجهتين من المثيل الأساسي لواجهة- IModule. لمزيد من المعلومات، راجِع جداول المقارنة في Core HAL والوظائف ذات الصلة بالميزات.
- تتم إزالة - IDevicesFactoryفي AIDL Audio HAL لتجنُّب التكرار. يتم الآن تسجيل وحدات HAL (أي مثيلات واجهة- IModule) مباشرةً في "مدير الخدمات" باستخدام أسماء مثيلات الوحدات، مثل- bluetoothأو- r_submix. الاستثناء الوحيد هو الوحدة- primaryالتي يتم تسجيلها ضمن اسم المثيل- default.
ربط واجهات AIDL وHIDL Audio HAL
تعرض الجداول في الأقسام التالية عملية الربط بين واجهات HIDL وAIDL Audio HAL. راجِع طبقة تجريد الأجهزة الصوتية (HAL) لمزيد من المعلومات حول بنية الدليل.
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 | ITelephonyIBluetooth | 
| IStreamIStreamInIStreamOut | StreamDescriptorIStreamInIStreamCommonIStreamOut | 
| audio_policy_configuration.xmlaudio_policy_engine_configuration.xml | IConfigIModule | 
| ملفات سياسة الصوت القابلة للضبط | استخدِم تنفيذ HIDL لنظام التشغيل Android 14. | 
منافذ الصوت والملفات الشخصية الديناميكية والمسارات والتصحيحات
في هذا الجدول، يتم تحديد عناصر ملفات XML باستخدام أقواس زاوية.
| طُرق واجهة برمجة التطبيقات HIDL وعناصر ملفات الإعداد | طُرق واجهة برمجة التطبيقات AIDL | 
|---|---|
| <attachedDevices><defaultOutputDevice><mixPorts><devicePorts> | IModule.getAudioPorts | 
| IDevice.getAudioPortIDevice.setConnectedState | IModule.connectExternalDeviceIModule.disconnectExternalDevice | 
| IStream.getSupportedProfiles | IModule.connectExternalDevice | 
| < routes> | IModule.getAudioRoutes | 
| IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesمواصفات الجهاز في IDevice.openInputStreamIDevice.openOutputStream | IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch | 
إعدادات منافذ الصوت وعمليات البث
| طُرق واجهة برمجة التطبيقات HIDL | طُرق واجهة برمجة التطبيقات AIDL | 
|---|---|
| IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource | IModule.getAudioPortConfigsIModule.setAudioPortConfig | 
| IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer | IModule.openInputStreamIModule.openOutputStream | 
| IStream.close | IStreamCommon.close | 
| IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata | IStreamIn.updateMetadataIStreamOut.updateMetadata | 
| IStream.standby | StreamDescriptor.Command.standby | 
| IStream.pauseIStream.resume | StreamDescriptor.Command.pause.start | 
|  IStream.startIStream.stop(ساحات مشاركات MMAP) |  StreamDescriptor.Command.startأو.burst.pause(الإدخال) و/أو.flush(الإخراج) | 
| IStreamOut.drainIStreamOut.flush | StreamDescriptor.Command.drain.flush | 
| IStreamOut.setCallbackIStreamOut.clearCallback | IModule.openOutputStreamIStreamCommon.close | 
|  IStreamOut.getPresentationPositionوIStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost | StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames | 
| IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount | تشكّل IModule.setAudioPatchووقت الاستجابة الاسمي والحد الأدنى لحجم المخزن المؤقت جزءًا من بنيةAudioPatchالتي تعرضها طبقة HAL.
      يشكّل حجم المخزن المؤقت الفعلي في اللقطات جزءًا من بنيةStreamDescriptor، بالإضافة إلى حجم اللقطة بالبايت. يمكن حساب حجم المخزن المؤقت بالبايت من خلال ضرب هذين الرقمين. | 
ربط المؤثرات الصوتية
| طُرق واجهة برمجة التطبيقات HIDL | طُرق واجهة برمجة التطبيقات AIDL | 
|---|---|
| IDevice.addDeviceEffectIDevice.removeDeviceEffect | IModule.addDeviceEffectIModule.removeDeviceEffect | 
| IStream.addEffectIStream.removeEffect | IStreamCommon.addEffectIStreamCommon.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><call_screen_mode_supported><engine_library> | مفصولتان إلى طريقتَين مختلفتَين: ITelephony.getSupportedAudioModesIConfig.getEngineConfig | 
| <volumes>، أو<volumeGroups>،<ProductStrategies> | IConfig.getEngineConfig | 
| <surroundSound> | IConfig.getSurroundSoundConfig | 
- 
  تتم إزالة speaker_drc_enabledمن ملف الإعدادات لأنّ عنصر الإعدادات هذا غير مستخدَم في النظام. يجب تفعيل ميزة "التحكّم الديناميكي في النطاق" على جميع الأجهزة. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
الوظائف المتعلّقة بالميزة
| طُرق واجهة برمجة التطبيقات HIDL | واجهة برمجة تطبيقات AIDL | 
|---|---|
| IDevice.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute | IModule.\* | 
| IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume | ITelephony.TelecomConfig.\* | 
| IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume | IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* | 
| IPrimaryDevice.setModeIPrimaryDevice.updateRotation | ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation | 
| IDevice.setScreenStateIDevice.getMicrophones | IModule.updateScreenStateIModule.getMicrophones | 
| IDevice.getHwAvSyncIStream.setHwAvSync | IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId | 
| IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
| IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes | IStreamOut.\* | 
| IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback | IModule.openOutputStream(يتم دمج عمليات معاودة الاتصال فيIStreamOutEventCallback) | 
| IDevice.get/setParametersIStream.get/setParameters | IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters | 
الطرق القديمة
| طُرق واجهة برمجة التطبيقات HIDL | التعليقات | 
|---|---|
| IDevice.initCheckIDevice.close | ينشر وحدة HAL نفسها باستخدام ServiceManagerفقط عند اكتمال عملية التهيئة بنجاح. في هذه الحالة، يُعتبر الحساب مغلقًا نهائيًا ولا يمكن إعادة فتحه. | 
| IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain | يجب توفير إمكانية تطبيق التصحيحات والإيقاف المؤقت والاستئناف والتفريغ. | 
| IStreamOut.getRenderPositionIStreamOut.getNextWriteTimestamp | قديم | 
إضافات المورّدين
في واجهة HIDL API، يتم تنفيذ إضافات المورّد باستخدام الطريقتَين getParameters أو setParameters من الواجهتَين IDevice وIStream. تقبل هذه الطرق سلاسل عشوائية.
في واجهة AIDL API، تتوفّر طرق مماثلة، مثل getVendorParameters أو setVendorParameters، والتي تقبل مثيلات Parcelable عشوائية باستخدام التغليف ضمن ParcelableHolders.
تغييرات أخرى
في ما يلي التغييرات العامة الأخرى:
- لتحسين قابلية اختبار واجهات برمجة تطبيقات HAL، نقدّم في إصدار AIDL خيارات تصحيح الأخطاء التي تستخدمها اختبارات VTS وتتوفّر من خلال النوع - ModuleDebugالقابل للتسلسل. توجّه هذه الخيارات طبقة HAL لمحاكاة وظائف معيّنة (مثل توصيل الأجهزة الخارجية)، والتي تتطلّب عادةً تدخّلاً يدويًا واستخدام معدّات اختبار خارجية.
- عندما يضبط إطار العمل أو مجموعات اختبار VTS السمة - sys.audio.restart.halللنظام على- 1، يجب إعادة تشغيل خدمات HAL. يتولّى الملف- audioserver.rcعملية إعادة التشغيل. أثناء تنفيذ طبقة تجريد الأجهزة (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.queryProcessingIFactory.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_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE | IEffect.setParameter | 
| EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_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.aidlParameter.aidl | 
تعريف "التأثيرات المحدّدة"
| واجهات HIDL API (android.hardware.audio.effect@X.X) | واجهات AIDL API (android.hardware.audio.effect) | 
|---|---|
| I$EffectType$.hal | $EffectType$.aidl | 
