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 MethodeIConfig.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 mitIFactory.queryEffects
und alle Effektverarbeitungen mitIFactory.queryProcessing
ab.Um Verwechslungen bei 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 AIDL Audio HAL ersetzt. Aktualisierungen zum aktuellen Audiomodus und zur Bildschirmdrehung werden an jedeIModule
Instanz gesendet. Parameter im Zusammenhang mit Bluetooth Synchronous Connection Oriented (BT SCO) und Hands-Free Profile (HFP) werden von einer dediziertenIBluetooth
Schnittstelle verwaltet. Eine dedizierteITelephony
Schnittstelle bietet telefoniespezifische Steuerelemente. Instanzen dieser beiden Schnittstellen können von der primären Instanz derIModule
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
oderr_submix
. Die einzige Ausnahme ist dasprimary
, das sich unter dem Instanznamendefault
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.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> <call_screen_mode_supported> <engine_library> | Unterteilt in 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.
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:
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.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 beim Implementieren 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.
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 , oderIEffect.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 |