החל מ-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 מועברת למסגרת האודיו. מסגרת האודיו שולחת שאילתות לכל המופעים של האפקטים במערכת באמצעות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. מידע נוסף זמין בטבלאות ההשוואה בנושא HAL ליבה ובנושא פונקציונליות שקשורה לתכונות.IDevicesFactoryהוסר ב-HAL של אודיו ב-AIDL כדי למנוע יתירות. מודולי HAL (כלומר, מכונות של ממשקIModule) רשומים עכשיו ישירות ב-Service Manager באמצעות השמות שלהם לשמות המכונות, כמוbluetoothאוr_submix. החריג היחיד הוא המודולprimaryשמירשם בשם המכונהdefault.
מיפוי AIDL ו-HIDL Audio HAL
בטבלאות שבקטעים הבאים מוצג המיפוי בין ממשקי ה-HAL של HIDL ו-AIDL ל-Audio. למידע נוסף על מבנה הספרייה, אפשר לעיין בקובץ ה-README של Audio HAL.
Core HAL
כל ממשקי HIDL נמצאים בחבילה android.hardware.audio@N.M, כאשר N.M מציין את גרסת Major.Minor. כל ממשקי ה-AIDL נמצאים בחבילה android.hardware.audio.core.
| ממשקי API וקבצי תצורה של 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 API ורכיבים של קובצי תצורה | שיטות ממשק של AIDL API |
|---|---|
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts> |
IModule.getAudioPorts |
IDevice.getAudioPort
IDevice.setConnectedState |
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><call_screen_mode_supported>
<engine_library> |
מחולקת לשתי שיטות שונות:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes>, או
<volumeGroups>, <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
הערך
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.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.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.initCheckIDevice.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.
שינויים אחרים
שינויים כלליים נוספים:
כדי לשפר את היכולת לבדוק את ממשקי ה-HAL API, בגרסה של AIDL אנחנו משיקים אפשרויות ניפוי באגים שבהן משתמשים בבדיקות VTS, והן זמינות דרך ה-parcelable
ModuleDebug. האפשרויות האלה מורות ל-HAL לדמות פונקציונליות מסוימת (לדוגמה, חיבור של מכשירים חיצוניים), שבמקרה אחר דורשת התערבות ידנית ושימוש בציוד בדיקה חיצוני.שירותי 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.
| ממשקי API וקבצי תצורה של 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 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
(זהה ל- VISUALIZER_CMD_CAPTURE)
| IEffect.getParameter |
EFFECT_CMD_OFFLOAD |
הוצא משימוש.
ב-AIDL, המעבר בין המצבים offload ו-non-offload מטופל במסגרת. |
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 |