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 metodoIConfig.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 utilizzandoIFactory.queryEffects
e su tutti gli elaborati degli effetti utilizzandoIFactory.queryProcessing
.Per evitare confusione con l'utilizzo del termine device per i tipi di dispositivi audio,
IDevice
in HIDL Audio HAL viene rinominato inIModule
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 istanzaIModule
. I parametri correlati al Bluetooth SCO (Bluetooth Connection Oriented) e al profilo Hands-Free (HFP) vengono gestiti da un'interfacciaIBluetooth
dedicata. Un'interfacciaITelephony
dedicata fornisce controlli specifici per la telefonia. Le istanze di entrambe queste interfacce possono essere recuperate dall'istanza principale dell'interfacciaIModule
. 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 interfacciaIModule
) ora vengono registrati direttamente con Service Manager utilizzando i relativi nomi per i nomi delle istanze, ad esempiobluetooth
or_submix
. L'unica eccezione è il moduloprimary
che si registra con il nome dell'istanzadefault
.
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.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> <call_screen_mode_supported>
<engine_library> |
Suddividi in due metodi diversi:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> OPPURE
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
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:
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.I servizi HAL devono essere riavviati quando il valore della proprietà di sistema
sys.audio.restart.hal
è impostato su1
. Il riavvio viene eseguito tramiteaudioserver.rc
. Durante l'implementazione dell'HAL, utilizza il nome del servizio HAL appropriato elencato nel fileaudioserver.rc
. In Android 14, il nomevendor.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 |