À partir d’Android 14, les partenaires et les fournisseurs de SoC sont encouragés à remplacer l’implémentation HIDL HAL actuelle par une implémentation AIDL HAL.
Pour faciliter une transition en douceur d'un HIDL Audio HAL à un AIDL Audio HAL, certaines des principales différences sont mises en évidence sur cette page. Cette page montre également le mappage entre les interfaces AIDL et HIDL pour l'Audio HAL.
Différence entre l'implémentation AIDL et HIDL Audio HAL
Les principales différences entre la structure HIDL et la structure AIDL sont les suivantes :
Dans AIDL Audio Core HAL , l'interface
IConfig
est introduite en remplacement des paramètres à l'échelle du système dans les fichiers XML dans HIDL HAL. Le framework lit ces paramètres à partir du Core HAL au lieu du fichier de configuration du fournisseur. À titre d'exemple, la liste des formats Surround présentés pour le contrôle de l'utilisateur est fournie par la méthodeIConfig.getSurroundSoundConfig
dans Core HAL.Dans AIDL Audio Effects HAL , la logique
effectProxy
définie dans les fichiers XML dans HIDL Effects HAL est déplacée vers le framework audio. Le framework audio interroge toutes les instances d'effets du système à l'aideIFactory.queryEffects
et tous les traitements d'effets à l'aide deIFactory.queryProcessing
.Pour éviter toute confusion avec l'utilisation du terme périphérique pour les types de périphériques audio,
IDevice
dans HIDL Audio HAL est renomméIModule
dans AIDL Audio HAL.IPrimaryDevice
est remplacé dans AIDL Audio HAL. Des mises à jour sur le mode audio actuel et la rotation de l'écran sont envoyées à chaque instanceIModule
. Les paramètres liés à la connexion Bluetooth synchrone orientée (BT SCO) et au profil mains libres (HFP) sont gérés par une interfaceIBluetooth
dédiée. Une interfaceITelephony
dédiée fournit des commandes spécifiques à la téléphonie. Les instances de ces deux interfaces peuvent être récupérées à partir de l'instance principale de l'interfaceIModule
. Consultez les tableaux de comparaison sur les fonctionnalités liées à Core HAL et aux fonctionnalités pour plus d’informations.IDevicesFactory
est supprimé dans AIDL Audio HAL pour éviter la redondance. Les modules HAL (c'est-à-dire les instances d'interfaceIModule
) sont désormais enregistrés directement auprès du gestionnaire de services en utilisant leurs noms, par exemple,bluetooth
our_submix
. La seule exception est le moduleprimary
qui s'enregistre sous le nom d'instancedefault
.
Mappage audio HAL AIDL et HIDL
Les tableaux des sections suivantes montrent le mappage entre les interfaces HIDL et AIDL Audio HAL. Voir le fichier Audio HAL README pour plus d'informations sur la structure des répertoires.
HAL de base
Toutes les interfaces HIDL se trouvent dans le package android.hardware.audio@NM
, où NM
désigne la version Major.Minor . Toutes les interfaces AIDL se trouvent dans le package android.hardware.audio.core
.
Interfaces API HIDL et fichiers de configuration | Interfaces API AIDL |
---|---|
IDevicesFactory | Enregistrement d' IModule auprès de ServiceManager . |
IDevice | IModule |
IPrimaryDevice | ITelephony IBluetooth |
IStream IStreamIn IStreamOut | StreamDescriptor IStreamIn IStreamCommon IStreamOut |
audio_policy_configuration.xml audio_policy_engine_configuration.xml | IConfig IModule |
Fichiers de stratégie audio configurables | Utilisez l'implémentation HIDL pour Android 14. |
Ports audio, profils dynamiques, routes et correctifs
Dans ce tableau, les éléments des fichiers XML sont désignés par des chevrons.
Méthodes d'interface API HIDL et éléments des fichiers de configuration | Méthodes d'interface API AIDL |
---|---|
<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 Spécification de l'appareil dans IDevice.openInputStream IDevice.openOutputStream | IModule.setAudioPatch IModule.setAudioPortConfig IModule.resetAudioPatch |
Configurations et flux de ports audio
Méthodes d'interface API HIDL | Méthodes d'interface API 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 et 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 , la latence nominale et la taille minimale du tampon font partie de la structure AudioPatch renvoyée par HAL. La taille réelle du tampon en trames fait partie de la structure StreamDescriptor , avec la taille de trame en octets. La taille du tampon en octets peut être calculée en multipliant ces deux nombres. |
Connexion des effets audio
Méthodes d'interface API HIDL | Méthodes d'interface API AIDL |
---|---|
IDevice.addDeviceEffect IDevice.removeDeviceEffect | IModule.addDeviceEffect IModule.removeDeviceEffect |
IStream.addEffect IStream.removeEffect | IStreamCommon.addEffect IStreamCommon.removeEffect |
Configuration à l'échelle du système
La configuration à l'échelle du système qui a été précédemment définie dans les fichiers de configuration XML de politique audio (à savoir audio_policy_configuration.xml
et audio_policy_engine_configuration.xml
) doit être fournie via IConfig
. Toutefois, pour faciliter la transition vers AIDL, les fournisseurs ont toujours la possibilité d'utiliser les mêmes fichiers XML qu'ils utilisaient auparavant pour définir la configuration à l'échelle du système. L'implémentation de référence pour IConfig
contient le code nécessaire pour représenter les informations du fichier XML à l'aide des types de données AIDL, ce qui facilite la conversion de XML en AIDL.
Éléments du fichier de configuration HIDL | Méthodes d'interface API AIDL |
---|---|
<globalConfiguration> <speaker_drc_enabled> <call_screen_mode_supported> <engine_library> | Séparé en deux méthodes différentes :ITelephony.getSupportedAudioModes IConfig.getEngineConfig |
<volumes> , OU<volumeGroups> , <ProductStrategies> | IConfig.getEngineConfig |
<surroundSound> | IConfig.getSurroundSoundConfig |
speaker_drc_enabled
est supprimé du fichier de configuration car cet élément de configuration n'est pas utilisé dans le système. Tous les appareils doivent avoir DRC activé.
Fonctionnalité liée aux fonctionnalités
Méthodes d'interface API HIDL | Interface API 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 (les rappels sont combinés dans IStreamOutEventCallback ) |
IDevice.get/setParameters IStream.get/setParameters | IModule.get/setVendorParameters IStreamCommon.get/setVendorParameters |
Méthodes obsolètes
Méthodes d'interface API HIDL | commentaires |
---|---|
IDevice.initCheck IDevice.close | Le module HAL se publie avec le ServiceManager uniquement en cas d'initialisation réussie. À ce stade, il est considéré comme permanent et ne peut être fermé. |
IDevice.supportsAudioPatches IStreamOut.supportsPauseAndResume IStreamOut.supportsDrain | La prise en charge des correctifs, de la pause, de la reprise et de la vidange est obligatoire. |
IStreamOut.getRenderPosition IStreamOut.getNextWriteTimestamp | Obsolète. |
Extensions de fournisseur
Dans l'API HIDL, les extensions de fournisseur sont implémentées à l'aide des méthodes getParameters
ou setParameters
des interfaces IDevice
et IStream
. Ces méthodes acceptent des chaînes arbitraires. Dans l'API AIDL, il existe des méthodes correspondantes, telles que getVendorParameters
ou setVendorParameters
, qui prennent des instances Parcelable
arbitraires en utilisant l'encapsulation dans ParcelableHolders
.
Autres changements
Les autres changements généraux sont les suivants :
Pour améliorer la testabilité des API HAL, dans la version AIDL, nous introduisons des options de débogage qui sont utilisées par les tests VTS et sont disponibles via le colisable
ModuleDebug
. Ces options demandent au HAL d'émuler certaines fonctionnalités (par exemple, la connexion de périphériques externes), qui autrement nécessitent une intervention manuelle et l'utilisation d'un équipement de test externe.Les services HAL doivent redémarrer lorsque la valeur de la propriété système
sys.audio.restart.hal
est définie sur1
. Le redémarrage s'effectue viaaudioserver.rc
. Lors de l'implémentation de HAL, utilisez le nom de service HAL approprié répertorié dans le fichieraudioserver.rc
. Dans Android 14, le nomvendor.audio-hal-aidl
est ajouté spécifiquement pour la version AIDL de HAL.
Effets HAL
Toutes les interfaces HIDL se trouvent dans le package android.hardware.audio.effect@NM*
, où NM
est la version Major.Minor . Toutes les interfaces AIDL se trouvent dans le package android.hardware.audio.effect
.
Interfaces API HIDL et fichiers de configuration | Interfaces API AIDL |
---|---|
IEffectsFactory | IFactory |
IEffect | IEffect |
audio_effects.xml | IEffect |
Usine d'effets
Interfaces API HIDL (android.hardware.audio.effect@XX) | Interfaces API AIDL (android.hardware.audio.effect) |
---|---|
IEffectsFactory.getAllDescriptors | IFactory.queryEffects avec paramètre UUID nul |
IEffectsFactory.getDescriptor | IFactory.queryEffects avec le paramètre UUID |
IEffectsFactory.createEffect | IFactory.createEffect |
audio_effects.xml | IFactory.queryProcessing IFactory.queryEffects |
Interfaces d'effets
Interfaces API HIDL (android.hardware.audio.effect@XX) | Interfaces API AIDL (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 | Mapper vers IEffect.command ,IEffect.setParameter , ouIEffect.getParameter basé sur le type de commande HIDL héritée |
N / A | IEffect.getState |
IEffect.setParameter | IEffect.setParameter |
IEffect.getParameter | IEffect.getParameter |
Commandes d'effet
Interfaces API HIDL (android.hardware.audio.effect@XX) | Interfaces API AIDL (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 | Obsolète dans Effects AIDL HAL |
EFFECT_CMD_SET_PARAM_COMMIT | Obsolète dans 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 (identique à VISUALIZER_CMD_CAPTURE ) | IEffect.getParameter |
EFFECT_CMD_OFFLOAD | Obsolète. Dans AIDL, les commutateurs de mode de déchargement et de non-déchargement sont gérés dans le framework. |
EFFECT_CMD_DUMP | Géré par la transaction de classeur intégrée AIBinder_dump . |
Définition des paramètres d'effet communs
HIDL définition (android.hardware.audio.effect@XX) | AIDL définition |
---|---|
Types.hal | Flags.aidl Parameter.aidl |
Définition des effets spécifiques
Interfaces API HIDL (android.hardware.audio.effect@XX) | Interfaces API AIDL (android.hardware.audio.effect) |
---|---|
I $EffectType$ .hal | $EffectType$ .aidl |