השוואה בין 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. ה-framework קורא את הפרמטרים האלה מ-HAL הליבה במקום מקובץ התצורה של הספק. לדוגמה, רשימת הפורמטים של סראונד שמוצגים לשליטת המשתמש מסופקת על ידי השיטה IConfig.getSurroundSoundConfig ב-HAL של הליבה.

    ב-AIDL Audio Effects HAL, הלוגיקה של effectProxy שמוגדרת בקובצי XML ב-HIDL Effects HAL מועברת למסגרת האודיו. ה-framework של האודיו שולח שאילתה על כל המופעים של האפקטים במערכת באמצעות IFactory.queryEffects, ועל כל עיבודי האפקטים באמצעות IFactory.queryProcessing.

  • כדי למנוע בלבול עם השימוש במונח device (מכשיר) לגבי סוגי מכשירי אודיו, השם של IDevice ב-HIDL Audio HAL השתנה ל-IModule ב-AIDL Audio HAL.

  • IPrimaryDevice מוחלף ב-AIDL Audio HAL. עדכונים לגבי מצב האודיו הנוכחי וסיבוב המסך נשלחים לכל מכונה של IModule. הפרמטרים שקשורים ל-Bluetooth משולב (BT SCO) ולפרופיל דיבורית (HFP) מטופלים על ידי ממשק IBluetooth ייעודי. ממשק ITelephony ייעודי מספק אמצעי בקרה ספציפיים לטלפוניה. אפשר לאחזר מופעים של שני הממשקים האלה מהמכונה הראשית של הממשק IModule. מידע נוסף זמין בטבלאות ההשוואה Core HAL ובפונקציונליות שקשורה לתכונות.

  • IDevicesFactory הוסר ב-HAL של אודיו ב-AIDL כדי למנוע יתירות. מודולים עם 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 מסומנים באמצעות סוגריים משולשים.

שיטות ממשק של HIDL API ורכיבים של קובצי תצורה שיטות ממשק של 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, והן זמינות דרך ה-parcelable‏ ModuleDebug. האפשרויות האלה מורות ל-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 עם פרמטר null UUID
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
(זהה ל-VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD הוצא משימוש.
ב-AIDL, המעבר בין המצבים offload ו-non-offload מטופל במסגרת.
EFFECT_CMD_DUMP מטופלת באמצעות עסקת הקישור המובנה 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