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 ermöglichen, werden auf dieser Seite einige der wichtigsten Unterschiede hervorgehoben. Auf dieser Seite wird auch die Zuordnung zwischen den AIDL- und HIDL-Schnittstellen für die Audio-HAL gezeigt.
Unterschied zwischen AIDL- und HIDL-Audio-HAL-Implementierung
Die wichtigsten Unterschiede zwischen der HIDL- und der AIDL-Struktur sind:
In der AIDL Audio Core HAL wird die
IConfig
-Schnittstelle als Ersatz für die systemweiten Parameter in XML-Dateien in der HIDL-HAL eingeführt. Das Framework liest diese Parameter aus dem Core HAL anstelle der Anbieterkonfigurationsdatei. Die Liste der Surround-Formate, die für die Nutzersteuerung angezeigt werden, wird beispielsweise von der MethodeIConfig.getSurroundSoundConfig
im Core HAL bereitgestellt.In der AIDL Audio Effects HAL wird die in XML-Dateien in der HIDL Effects HAL definierte
effectProxy
-Logik in das Audio-Framework verschoben. Das Audio-Framework fragt alle Effektinstanzen im System mitIFactory.queryEffects
und alle Effektverarbeitungen mitIFactory.queryProcessing
ab.Um Verwechslungen mit der Verwendung des Begriffs Gerät für Audiogerätetypen zu vermeiden, wird
IDevice
in HIDL Audio HAL inIModule
in AIDL Audio HAL umbenannt.IPrimaryDevice
wird in der AIDL-Audio-HAL ersetzt. Updates zum aktuellen Audiomodus und zur Bildschirmausrichtung werden an jedeIModule
-Instanz gesendet. Parameter für Bluetooth Synchronous Connection Oriented (BT SCO) und Hands-Free Profile (HFP) werden über eine dedizierteIBluetooth
-Schnittstelle verarbeitet. Eine spezielleITelephony
-Schnittstelle bietet telefoniespezifische Steuerelemente. Instanzen beider Schnittstellen können von der primären Instanz derIModule
-Schnittstelle abgerufen werden. Weitere Informationen finden Sie in den Vergleichstabellen unter Core HAL und Funktionsbezogene Funktionen.IDevicesFactory
wurde in der AIDL-Audio-HAL entfernt, um Redundanz zu vermeiden. HAL-Module (d. h.IModule
-Schnittstelleninstanzen) werden jetzt direkt beim Service Manager mit ihren Namen als Instanznamen registriert, z. B.bluetooth
oderr_submix
. Die einzige Ausnahme ist das Modulprimary
, das unter dem Instanznamendefault
registriert wird.
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 README-Datei für das Audio-HAL.
Core HAL
Alle HIDL-Schnittstellen befinden sich im Paket android.hardware.audio@N.M
, wobei N.M
die Major.Minor-Version angibt. Alle AIDL-Schnittstellen befinden sich im Paket android.hardware.audio.core
.
HIDL-API-Schnittstellen und Konfigurationsdateien | AIDL-API-Schnittstellen |
---|---|
IDevicesFactory |
Registrierung von IModule mit 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 Elemente von Konfigurationsdateien | AIDL-API-Schnittstellenmethoden |
---|---|
<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
Spezifikation des Geräts in IDevice.openInputStream
IDevice.openOutputStream |
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch |
Konfigurationen und Streams für Audio-Ports
HIDL-API-Schnittstellenmethoden | AIDL-API-Schnittstellenmethoden |
---|---|
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 , die nominale Latenz und die minimale Puffergröße sind Teil der AudioPatch -Struktur, die von der HAL zurückgegeben wird.
Die tatsächliche Puffergröße in Frames ist Teil der StreamDescriptor -Struktur, zusammen mit der Framegröße in Byte. Die Puffergröße in Byte kann durch Multiplikation dieser beiden Zahlen berechnet werden. |
Verbindung für Audioeffekte
HIDL-API-Schnittstellenmethoden | AIDL-API-Schnittstellenmethoden |
---|---|
IDevice.addDeviceEffect
IDevice.removeDeviceEffect |
IModule.addDeviceEffect
IModule.removeDeviceEffect |
IStream.addEffect
IStream.removeEffect |
IStreamCommon.addEffect
IStreamCommon.removeEffect |
Systemweite Konfiguration
Die systemweite Konfiguration, die zuvor in den XML-Konfigurationsdateien für Audioprichtlinien (audio_policy_configuration.xml
und audio_policy_engine_configuration.xml
) definiert wurde, 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 mit AIDL-Datentypen erforderlich ist. Dies erleichtert die Konvertierung von XML in AIDL.
HIDL-Konfigurationsdateielemente | AIDL-API-Schnittstellenmethoden |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
Es gibt zwei verschiedene Methoden:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> ODER
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
wird aus der Konfigurationsdatei entfernt, da dieses Konfigurationselement im System nicht verwendet wird. Auf allen Geräten muss DRC aktiviert sein. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Funktionen im Zusammenhang mit Funktionen
HIDL-API-Schnittstellenmethoden | 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 (Callbacks werden in IStreamOutEventCallback zusammengefasst) |
IDevice.get/setParameters
IStream.get/setParameters |
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters |
Nicht mehr unterstützte Methoden
HIDL-API-Schnittstellenmethoden | Kommentare |
---|---|
IDevice.initCheck IDevice.close |
Das HAL-Modul veröffentlicht sich mit ServiceManager nur bei erfolgreicher Initialisierung. Ab diesem Zeitpunkt gilt sie als dauerhaft und kann nicht geschlossen werden. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
Unterstützung für Patches, Pausieren, Fortsetzen und Entleeren ist obligatorisch. |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
Veraltet. |
Anbietererweiterungen
In der HIDL API werden Anbietererweiterungen mit den Methoden getParameters
oder setParameters
aus den Schnittstellen IDevice
und IStream
implementiert. Diese Methoden akzeptieren beliebige Strings.
In der AIDL API gibt es entsprechende Methoden wie getVendorParameters
oder setVendorParameters
, die beliebige Parcelable
-Instanzen durch Kapselung in ParcelableHolders
verwenden.
Sonstige Änderungen
Weitere allgemeine Änderungen:
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 Parcelable
ModuleDebug
verfügbar sind. Mit diesen Optionen wird das HAL angewiesen, bestimmte Funktionen zu emulieren (z. B. das Verbinden externer Geräte), die ansonsten manuelles Eingreifen und die Verwendung externer Testgeräte erfordern.HAL-Dienste müssen neu gestartet werden, wenn der Wert der Systemeigenschaft
sys.audio.restart.hal
auf1
gesetzt ist. Der Neustart erfolgt überaudioserver.rc
. Verwenden Sie bei der Implementierung des HAL den entsprechenden HAL-Dienstnamen, der in der Dateiaudioserver.rc
aufgeführt ist. In Android 14 wird der Namevendor.audio-hal-aidl
speziell für die AIDL-Version des HAL hinzugefügt.
HAL für Effekte
Alle HIDL-Schnittstellen befinden sich im Paket android.hardware.audio.effect@N.M*
, wobei N.M
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 |
Effect Factory
HIDL-API-Schnittstellen (android.hardware.audio.effect@X.X) |
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@X.X) |
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 |
Ordnen Sie je nach Art des alten HIDL-Befehls IEffect.command , IEffect.setParameter oder IEffect.getParameter zu.
|
– | IEffect.getState |
IEffect.setParameter |
IEffect.setParameter |
IEffect.getParameter |
IEffect.getParameter |
Effektbefehle
HIDL-API-Schnittstellen (android.hardware.audio.effect@X.X) |
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 der Effects AIDL HAL verworfen |
EFFECT_CMD_SET_PARAM_COMMIT |
In der Effects AIDL HAL verworfen |
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
(wie VISUALIZER_CMD_CAPTURE )
| IEffect.getParameter |
EFFECT_CMD_OFFLOAD |
Eingestellt.
In AIDL werden Offload- und Nicht-Offload-Moduswechsel im Framework verarbeitet. |
EFFECT_CMD_DUMP |
Wird von der integrierten Binder-Transaktion AIBinder_dump verarbeitet. |
Definition gängiger Effektparameter
HIDL-Definition (android.hardware.audio.effect@X.X) |
AIDL-Definition |
---|---|
Types.hal |
Flags.aidl
Parameter.aidl
|
Definition spezifischer Effekte
HIDL-API-Schnittstellen (android.hardware.audio.effect@X.X) |
AIDL-API-Schnittstellen (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |