Porównanie AIDL i HIDL Audio HAL

Począwszy od Androida 14, zachęcamy partnerów i dostawców SoC do zastąpienia obecnej implementacji HIDL HAL implementacją AIDL HAL.

Aby ułatwić płynne przejście z HIDL Audio HAL do AIDL Audio HAL, na tej stronie wyróżniono niektóre kluczowe różnice. Na tej stronie pokazano także mapowanie pomiędzy interfejsami AIDL i HIDL dla Audio HAL.

Różnica między implementacją AIDL i HIDL Audio HAL

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

  • W AIDL Audio Core HAL interfejs IConfig został wprowadzony jako zamiennik parametrów ogólnosystemowych w plikach XML w HIDL HAL. Struktura odczytuje te parametry z Core HAL zamiast z pliku konfiguracyjnego dostawcy. Na przykład lista formatów surround udostępnianych do kontroli użytkownika jest udostępniana przez metodę IConfig.getSurroundSoundConfig w warstwie Core HAL.

    W AIDL Audio Effects HAL logika effectProxy zdefiniowana w plikach XML w HIDL Effects HAL została przeniesiona do środowiska audio. Struktura audio wysyła zapytania do wszystkich instancji efektów w systemie przy użyciu IFactory.queryEffects , a wszystkie procesy przetwarzania efektów przy użyciu IFactory.queryProcessing .

  • Aby uniknąć nieporozumień związanych z użyciem terminu urządzenie w odniesieniu do typów urządzeń audio, IDevice w HIDL Audio HAL została zmieniona na IModule w AIDL Audio HAL.

  • IPrimaryDevice zostaje zastąpione w AIDL Audio HAL. Aktualizacje dotyczące bieżącego trybu audio i rotacji ekranu są wysyłane do każdej instancji IModule . Parametry związane z połączeniem synchronicznym Bluetooth (BT SCO) i profilem głośnomówiącym (HFP) są obsługiwane przez dedykowany interfejs IBluetooth . Dedykowany interfejs ITelephony zapewnia kontrolę specyficzną dla telefonii. Instancje obu tych interfejsów można pobrać z podstawowej instancji interfejsu IModule . Aby uzyskać więcej informacji, zobacz tabele porównawcze dotyczące podstawowej warstwy HAL i funkcji związanych z funkcjami .

  • IDevicesFactory zostało usunięte z AIDL Audio HAL, aby uniknąć nadmiarowości. Moduły HAL (czyli instancje interfejsu IModule ) są teraz rejestrowane bezpośrednio w Service Managerze przy użyciu ich nazw jako nazw instancji, takich jak bluetooth lub r_submix . Jedynym wyjątkiem jest moduł primary , który rejestruje się pod nazwą instancji default .

Mapowanie AIDL i HIDL Audio HAL

Tabele w poniższych sekcjach przedstawiają mapowanie pomiędzy interfejsami HIDL i AIDL Audio HAL. Więcej informacji na temat struktury katalogów można znaleźć w pliku audio HAL README .

Rdzeń HAL

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

Interfejsy HIDL API i pliki konfiguracyjne Interfejsy API AIDL
IDevicesFactory Rejestracja IModule w 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 audio Użyj implementacji HIDL dla Androida 14.

Porty audio, profile dynamiczne, trasy i poprawki

W tej tabeli elementy plików XML oznaczono za pomocą nawiasów ostrych.

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

Połączenie efektów dźwiękowych

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

Konfiguracja ogólnosystemowa

Konfiguracja ogólnosystemowa, która została wcześniej zdefiniowana w plikach konfiguracyjnych XML zasad audio (mianowicie audio_policy_configuration.xml i audio_policy_engine_configuration.xml ) musi być zapewniona poprzez IConfig . Jednakże, aby ułatwić przejście na AIDL, dostawcy nadal mają możliwość używania tych samych plików XML, których używali wcześniej do ustawiania konfiguracji ogólnosystemowej. Implementacja referencyjna dla IConfig zawiera kod niezbędny do reprezentowania informacji z pliku XML przy użyciu typów danych AIDL, co ułatwia konwersję z XML na AIDL.

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

<call_screen_mode_supported>
<engine_library>
Podzielone na dwie różne metody:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> , LUB
<volumeGroups> , <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled został usunięty z pliku konfiguracyjnego, ponieważ ten element konfiguracyjny nie jest używany w systemie. Wszystkie urządzenia muszą mieć włączoną funkcję DRC.

Funkcjonalność związana z funkcjami

Metody interfejsu API HIDL Interfejs API AIDL
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

Przestarzałe metody

Metody interfejsu API HIDL Uwagi
IDevice.initCheck
IDevice.close
Moduł HAL publikuje się w ServiceManager tylko po pomyślnej inicjalizacji. W tym momencie uważa się, że jest ono trwałe i nie można go zamknąć.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Obsługa poprawek, pauzy, wznawiania i drenażu jest obowiązkowa.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Przestarzały.

Rozszerzenia dostawcy

W interfejsie API HIDL rozszerzenia dostawców są implementowane przy użyciu metod getParameters lub setParameters z interfejsów IDevice i IStream . Metody te akceptują dowolne ciągi. W API AIDL istnieją odpowiednie metody, takie jak getVendorParameters lub setVendorParameters , które pobierają dowolne instancje Parcelable za pomocą enkapsulacji w ParcelableHolders .

Inne zmiany

Inne ogólne zmiany są następujące:

  1. Aby poprawić testowalność API HAL, w wersji AIDL wprowadzamy opcje debugowania, które są wykorzystywane przez testy VTS i są dostępne poprzez paczkę ModuleDebug . Opcje te instruują warstwę HAL, aby emulowała pewne funkcje (na przykład podłączanie urządzeń zewnętrznych), co w przeciwnym razie wymagałoby ręcznej interwencji i użycia zewnętrznego sprzętu testującego.

  2. Usługi HAL muszą zostać ponownie uruchomione, gdy wartość właściwości systemowej sys.audio.restart.hal jest ustawiona na 1 . Ponowne uruchomienie odbywa się poprzez audioserver.rc . Implementując HAL, użyj odpowiedniej nazwy usługi HAL wymienionej w pliku audioserver.rc . W systemie Android 14 nazwa vendor.audio-hal-aidl została dodana specjalnie dla wersji AIDL warstwy HAL.

Efekty HAL

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

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

Fabryka Efektów

Interfejsy API HIDL
(android.hardware.audio.effect@XX)
Interfejsy API AIDL
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects z pustym parametrem UUID
IEffectsFactory.getDescriptor IFactory.queryEffects z parametrem UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfejsy efektów

Interfejsy API HIDL
(android.hardware.audio.effect@XX)
Interfejsy API AIDL
(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 Mapuj do IEffect.command .
IEffect.setParameter lub
IEffect.getParameter w oparciu o typ starszego polecenia HIDL
Nie dotyczy IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Komendy Efektów

Interfejsy API HIDL
(android.hardware.audio.effect@XX)
Interfejsy API AIDL
(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 Przestarzałe w efektach AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT Przestarzałe 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
(tak samo jak VISUALIZER_CMD_CAPTURE )
IEffect.getParameter
EFFECT_CMD_OFFLOAD Przestarzałe.
W AIDL przełączniki trybu odciążania i bez odciążania są obsługiwane w środowisku.
EFFECT_CMD_DUMP Obsługiwane przez wbudowaną transakcję segregatora AIBinder_dump .

Definicja parametrów wspólnego efektu

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

Definicja konkretnych efektów

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