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 metodoIConfig.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 utilizzandoIFactory.queryEffects
e tutte le elaborazioni degli effetti utilizzandoIFactory.queryProcessing
.Per evitare confusione con l'uso del termine dispositivo per i tipi di dispositivi audio,
IDevice
nell'HAL audio HIDL viene rinominatoIModule
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 istanzaIModule
. I parametri relativi alla connessione sincrona Bluetooth orientata (BT SCO) e al profilo vivavoce (HFP) sono gestiti da un'interfacciaIBluetooth
dedicata. Un'interfacciaITelephony
dedicata fornisce controlli specifici della telefonia. Le istanze di entrambe queste interfacce possono essere recuperate dall'istanza primaria dell'interfacciaIModule
. 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'interfacciaIModule
) sono ora registrati direttamente con Service Manager utilizzando i loro nomi per i nomi delle istanze, ad esempiobluetooth
or_submix
. L'unica eccezione è il moduloprimary
che viene registrato con il nome dell'istanzadefault
.
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.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> <call_screen_mode_supported> <engine_library> | Separato in due metodi diversi:ITelephony.getSupportedAudioModes IConfig.getEngineConfig |
<volumes> , O<volumeGroups> , <ProductStrategies> | IConfig.getEngineConfig |
<surroundSound> | IConfig.getSurroundSoundConfig |
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:
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.È necessario riavviare i servizi HAL quando il valore della proprietà di sistema
sys.audio.restart.hal
è impostato su1
. Il riavvio si ottiene tramiteaudioserver.rc
. Durante l'implementazione dell'HAL, utilizzare il nome del servizio HAL appropriato elencato nel fileaudioserver.rc
. In Android 14, il nomevendor.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 oIEffect.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 |