Confronto HAL audio AIDL e HIDL

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

Per facilitare una transizione graduale dall'HAL audio HIDL all'HAL audio AIDL, in questa pagina vengono 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 dell'HAL audio AIDL e HIDL

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

  • In AIDL Audio Core HAL , l'interfaccia IConfig viene introdotta in sostituzione dei parametri a livello di sistema nei file XML in HIDL HAL. Il framework legge questi parametri dal Core HAL anziché dal file di configurazione del fornitore. Ad esempio, l'elenco dei formati surround disponibili per il controllo dell'utente è fornito dal metodo IConfig.getSurroundSoundConfig nel Core HAL.

    Nell'HAL degli effetti audio AIDL , la logica effectProxy definita nei file XML nell'HAL degli effetti HIDL viene spostata nel framework audio. Il framework audio interroga tutte le istanze degli effetti nel sistema utilizzando IFactory.queryEffects e tutte le elaborazioni degli effetti utilizzando IFactory.queryProcessing .

  • Per evitare confusione con l'uso del termine dispositivo per i tipi di dispositivi audio, IDevice nell'HAL audio HIDL viene rinominato IModule nell'HAL audio AIDL.

  • IPrimaryDevice viene sostituito nell'HAL audio AIDL. Gli aggiornamenti sulla modalità audio corrente e sulla rotazione dello schermo vengono inviati a ogni istanza IModule . I parametri relativi alla connessione sincrona Bluetooth orientata (BT SCO) e al profilo vivavoce (HFP) sono gestiti da un'interfaccia IBluetooth dedicata. Un'interfaccia ITelephony dedicata fornisce controlli specifici della telefonia. Le istanze di entrambe queste interfacce possono essere recuperate dall'istanza primaria dell'interfaccia IModule . Per ulteriori informazioni, vedere le tabelle di confronto su Core HAL e funzionalità relative alle funzionalità .

  • IDevicesFactory viene rimosso nell'HAL audio AIDL per evitare ridondanza. I moduli HAL (ovvero le istanze dell'interfaccia IModule ) sono ora registrati direttamente con Service Manager utilizzando i loro nomi per i nomi delle istanze, ad esempio bluetooth o r_submix . L'unica eccezione è il modulo primary che viene registrato con il nome dell'istanza default .

Mappatura HAL audio AIDL e HIDL

Le tabelle nelle sezioni seguenti mostrano la mappatura tra le interfacce HAL audio HIDL e AIDL. Per ulteriori informazioni sulla struttura delle directory, vedere il file Audio HAL README .

HAL principale

Tutte le interfacce HIDL si trovano all'interno del pacchetto android.hardware.audio@NM , dove NM denota la versione Major.Minor . Tutte le interfacce AIDL si trovano all'interno del pacchetto android.hardware.audio.core .

Interfacce API HIDL e file di configurazione 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, percorsi e patch

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

Metodi dell'interfaccia API HIDL ed elementi dei file di configurazione Metodi di interfaccia 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

Configurazioni e flussi di porte audio

Metodi di interfaccia API HIDL Metodi di interfaccia 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. La dimensione effettiva del buffer in frame fa parte della struttura StreamDescriptor , insieme alla dimensione del frame in byte. La dimensione del buffer in byte può essere calcolata moltiplicando questi due numeri.

Collegamento degli effetti audio

Metodi di interfaccia API HIDL Metodi di interfaccia 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 facilitare 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 dal file XML utilizzando i tipi di dati AIDL, che facilita la conversione da XML ad AIDL.

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

<call_screen_mode_supported>
<engine_library>
Separato in due metodi diversi:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> , O
<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 nel sistema. Tutti i dispositivi devono avere DRC abilitato.

Funzionalità relative alle funzionalità

Metodi di interfaccia 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 di interfaccia API HIDL Commenti
IDevice.initCheck
IDevice.close
Il modulo HAL si pubblica con ServiceManager solo dopo l'inizializzazione riuscita. A quel punto, è considerato permanente e non può essere chiuso.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Il supporto per patch, pausa, ripresa e scarico è obbligatorio.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Estensioni del fornitore

Nell'API HIDL, le estensioni del fornitore vengono implementate utilizzando i metodi getParameters o setParameters dalle 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 .

Altri cambiamenti

Altre modifiche generali sono le seguenti:

  1. Per migliorare la testabilità delle API HAL, nella versione AIDL, introduciamo 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 richiederebbero l'intervento manuale e l'uso di apparecchiature di test esterne.

  2. È necessario riavviare i servizi HAL quando il valore della proprietà di sistema sys.audio.restart.hal è impostato su 1 . Il riavvio si ottiene tramite audioserver.rc . Durante l'implementazione dell'HAL, utilizzare il nome del servizio HAL appropriato elencato nel file audioserver.rc . In Android 14, il nome vendor.audio-hal-aidl viene aggiunto appositamente per la versione AIDL dell'HAL.

Effetti HAL

Tutte le interfacce HIDL si trovano all'interno del pacchetto android.hardware.audio.effect@NM* , dove NM è la versione Major.Minor . Tutte le interfacce AIDL si trovano all'interno del pacchetto android.hardware.audio.effect .

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

Fabbrica degli effetti

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

Interfacce degli effetti

Interfacce API HIDL
(android.hardware.audio.effect@XX)
Interfacce API AIDL
(android.hardware.audio.effetto)
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 su IEffect.command ,
IEffect.setParameter o
IEffect.getParameter in base al tipo di comando HIDL legacy
N / A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandi degli effetti

Interfacce API HIDL
(android.hardware.audio.effect@XX)
Interfacce API AIDL
(android.hardware.audio.effetto)
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 Deprecato in Effetti AIDL HAL
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 Deprecato.
In AIDL, i cambi di modalità offload e non-offload vengono gestiti nel framework.
EFFECT_CMD_DUMP Gestito dalla transazione del raccoglitore incorporata AIBinder_dump .

Definizione dei parametri degli effetti comuni

Definizione HIDL
(android.hardware.audio.effect@XX)
Definizione dell'AIDL
Types.hal Flags.aidl
Parameter.aidl

Definizione degli effetti specifici

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