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życiuIFactory.queryEffects
, a wszystkie procesy przetwarzania efektów przy użyciuIFactory.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 naIModule
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 instancjiIModule
. Parametry związane z połączeniem synchronicznym Bluetooth (BT SCO) i profilem głośnomówiącym (HFP) są obsługiwane przez dedykowany interfejsIBluetooth
. Dedykowany interfejsITelephony
zapewnia kontrolę specyficzną dla telefonii. Instancje obu tych interfejsów można pobrać z podstawowej instancji interfejsuIModule
. 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 interfejsuIModule
) są teraz rejestrowane bezpośrednio w Service Managerze przy użyciu ich nazw jako nazw instancji, takich jakbluetooth
lubr_submix
. Jedynym wyjątkiem jest modułprimary
, który rejestruje się pod nazwą instancjidefault
.
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.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> <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 |
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:
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.Usługi HAL muszą zostać ponownie uruchomione, gdy wartość właściwości systemowej
sys.audio.restart.hal
jest ustawiona na1
. Ponowne uruchomienie odbywa się poprzezaudioserver.rc
. Implementując HAL, użyj odpowiedniej nazwy usługi HAL wymienionej w plikuaudioserver.rc
. W systemie Android 14 nazwavendor.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 lubIEffect.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 |