השוואה בין AIDL ל-HIDL Audio HAL

החל מ-Android 14, מומלץ לשותפים ולספקי SoC להחליף את ההטמעה הנוכחית של HIDL HAL בהטמעה של AIDL HAL.

כדי להקל על המעבר מ-HIDL Audio HAL ל-AIDL Audio HAL, ריכזנו בעמוד הזה את ההבדלים העיקריים בין השניים. בדף הזה מוצג גם המיפוי בין ממשקי ה-AIDL וה-HIDL עבור Audio 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. פרמטרים שקשורים ל-Bluetooth synchronous connection oriented (BT SCO) ול-Hands-Free Profile (HFP) מטופלים על ידי ממשק IBluetooth ייעודי. ממשק ייעודי ITelephony מספק אמצעי בקרה ספציפיים לטלפוניה. אפשר לאחזר מופעים של שני הממשקים האלה מהמופע הראשי של הממשק IModule. מידע נוסף זמין בטבלאות ההשוואה בנושא Core HAL ופונקציונליות שקשורה לתכונות.

  • ההגדרה IDevicesFactory הוסרה ב-AIDL Audio HAL כדי למנוע כפילות. מודולי HAL (כלומר, מופעי ממשק IModule) רשומים עכשיו ישירות ב-Service Manager באמצעות השמות שלהם כשמות מופעים, כמו bluetooth או r_submix. החריג היחיד הוא המודול primary שנרשם תחת שם המופע default.

מיפוי של AIDL ו-HIDL Audio HAL

בטבלאות שבקטעים הבאים מוצג המיפוי בין ממשקי HIDL ו-AIDL Audio HAL. מידע נוסף על מבנה הספריות זמין בקובץ ה-README של Audio HAL.

Core HAL

כל ממשקי ה-HIDL נמצאים בחבילה android.hardware.audio@N.M, כאשר N.M מציין את גרסת Major.Minor. כל ממשקי ה-AIDL נמצאים בחבילה android.hardware.audio.core.

ממשקי HIDL API וקובצי תצורה ממשקי 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 מסומנים באמצעות סוגריים זוויתיים.

שיטות ממשק API של HIDL ורכיבים של קובצי תצורה שיטות של ממשק AIDL API
<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 API שיטות של ממשק AIDL API
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 API שיטות של ממשק AIDL API
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 API
<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 מוסר מקובץ ההגדרות כי פריט ההגדרה הזה לא נמצא בשימוש במערכת. בכל המכשירים צריך להפעיל את DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

פונקציונליות שקשורה לתכונות

שיטות של ממשק HIDL API ממשק AIDL API
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 API תגובות
IDevice.initCheck
IDevice.close
מודול ה-HAL מפרסם את עצמו עם ServiceManager רק אם האתחול מצליח. בשלב הזה, היא נחשבת כסופית ואי אפשר לסגור אותה.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
חובה לתמוך בתיקונים, בהשהיה, בהמשך ובניקוי.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
מיושן.

תוספים של ספקים

ב-HIDL API, תוספים של ספקים מוטמעים באמצעות ה-methods‏ getParameters או setParameters מהממשקים IDevice ו-IStream. השיטות האלה מקבלות מחרוזות שרירותיות. ב-AIDL API יש שיטות מקבילות, כמו getVendorParameters או setVendorParameters, שמקבלות מופעים שרירותיים של Parcelable באמצעות אנקפסולציה בתוך ParcelableHolders.

שינויים אחרים

שינויים כלליים אחרים:

  1. כדי לשפר את יכולת הבדיקה של ממשקי HAL API, בגרסת AIDL הוספנו אפשרויות ניפוי באגים שמשמשות לבדיקות VTS וזמינות דרך ModuleDebug parcelable. האפשרויות האלה מנחות את HAL לבצע אמולציה של פונקציונליות מסוימת (לדוגמה, חיבור של מכשירים חיצוניים), שבדרך כלל דורשת התערבות ידנית ושימוש בציוד בדיקה חיצוני.

  2. שירותי HAL נדרשים להפעלה מחדש כשערך מאפיין המערכת sys.audio.restart.hal מוגדר כ-1. ההפעלה מחדש מתבצעת באמצעות audioserver.rc. במהלך ההטמעה של HAL, צריך להשתמש בשם שירות ה-HAL המתאים שמופיע בקובץ audioserver.rc. ב-Android 14, השם vendor.audio-hal-aidl נוסף במיוחד לגרסת ה-AIDL של ה-HAL.

‫Effects HAL

כל ממשקי ה-HIDL נמצאים בחבילה android.hardware.audio.effect@N.M*, כאשר N.M הוא הגרסה של Major.Minor. כל ממשקי ה-AIDL נמצאים בחבילה android.hardware.audio.effect.

ממשקי HIDL API וקובצי תצורה ממשקי 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 מסוג null
IEffectsFactory.getDescriptor IFactory.queryEffects עם פרמטר UUID
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
(same as VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD הוצא משימוש.
ב-AIDL, המעברים בין מצב offload למצב non-offload מטופלים ב-framework.
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