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 Methode- IConfig.getSurroundSoundConfigim 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 mit- IFactory.queryEffectsund alle Effektverarbeitungen mit- IFactory.queryProcessingab.
- Um Verwechslungen mit der Verwendung des Begriffs Gerät für Audiogerätetypen zu vermeiden, wird - IDevicein HIDL Audio HAL in- IModulein AIDL Audio HAL umbenannt.
- Das AIDL-Audio-HAL ersetzt - IPrimaryDevice. Das Framework sendet Updates zum aktuellen Audiomodus und zur Bildschirmdrehung an jede- IModule-Instanz. Eine dedizierte- IBluetooth-Schnittstelle verarbeitet Parameter, die sich auf Bluetooth Synchronous Connection Oriented (BT SCO) und das Hands-Free Profile (HFP) beziehen. Eine spezielle- ITelephony-Schnittstelle bietet telefoniespezifische Steuerelemente. Sie können Instanzen beider Schnittstellen von der primären Instanz der- IModule-Schnittstelle abrufen. Weitere Informationen finden Sie in den Vergleichstabellen unter Core HAL und Funktionsbezogene Funktionen.
- IDevicesFactorywurde in der AIDL-Audio-HAL entfernt, um Redundanz zu vermeiden. HAL-Module (d. h.- IModule-Schnittstelleninstanzen) werden jetzt direkt beim Service Manager mit den Namen der Modulinstanzen wie- bluetoothoder- r_submixregistriert. Die einzige Ausnahme ist das Modul- primary, das unter dem Instanznamen- defaultregistriert 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 unter 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 IModulemitServiceManager. | 
| IDevice | IModule | 
| IPrimaryDevice | ITelephonyIBluetooth | 
| IStreamIStreamInIStreamOut | StreamDescriptorIStreamInIStreamCommonIStreamOut | 
| audio_policy_configuration.xmlaudio_policy_engine_configuration.xml | IConfigIModule | 
| 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.getAudioPortIDevice.setConnectedState | IModule.connectExternalDeviceIModule.disconnectExternalDevice | 
| IStream.getSupportedProfiles | IModule.connectExternalDevice | 
| < routes> | IModule.getAudioRoutes | 
| IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesSpezifikation des Geräts in IDevice.openInputStreamIDevice.openOutputStream | IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch | 
Konfigurationen und Streams für Audio-Ports
| HIDL-API-Schnittstellenmethoden | AIDL-API-Schnittstellenmethoden | 
|---|---|
| IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource | IModule.getAudioPortConfigsIModule.setAudioPortConfig | 
| IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer | IModule.openInputStreamIModule.openOutputStream | 
| IStream.close | IStreamCommon.close | 
| IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata | IStreamIn.updateMetadataIStreamOut.updateMetadata | 
| IStream.standby | StreamDescriptor.Command.standby | 
| IStream.pauseIStream.resume | StreamDescriptor.Command.pause.start | 
| IStream.startIStream.stop(MMAP-Streams) | StreamDescriptor.Command.startoder.burst.pause(Eingabe) und/oder.flush(Ausgabe) | 
| IStreamOut.drainIStreamOut.flush | StreamDescriptor.Command.drain.flush | 
| IStreamOut.setCallbackIStreamOut.clearCallback | IModule.openOutputStreamIStreamCommon.close | 
| IStreamOut.getPresentationPositionundIStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost | StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames | 
| IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount | IModule.setAudioPatch, die nominale Latenz und die minimale Puffergröße sind Teil derAudioPatch-Struktur, die von der HAL zurückgegeben wird.
      Die tatsächliche Puffergröße in Frames ist Teil derStreamDescriptor-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.addDeviceEffectIDevice.removeDeviceEffect | IModule.addDeviceEffectIModule.removeDeviceEffect | 
| IStream.addEffectIStream.removeEffect | IStreamCommon.addEffectIStreamCommon.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.getSupportedAudioModesIConfig.getEngineConfig | 
| <volumes>ODER<volumeGroups>,<ProductStrategies> | IConfig.getEngineConfig | 
| <surroundSound> | IConfig.getSurroundSoundConfig | 
- 
  speaker_drc_enabledwird 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.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute | IModule.\* | 
| IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume | ITelephony.TelecomConfig.\* | 
| IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume | IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* | 
| IPrimaryDevice.setModeIPrimaryDevice.updateRotation | ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation | 
| IDevice.setScreenStateIDevice.getMicrophones | IModule.updateScreenStateIModule.getMicrophones | 
| IDevice.getHwAvSyncIStream.setHwAvSync | IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId | 
| IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
| IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes | IStreamOut.\* | 
| IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback | IModule.openOutputStream(Callbacks werden inIStreamOutEventCallbackzusammengefasst) | 
| IDevice.get/setParametersIStream.get/setParameters | IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters | 
Nicht mehr unterstützte Methoden
| HIDL-API-Schnittstellenmethoden | Kommentare | 
|---|---|
| IDevice.initCheckIDevice.close | Das HAL-Modul veröffentlicht sich mit ServiceManagernur bei erfolgreicher Initialisierung. Ab diesem Zeitpunkt gilt sie als dauerhaft und kann nicht geschlossen werden. | 
| IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain | Unterstützung für Patches, Pausieren, Fortsetzen und Entleeren ist obligatorisch. | 
| IStreamOut.getRenderPositionIStreamOut.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 - ModuleDebugverfü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.
- Wenn das Framework oder die VTS-Tests die Systemeigenschaft - sys.audio.restart.halauf- 1setzen, müssen HAL-Dienste neu gestartet werden. Die Datei- audioserver.rcübernimmt den Neustart. Verwenden Sie bei der Implementierung des HAL den entsprechenden HAL-Dienstnamen, der in der Datei- audioserver.rcaufgeführt ist. In Android 14 wird der Name- vendor.audio-hal-aidlspeziell 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.queryEffectsmit Null-UUID-Parameter | 
| IEffectsFactory.getDescriptor | IFactory.queryEffectsmit UUID-Parameter | 
| IEffectsFactory.createEffect | IFactory.createEffect | 
| audio_effects.xml | IFactory.queryProcessingIFactory.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.setParameteroderIEffect.getParameterzu. | 
| – | 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_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE | IEffect.setParameter | 
| EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_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_dumpverarbeitet. | 
Definition gängiger Effektparameter
| HIDL-Definition (android.hardware.audio.effect@X.X) | AIDL-Definition | 
|---|---|
| Types.hal | Flags.aidlParameter.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 | 
