Confronto tra AIDL e HIDL Audio HAL

A partire da Android 14, i partner e i fornitori di SoC sono invitati a sostituire l'attuale implementazione HAL HIDL con un'implementazione HAL AIDL.

Per facilitare la transizione da HIDL Audio HAL a un HAL Audio AIDL, in questa pagina sono evidenziate alcune delle differenze principali. Questa pagina mostra anche la mappatura tra le interfacce AIDL e HIDL per l'HAL Audio.

Differenza tra l'implementazione di HAL audio AIDL e HIDL

Le principali differenze tra la struttura HIDL e quella AIDL sono le seguenti:

  • In AIDL Audio Core HAL, l'interfaccia IConfig viene introdotta come sostituto dei parametri di sistema nei file XML in HIDL HAL. Il framework legge questi parametri dall'HAL principale anziché dal file di configurazione del fornitore. Ad esempio, l'elenco dei formati surround che vengono visualizzati per il controllo utente è fornito dal metodo IConfig.getSurroundSoundConfig nell'HAL principale.

    In AIDL Audio Effects HAL, la logica effectProxy definita nei file XML in HIDL Effects HAL viene spostata nel framework audio. Il framework audio esegue query su tutte le istanze di effetti nel sistema utilizzando IFactory.queryEffects e su tutti gli elaborati degli effetti utilizzando IFactory.queryProcessing.

  • Per evitare confusione con l'utilizzo del termine device per i tipi di dispositivi audio,IDevice in HIDL Audio HAL viene rinominato in IModule in AIDL Audio HAL.

  • IPrimaryDevice è stato sostituito in AIDL Audio HAL. Gli aggiornamenti relativi alla modalità audio e alla rotazione dello schermo correnti vengono inviati a ogni istanza IModule. I parametri correlati al Bluetooth SCO (Bluetooth Connection Oriented) e al profilo Hands-Free (HFP) vengono gestiti da un'interfaccia IBluetooth dedicata. Un'interfaccia ITelephony dedicata fornisce controlli specifici per la telefonia. Le istanze di entrambe queste interfacce possono essere recuperate dall'istanza principale dell'interfaccia IModule. Per ulteriori informazioni, consulta le tabelle di confronto su Core HAL e sulle funzionalità relative alle funzionalità.

  • IDevicesFactory viene rimosso in AIDL Audio HAL per evitare ridondanze. I moduli HAL (ovvero le istanze di interfaccia IModule) ora vengono registrati direttamente con Service Manager utilizzando i relativi nomi per i nomi delle istanze, ad esempio bluetooth o r_submix. L'unica eccezione è il modulo primary che si registra con il nome dell'istanza default.

Mappatura HAL audio AIDL e HIDL

Le tabelle nelle sezioni seguenti mostrano la mappatura tra le interfacce HIDL e AIDL Audio HAL. Consulta File README HAL audio per ulteriori informazioni sulla struttura delle directory.

HAL principale

Tutte le interfacce HIDL si trovano nel pacchetto android.hardware.audio@N.M, dove N.M indica la versione Major.Minor. Tutte le interfacce AIDL si trovano nel pacchetto android.hardware.audio.core.

Interfacce e file di configurazione dell'API HIDL Interfacce API AIDL
IDevicesFactory Registrazione di IModule con ServiceManager.
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
File di criteri audio configurabili Utilizza l'implementazione HIDL per Android 14.

Porte audio, profili dinamici, route e patch

In questa tabella, gli elementi dei file XML sono indicati mediante parentesi angolari.

Metodi di interfaccia dell'API HIDL ed elementi dei file di configurazione Metodi dell'interfaccia dell'API AIDL
<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
Specifica del dispositivo in IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

Stream e configurazioni delle porte audio

Metodi dell'interfaccia dell'API HIDL Metodi dell'interfaccia dell'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 e 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 latenza nominale e la dimensione minima del buffer fanno parte della struttura AudioPatch restituita dall'HAL. Le dimensioni effettive del buffer in frame fanno parte della struttura StreamDescriptor insieme alle dimensioni del frame in byte. La dimensione del buffer in byte può essere calcolata moltiplicando questi due numeri.

Collegamento degli effetti audio

Metodi dell'interfaccia dell'API HIDL Metodi dell'interfaccia dell'API AIDL
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

Configurazione a livello di sistema

La configurazione a livello di sistema precedentemente definita nei file di configurazione XML dei criteri audio (ovvero audio_policy_configuration.xml e audio_policy_engine_configuration.xml) deve essere fornita tramite IConfig. Tuttavia, per semplificare la transizione ad AIDL, i fornitori hanno ancora la possibilità di utilizzare gli stessi file XML utilizzati in precedenza per impostare la configurazione a livello di sistema. L'implementazione di riferimento per IConfig contiene il codice necessario per rappresentare le informazioni del file XML utilizzando i tipi di dati AIDL, il che facilita la conversione da XML ad AIDL.

Elementi del file di configurazione HIDL Metodi dell'interfaccia dell'API AIDL
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
Suddividi in due metodi diversi:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> OPPURE
<volumeGroups>, <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled viene rimosso dal file di configurazione poiché questo elemento di configurazione non viene utilizzato all'interno del sistema. Su tutti i dispositivi deve essere attivata la funzionalità DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

Funzionalità correlate alle funzionalità

Metodi dell'interfaccia dell'API HIDL Interfaccia 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 (i callback vengono combinati in IStreamOutEventCallback)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

Metodi obsoleti

Metodi dell'interfaccia dell'API HIDL Commenti
IDevice.initCheck
IDevice.close
Il modulo HAL si pubblica con ServiceManager solo se l'inizializzazione è andata a buon fine. A quel punto, viene considerata definitiva e non può essere chiusa.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Il supporto di patch, messa in pausa, ripresa e scarico è obbligatorio.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleta.

Estensioni del fornitore

Nell'API HIDL, le estensioni del fornitore vengono implementate utilizzando i metodi getParameters o setParameters delle interfacce IDevice e IStream. Questi metodi accettano stringhe arbitrarie. Nell'API AIDL esistono metodi corrispondenti, come getVendorParameters o setVendorParameters, che accettano istanze Parcelable arbitrarie utilizzando l'incapsulamento all'interno di ParcelableHolders.

Altre modifiche

Altre modifiche generali sono le seguenti:

  1. Per migliorare la testabilità delle API HAL, nella versione AIDL, abbiamo introdotto opzioni di debug utilizzate dai test VTS e disponibili tramite il parcelable ModuleDebug. Queste opzioni indicano all'HAL di emulare determinate funzionalità (ad esempio la connessione di dispositivi esterni), che altrimenti richiedono un intervento manuale e l'utilizzo di apparecchiature di test esterne.

  2. I servizi HAL devono essere riavviati quando il valore della proprietà di sistema sys.audio.restart.hal è impostato su 1. Il riavvio viene eseguito tramite audioserver.rc. Durante l'implementazione dell'HAL, utilizza il nome del servizio HAL appropriato elencato nel file audioserver.rc. In Android 14, il nome vendor.audio-hal-aidl viene aggiunto specificamente per la versione AIDL dell'HAL.

HAL per gli effetti

Tutte le interfacce HIDL si trovano nel pacchetto android.hardware.audio.effect@N.M*, dove N.M è la versione Major.Minor. Tutte le interfacce AIDL si trovano nel pacchetto android.hardware.audio.effect.

Interfacce e file di configurazione dell'API HIDL Interfacce API AIDL
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Fabbrica effetti

Interfacce API HIDL
(android.hardware.audio.effect@X.X)
Interfacce API AIDL
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects con parametro UUID nullo
IEffectsFactory.getDescriptor IFactory.queryEffects con parametro UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfacce di effetti

Interfacce API HIDL
(android.hardware.audio.effect@X.X)
Interfacce 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 Mappa a IEffect.command,
IEffect.setParameter o
IEffect.getParameter in base al tipo di comando HIDL precedente
N/D IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandi per gli effetti

Interfacce API HIDL
(android.hardware.audio.effect@X.X)
Interfacce 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 Rimossa in HAL AIDL di Effetti
EFFECT_CMD_SET_PARAM_COMMIT Deprecato in Effetti 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
(uguale a VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD Ritirato.
In AIDL, i passaggi alla modalità di offload e non offload vengono gestiti nel framework.
EFFECT_CMD_DUMP Gestito dalla transazione del binder integrata AIBinder_dump.

Definizione dei parametri di effetto comuni

Definizione HIDL
(android.hardware.audio.effect@X.X)
Definizione di AIDL
Types.hal Flags.aidl
Parameter.aidl

Definizione di effetti specifici

Interfacce API HIDL
(android.hardware.audio.effect@X.X)
Interfacce API AIDL
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl