Porównanie interfejsów AIDL i HIDL Audio HAL

Od Androida 14 partnerzy i dostawców układów SoC zachęcamy do zastąpienia bieżącej implementacji interfejsu HIDL HAL implementacją interfejsu AIDL HAL.

Aby ułatwić przejście z interfejsu HIDL Audio HAL na interfejs AIDL Audio HAL, na tej stronie wyróżniono niektóre kluczowe różnice. Ta strona zawiera też mapowanie interfejsów AIDL i HIDL dla Audio HAL.

Różnice między implementacją AIDL a HIDL Audio HAL

Główne różnice między strukturą HIDL a strukturą AIDL:

  • W interfejsie Audio Core HAL AIDL wprowadzono interfejs IConfig jako zamiennik parametrów systemowych w plikach XML w interfejsie HAL HIDL. Platforma odczytuje te parametry z interfejsu Core HAL, a nie z pliku konfiguracji dostawcy. Na przykład lista formatów dźwięku przestrzennego, które są wyświetlane użytkownikowi do kontrolowania, jest dostarczana przez metodę IConfig.getSurroundSoundConfig w Core HAL.

    AIDL Audio Effects HAL logika effectProxy zdefiniowana w plikach XML w HIDL Effects HAL jest przenoszona do interfejsu audio. Platforma audio wysyła zapytania do wszystkich wystąpień efektów w systemie za pomocą IFactory.queryEffects oraz do wszystkich przetworzeń efektów za pomocą IFactory.queryProcessing.

  • Aby uniknąć nieporozumień związanych z używaniem terminu urządzenie w przypadku typów urządzeń audio, element IDevice w HIDL Audio HAL został przemianowany na IModule w AIDL Audio HAL.

  • IPrimaryDevice jest zastępowany w AIDL Audio HAL. Aktualizacje dotyczące bieżącego trybu dźwięku i obrotu ekranu są wysyłane do każdej instancji IModule. Parametry związane z Bluetooth SCO (Bluetooth Synchronous Connection Oriented) i Profilem zestawu głośnomówiącego (HFP) są obsługiwane przez specjalny interfejs IBluetooth. Specjalny interfejs ITelephony zapewnia ustawienia dotyczące telefonu. Wystąpienia obu tych interfejsów można pobrać z głównego wystąpienia interfejsu IModule. Więcej informacji znajdziesz w tabelach porównawczych Core HALFunkcje związane z funkcjami.

  • Aby uniknąć powielania, w interfejsie HAL Audio w AIDL usunięto element IDevicesFactory. Moduł HAL (czyli instancje interfejsu IModule) są teraz rejestrowane bezpośrednio w menedżerze usług przy użyciu nazw instancji, takich jak bluetooth lub r_submix. Jedynym wyjątkiem jest moduł primary, który rejestruje się pod nazwą instancji default.

Mapowanie HAL dźwięku AIDL i HIDL

Tabele w następnych sekcjach przedstawiają mapowanie między interfejsami HIDL i AIDL Audio HAL. Więcej informacji o strukturze katalogu znajdziesz w pliku README interfejsu Audio HAL.

Core HAL

Wszystkie interfejsy HIDL znajdują się w pakiecie android.hardware.audio@N.M, gdzie N.M oznacza wersję Major.Minor. Wszystkie interfejsy AIDL znajdują się w pakiecie android.hardware.audio.core.

Interfejsy i pliki konfiguracji interfejsu HIDL API Interfejsy AIDL API
IDevicesFactory Rejestracja domeny IModule w firmie ServiceManager.
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
Konfigurowalne pliki zasad dotyczących dźwięku Użyj implementacji HIDL na Androida 14.

Porty audio, profile dynamiczne, trasy i łatki

W tej tabeli elementy plików XML są oznaczone za pomocą nawiasów klamrowych.

Metody interfejsu HIDL API i elementy plików konfiguracyjnych Metody interfejsu AIDL API
<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
Specyfikacja urządzenia w IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

Konfiguracje portów audio i strumienie

Metody interfejsu HIDL API Metody interfejsu AIDL API
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.getPresentationPositionIStreamIn.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, opóźnienie nominalne i minimalny rozmiar bufora są częścią struktury AudioPatch zwracanej przez HAL. Rzeczywisty rozmiar bufora w ramkach jest częścią struktury StreamDescriptor, wraz z rozmiarem ramki w bajtach. Rozmiar bufora w bajtach można obliczyć, mnożąc te 2 liczby.

Połączenie z efektami dźwiękowymi

Metody interfejsu HIDL API Metody interfejsu AIDL API
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

Konfiguracja obejmująca cały system

Konfiguracja ogólnosystemowa zdefiniowana wcześniej w plikach konfiguracji XML zasad dotyczących dźwięku (czyli audio_policy_configuration.xml i audio_policy_engine_configuration.xml) musi być podana za pomocą IConfig. Aby ułatwić przejście na AIDL, producenci mogą nadal używać tych samych plików XML, których używali wcześniej do konfiguracji systemowej. Implementacja referencyjna dla IConfig zawiera kod potrzebny do reprezentowania informacji z pliku XML za pomocą typów danych AIDL, co ułatwia konwersję z XML na AIDL.

Elementy pliku konfiguracyjnego HIDL Metody interfejsu AIDL API
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
Wydzielone są 2 metody:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> LUB
<volumeGroups>, <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled zostanie usunięty z pliku konfiguracyjnego, ponieważ ten element konfiguracji nie jest używany w systemie. Funkcja DRC musi być włączona na wszystkich urządzeniach. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

Funkcje związane z funkcją

Metody interfejsu HIDL API Interfejs AIDL API
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 (wywołania zwrotne są łączone w IStreamOutEventCallback)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

Wycofane metody

Metody interfejsu HIDL API Komentarze
IDevice.initCheck
IDevice.close
Moduł HAL publikuje się za pomocą funkcji ServiceManager tylko po pomyślnej inicjalizowaniu. W tym momencie jest ona uważana za trwałą i nie można jej zamknąć.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Obsługa łatek, wstrzymywania, wznawiania i wyczerpywania jest obowiązkowa.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Przestarzałe.

Rozszerzenia dotyczące dostawców

W interfejsie HIDL rozszerzenia dostawcy są implementowane za pomocą metod getParameters lub setParameters z interfejsów IDeviceIStream. Te metody akceptują dowolne ciągi znaków. W interfejsie AIDL API są dostępne odpowiednie metody, takie jak getVendorParameters lub setVendorParameters, które przyjmują dowolne wystąpienia Parcelable za pomocą enkapsulacji w ramach ParcelableHolders.

Inne zmiany

Inne ogólne zmiany to:

  1. Aby ułatwić testowanie interfejsów HAL API, w wersji AIDL wprowadzamy opcje debugowania, które są używane przez testy VTS i są dostępne za pomocą interfejsu ModuleDebug parcelable. Te opcje instruują HAL, aby emulował określone funkcje (np. połączenie urządzeń zewnętrznych), które w przeciwnym razie wymagają ręcznej interwencji i zastosowania zewnętrznego sprzętu testowego.

  2. Usługi HAL wymagają ponownego uruchomienia, gdy wartość właściwości systemowej sys.audio.restart.hal jest ustawiona na 1. Ponowne uruchomienie odbywa się za pomocą audioserver.rc. Podczas implementowania HAL użyj odpowiedniej nazwy usługi HAL podanej w pliku audioserver.rc. W Androidzie 14 nazwa vendor.audio-hal-aidl jest dodawana specjalnie dla wersji AIDL interfejsu HAL.

Efekty HAL

Wszystkie interfejsy HIDL znajdują się w pakiecie android.hardware.audio.effect@N.M*, gdzie N.M to wersja Major.Minor. Wszystkie interfejsy AIDL znajdują się w pakiecie android.hardware.audio.effect.

Interfejsy i pliki konfiguracji interfejsu HIDL API Interfejsy AIDL API
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Effect Factory

Interfejsy HIDL API
(android.hardware.audio.effect@X.X)
Interfejsy AIDL API
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects z wartością null parametru UUID
IEffectsFactory.getDescriptor IFactory.queryEffects z parametrem UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfejsy efektów

Interfejsy HIDL API
(android.hardware.audio.effect@X.X)
Interfejsy AIDL API
(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 Mapowanie na IEffect.command,
IEffect.setParameter lub
IEffect.getParameter w zależności od typu starszego polecenia HIDL.
Nie dotyczy IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Polecenia efektów

Interfejsy HIDL API
(android.hardware.audio.effect@X.X)
Interfejsy AIDL API
(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 Wycofane w Efektach AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT Wycofane w Efektach 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
(taka sama jak VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD Wycofane.
W AIDL przełączanie się między trybami przenoszenia i nieprzenoszenia jest obsługiwane w ramach frameworka.
EFFECT_CMD_DUMP Obsługiwane przez wbudowaną transakcję bindera AIBinder_dump.

Definicja parametrów efektów wspólnych

Definicja HIDL
(android.hardware.audio.effect@X.X)
Definicja AIDL
Types.hal Flags.aidl
Parameter.aidl

Definicja efektów specjalnych

Interfejsy HIDL API
(android.hardware.audio.effect@X.X)
Interfejsy AIDL API
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl