À 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 la transition de HIDL Audio HAL vers 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 la couche HAL audio.
Différence entre l'implémentation du HAL audio AIDL et HIDL
Voici les principales différences entre la structure HIDL et la structure AIDL :
Dans AIDL Audio Core HAL, l'interface
IConfigest introduite en remplacement des paramètres à l'échelle du système dans les fichiers XML de HIDL HAL. Le framework lit ces paramètres à partir du HAL Core au lieu du fichier de configuration du fournisseur. Par exemple, la liste des formats surround qui sont proposés à l'utilisateur est fournie par la méthodeIConfig.getSurroundSoundConfigdans Core HAL.Dans AIDL Audio Effects HAL, la logique
effectProxydéfinie dans les fichiers XML de HIDL Effects HAL est déplacée vers le framework audio. Le framework audio interroge toutes les instances d'effet du système à l'aide deIFactory.queryEffectset tous les traitements d'effet à l'aide deIFactory.queryProcessing.Pour éviter toute confusion avec l'utilisation du terme appareil pour les types d'appareils audio,
IDevicedans HIDL Audio HAL est renomméIModuledans AIDL Audio HAL.Le HAL audio AIDL remplace
IPrimaryDevice. Le framework envoie des informations sur le mode audio actuel et la rotation de l'écran à chaque instanceIModule. Une interfaceIBluetoothdédiée gère les paramètres liés à la connexion synchrone Bluetooth (BT SCO) et au profil mains libres (HFP). Une interfaceITelephonydédiée fournit des commandes spécifiques à la téléphonie. Vous pouvez récupérer des instances de ces deux interfaces à partir de l'instance principale de l'interfaceIModule. Pour en savoir plus, consultez les tableaux comparatifs sur Core HAL et Fonctionnalités liées aux fonctionnalités.IDevicesFactoryest 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 à l'aide des noms des instances de module, tels quebluetoothour_submix. La seule exception est le moduleprimary, qui s'enregistre sous le nom d'instancedefault.
Mappage des HAL audio AIDL et HIDL
Les tableaux des sections suivantes montrent le mappage entre les interfaces HIDL et AIDL Audio HAL. Pour en savoir plus sur la structure des répertoires, consultez Audio HAL.
HAL principal
Toutes les interfaces HIDL se trouvent dans le package android.hardware.audio@N.M, où N.M désigne la version Major.Minor. Toutes les interfaces AIDL se trouvent dans le package android.hardware.audio.core.
| Interfaces d'API HIDL et fichiers de configuration | Interfaces d'API AIDL | 
|---|---|
IDevicesFactory | 
   Enregistrement de 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 règles 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 à l'aide de crochets.
| Méthodes d'interface de l'API HIDL et éléments des fichiers de configuration | Méthodes d'interface de l'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écifications de l'appareil dans IDevice.openInputStream
        IDevice.openOutputStream | 
    IModule.setAudioPatch
        IModule.setAudioPortConfig
        IModule.resetAudioPatch | 
  
Configurations et flux des ports audio
| Méthodes d'interface de l'API HIDL | Méthodes d'interface de l'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 | 
   StreamDescriptor.Command.pause .start | 
  
IStream.start IStream.stop (flux MMAP)  | 
   StreamDescriptor.Command.start ou .burst
       .pause (entrée) et/ou .flush (sortie) | 
  
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 de la mémoire tampon font partie de la structure AudioPatch renvoyée par la HAL.
      La taille réelle du tampon en frames fait partie de la structure StreamDescriptor, ainsi que la taille du frame 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 de l'API HIDL | Méthodes d'interface de l'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 était auparavant définie dans les fichiers de configuration XML de la stratégie 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'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 de types de données AIDL, ce qui facilite la conversion du format XML au format AIDL.
| Éléments du fichier de configuration HIDL | Méthodes d'interface de l'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_enabledest supprimé du fichier de configuration, car cet élément de configuration n'est pas utilisé dans le système. La DRC doit être activée sur tous les appareils. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1"> 
Fonctionnalités liées aux fonctionnalités
| Méthodes d'interface de l'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.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 (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 de l'API HIDL | Commentaires | 
|---|---|
IDevice.initCheckIDevice.close | 
    Le module HAL se publie avec ServiceManager uniquement si l'initialisation réussit. À ce stade, elle est considérée comme permanente et ne peut pas être clôturée. | 
  
IDevice.supportsAudioPatches
       IStreamOut.supportsPauseAndResume
       IStreamOut.supportsDrain | 
    La prise en charge des correctifs, de la suspension, de la reprise et de la vidange est obligatoire. | 
IStreamOut.getRenderPosition
       IStreamOut.getNextWriteTimestamp | 
    Obsolète. | 
Extensions de fournisseur
Dans l'API HIDL, les extensions du 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 acceptent des instances Parcelable arbitraires en utilisant l'encapsulation dans ParcelableHolders.
Autres modifications
Voici d'autres modifications générales :
Pour améliorer la testabilité des API HAL, nous introduisons dans la version AIDL des options de débogage utilisées par les tests VTS et disponibles via le parcelable
ModuleDebug. Ces options indiquent à la HAL d'émuler certaines fonctionnalités (par exemple, la connexion d'appareils externes), qui nécessitent normalement une intervention manuelle et l'utilisation d'un équipement de test externe.Lorsque le framework ou les ensembles de tests VTS définissent la propriété système
sys.audio.restart.halsur1, les services HAL doivent redémarrer. Le fichieraudioserver.rcgère le redémarrage. Lors de l'implémentation de HAL, utilisez le nom de service HAL approprié listé dans le fichieraudioserver.rc. Dans Android 14, le nomvendor.audio-hal-aidlest ajouté spécifiquement pour la version AIDL du HAL.
HAL des effets
Toutes les interfaces HIDL se trouvent dans le package android.hardware.audio.effect@N.M*, où N.M correspond à la version Major.Minor. Toutes les interfaces AIDL se trouvent dans le package android.hardware.audio.effect.
| Interfaces d'API HIDL et fichiers de configuration | Interfaces d'API AIDL | 
|---|---|
IEffectsFactory | 
   IFactory | 
  
IEffect | 
   IEffect | 
  
audio_effects.xml | 
   IEffect | 
  
Effect Factory
| Interfaces de l'API HIDL  (android.hardware.audio.effect@X.X)  | 
   Interfaces de l'API AIDL  (android.hardware.audio.effect)  | 
  
|---|---|
IEffectsFactory.getAllDescriptors | 
   IFactory.queryEffects avec un 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'effet
| Interfaces de l'API HIDL  (android.hardware.audio.effect@X.X)  | 
   Interfaces de l'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 | 
   Mappez à IEffect.command, IEffect.setParameter ou IEffect.getParameter en fonction du type d'ancienne commande HIDL.
     | 
  
| N/A | IEffect.getState | 
  
IEffect.setParameter | 
   IEffect.setParameter | 
  
IEffect.getParameter | 
   IEffect.getParameter | 
  
Commandes d'effet
| Interfaces de l'API HIDL  (android.hardware.audio.effect@X.X)  | 
    Interfaces de l'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ée par la transaction Binder intégrée AIBinder_dump. | 
  
Définition des paramètres d'effet courants
| Définition HIDL  (android.hardware.audio.effect@X.X)  | 
   Définition AIDL | 
|---|---|
Types.hal | 
   Flags.aidl
       Parameter.aidl
        | 
  
Définition des effets spécifiques
| Interfaces de l'API HIDL  (android.hardware.audio.effect@X.X)  | 
    Interfaces de l'API AIDL  (android.hardware.audio.effect)  | 
  
|---|---|
I$EffectType$.hal | 
   $EffectType$.aidl |