Vergleich von AIDL und HIDL Audio HAL

Ab Android 14 werden Partner und SoC-Anbieter aufgefordert, die aktuelle HIDL HAL-Implementierung durch eine AIDL HAL-Implementierung zu ersetzen.

Um einen reibungslosen Übergang von HIDL Audio HAL zu AIDL Audio HAL zu erleichtern, werden auf dieser Seite einige der wichtigsten Unterschiede hervorgehoben. Diese Seite zeigt auch die Zuordnung zwischen den AIDL- und HIDL-Schnittstellen für den Audio-HAL.

Unterschied zwischen AIDL- und HIDL-Audio-HAL-Implementierung

Die Hauptunterschiede zwischen der HIDL-Struktur und der AIDL-Struktur sind folgende:

  • In AIDL Audio Core HAL wird die IConfig Schnittstelle als Ersatz für die systemweiten Parameter in XML-Dateien in HIDL HAL eingeführt. Das Framework liest diese Parameter aus der Core-HAL statt aus der Herstellerkonfigurationsdatei. Beispielsweise wird die Liste der Surround-Formate, die zur Benutzersteuerung angezeigt werden, von der Methode IConfig.getSurroundSoundConfig in der Core-HAL bereitgestellt.

    In AIDL Audio Effects HAL wird die in XML-Dateien in HIDL Effects HAL definierte effectProxy Logik in das Audio-Framework verschoben. Das Audio-Framework fragt alle Effektinstanzen im System mit IFactory.queryEffects und alle Effektverarbeitungen mit IFactory.queryProcessing ab.

  • Um Verwechslungen bei der Verwendung des Begriffs „ Gerät“ für Audiogerätetypen zu vermeiden, wird IDevice in HIDL Audio HAL in IModule in AIDL Audio HAL umbenannt.

  • IPrimaryDevice wird in AIDL Audio HAL ersetzt. Aktualisierungen zum aktuellen Audiomodus und zur Bildschirmdrehung werden an jede IModule Instanz gesendet. Parameter im Zusammenhang mit Bluetooth Synchronous Connection Oriented (BT SCO) und Hands-Free Profile (HFP) werden von einer dedizierten IBluetooth Schnittstelle verwaltet. Eine dedizierte ITelephony Schnittstelle bietet telefoniespezifische Steuerelemente. Instanzen dieser beiden Schnittstellen können von der primären Instanz der IModule Schnittstelle abgerufen werden. Weitere Informationen finden Sie in den Vergleichstabellen zu Core HAL und funktionsbezogenen Funktionen .

  • IDevicesFactory wird in AIDL Audio HAL entfernt, um Redundanz zu vermeiden. HAL-Module (d. h. IModule Schnittstelleninstanzen) werden jetzt direkt beim Service Manager unter Verwendung ihrer Namen registriert, z. B. Instanznamen, z. bluetooth oder r_submix . Die einzige Ausnahme ist das primary , das sich unter dem Instanznamen default registriert.

AIDL- und HIDL-Audio-HAL-Zuordnung

Die Tabellen in den folgenden Abschnitten zeigen die Zuordnung zwischen den HIDL- und AIDL Audio HAL-Schnittstellen. Weitere Informationen zur Verzeichnisstruktur finden Sie in der Audio-HAL-README-Datei .

Kern-HAL

Alle HIDL-Schnittstellen befinden sich im Paket android.hardware.audio@NM , wobei NM die Major.Minor -Version bezeichnet. Alle AIDL-Schnittstellen befinden sich im Paket android.hardware.audio.core .

HIDL-API-Schnittstellen und Konfigurationsdateien AIDL-API-Schnittstellen
IDevicesFactory Registrierung von IModule bei ServiceManager .
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
Konfigurierbare Audio-Richtliniendateien Verwenden Sie die HIDL-Implementierung für Android 14.

Audio-Ports, dynamische Profile, Routen und Patches

In dieser Tabelle werden Elemente von XML-Dateien mit spitzen Klammern gekennzeichnet.

HIDL-API-Schnittstellenmethoden und Konfigurationsdateielemente Methoden der AIDL-API-Schnittstelle
<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
Spezifikation des Geräts in IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

Audio-Port-Konfigurationen und Streams

Methoden der HIDL-API-Schnittstelle Methoden der AIDL-API-Schnittstelle
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 und 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 , nominale Latenz und minimale Puffergröße sind Teil der von der HAL zurückgegebenen AudioPatch Struktur. Die tatsächliche Puffergröße in Frames ist zusammen mit der Framegröße in Bytes Teil der StreamDescriptor Struktur. Die Puffergröße in Bytes kann durch Multiplikation dieser beiden Zahlen berechnet werden.

Anschluss für Audioeffekte

Methoden der HIDL-API-Schnittstelle Methoden der AIDL-API-Schnittstelle
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

Systemweite Konfiguration

Die systemweite Konfiguration, die zuvor in XML-Konfigurationsdateien für Audiorichtlinien definiert wurde (nämlich audio_policy_configuration.xml und audio_policy_engine_configuration.xml ), muss über IConfig bereitgestellt werden. Um den Übergang zu AIDL zu erleichtern, haben Anbieter jedoch weiterhin die Möglichkeit, dieselben XML-Dateien zu verwenden, die sie zuvor zum Festlegen der systemweiten Konfiguration verwendet haben. Die Referenzimplementierung für IConfig enthält den Code, der zum Darstellen von Informationen aus der XML-Datei mithilfe von AIDL-Datentypen erforderlich ist, was die Konvertierung von XML in AIDL erleichtert.

Elemente der HIDL-Konfigurationsdatei Methoden der AIDL-API-Schnittstelle
<globalConfiguration>
<speaker_drc_enabled> 1

<call_screen_mode_supported>
<engine_library>
Unterteilt in zwei verschiedene Methoden:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> , ODER
<volumeGroups> , <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled wird aus der Konfigurationsdatei entfernt, da dieses Konfigurationselement im System nicht verwendet wird. Auf allen Geräten muss DRC aktiviert sein.

Funktionsbezogene Funktionalität

Methoden der HIDL-API-Schnittstelle AIDL-API-Schnittstelle
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 (Rückrufe werden in IStreamOutEventCallback zusammengefasst)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

Veraltete Methoden

Methoden der HIDL-API-Schnittstelle Kommentare
IDevice.initCheck
IDevice.close
Das HAL-Modul veröffentlicht sich nur bei erfolgreicher Initialisierung mit dem ServiceManager . Zu diesem Zeitpunkt gilt es als dauerhaft und kann nicht geschlossen werden.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Die Unterstützung für Patches, Pause, Wiederaufnahme und Entleerung ist obligatorisch.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Veraltet.

Anbietererweiterungen

In der HIDL-API werden Herstellererweiterungen mithilfe der Methoden getParameters oder setParameters der Schnittstellen IDevice und IStream implementiert. Diese Methoden akzeptieren beliebige Zeichenfolgen. In der AIDL-API gibt es entsprechende Methoden wie getVendorParameters oder setVendorParameters , die beliebige Parcelable Instanzen annehmen, indem sie die Kapselung innerhalb von ParcelableHolders verwenden.

Weitere Änderungen

Weitere allgemeine Änderungen sind wie folgt:

  1. Um die Testbarkeit von HAL-APIs zu verbessern, führen wir in der AIDL-Version Debugging-Optionen ein, die von VTS-Tests verwendet werden und über das ModuleDebug Parcelable verfügbar sind. Diese Optionen weisen den HAL an, bestimmte Funktionen zu emulieren (z. B. den Anschluss externer Geräte), die ansonsten manuelle Eingriffe und den Einsatz externer Testgeräte erfordern.

  2. HAL-Dienste müssen neu gestartet werden, wenn der Wert der Systemeigenschaft sys.audio.restart.hal auf 1 gesetzt ist. Der Neustart erfolgt über audioserver.rc . Verwenden Sie beim Implementieren des HAL den entsprechenden HAL-Dienstnamen, der in der Datei audioserver.rc aufgeführt ist. In Android 14 wird der Name vendor.audio-hal-aidl speziell für die AIDL-Version des HAL hinzugefügt.

Effekte HAL

Alle HIDL-Schnittstellen befinden sich im Paket android.hardware.audio.effect@NM* , wobei NM die Major.Minor Version ist. Alle AIDL-Schnittstellen befinden sich im Paket android.hardware.audio.effect .

HIDL-API-Schnittstellen und Konfigurationsdateien AIDL-API-Schnittstellen
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Effektfabrik

HIDL-API-Schnittstellen
(android.hardware.audio.effect@XX)
AIDL-API-Schnittstellen
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects mit Null-UUID-Parameter
IEffectsFactory.getDescriptor IFactory.queryEffects mit UUID-Parameter
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Effektschnittstellen

HIDL-API-Schnittstellen
(android.hardware.audio.effect@XX)
AIDL-API-Schnittstellen
(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 Zuordnen zu IEffect.command ,
IEffect.setParameter , oder
IEffect.getParameter basierend auf dem Typ des älteren HIDL-Befehls
N / A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Effektbefehle

HIDL-API-Schnittstellen
(android.hardware.audio.effect@XX)
AIDL-API-Schnittstellen
(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 In Effects AIDL HAL veraltet
EFFECT_CMD_SET_PARAM_COMMIT In Effects AIDL HAL veraltet
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
(dasselbe wie VISUALIZER_CMD_CAPTURE )
IEffect.getParameter
EFFECT_CMD_OFFLOAD Veraltet.
In AIDL werden Offload- und Non-Offload-Moduswechsel im Framework gehandhabt.
EFFECT_CMD_DUMP Wird von der integrierten Binder-Transaktion AIBinder_dump verarbeitet.

Definition allgemeiner Effektparameter

HIDL-Definition
(android.hardware.audio.effect@XX)
AIDL-Definition
Types.hal Flags.aidl
Parameter.aidl

Definition spezifischer Effekte

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