Od Androida 14 zachęcamy partnerów i dostawców układów SoC do zastąpienia obecnej implementacji HIDL HAL implementacją AIDL HAL.
Aby ułatwić przejście z HIDL Audio HAL na AIDL Audio HAL, na tej stronie przedstawiamy najważniejsze różnice między nimi. Na tej stronie znajdziesz też mapowanie interfejsów AIDL i HIDL dla warstwy HAL audio.
Różnica między implementacją AIDL a 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 systemowych w plikach XML w HIDL HAL. Platforma odczytuje te parametry z podstawowej warstwy HAL zamiast z pliku konfiguracji dostawcy. Na przykład lista formatów dźwięku przestrzennego, które są udostępniane użytkownikowi do sterowania, jest dostarczana przez metodęIConfig.getSurroundSoundConfig
w Core HAL.W AIDL Audio Effects HAL logika
effectProxy
zdefiniowana w plikach XML w HIDL Effects HAL jest przenoszona do frameworka audio. Platforma audio wysyła zapytania do wszystkich instancji efektów w systemie za pomocąIFactory.queryEffects
i do wszystkich procesów efektów za pomocąIFactory.queryProcessing
.Aby uniknąć nieporozumień związanych z używaniem terminu device w przypadku typów urządzeń audio, w interfejsie HIDL Audio HAL parametr
IDevice
został zmieniony naIModule
w interfejsie AIDL Audio HAL.IPrimaryDevice
jest zastępowany w AIDL Audio HAL. Aktualizacje dotyczące bieżącego trybu audio i obrotu ekranu są wysyłane do każdej instancjiIModule
. Parametry związane z połączeniem synchronicznym Bluetooth (BT SCO) i profilem zestawu głośnomówiącego (HFP) są obsługiwane przez dedykowany interfejsIBluetooth
. Dedykowany interfejsITelephony
udostępnia elementy sterujące specyficzne dla telefonii. Instancje obu tych interfejsów można pobrać z głównej instancji interfejsuIModule
. Więcej informacji znajdziesz w tabelach porównawczych w sekcjach Core HAL i Funkcje.IDevicesFactory
jest usuwany w AIDL Audio HAL, aby uniknąć nadmiarowości. Moduły HAL (czyliIModule
instancje interfejsu) są teraz rejestrowane bezpośrednio w Menedżerze usług przy użyciu ich nazw jako nazw instancji, np.bluetooth
lubr_submix
. Jedynym wyjątkiem jest modułprimary
, który rejestruje się pod nazwą instancjidefault
.
Mapowanie warstw HAL audio w językach AIDL i HIDL
Tabele w sekcjach poniżej pokazują mapowanie między interfejsami HIDL i AIDL Audio HAL. Więcej informacji o strukturze katalogu znajdziesz w pliku README interfejsu HAL audio.
Podstawowa warstwa 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 API HIDL i pliki konfiguracyjne | Interfejsy API AIDL |
---|---|
IDevicesFactory |
Rejestracja domeny IModule w usłudze ServiceManager . |
IDevice |
IModule |
IPrimaryDevice |
ITelephony IBluetooth |
IStream IStreamIn
IStreamOut |
StreamDescriptor IStreamIn
IStreamCommon
IStreamOut |
audio_policy_configuration.xml
audio_policy_engine_configuration.xml |
IConfig IModule |
Pliki konfigurowalnych zasad dotyczących dźwięku | W przypadku Androida 14 użyj implementacji HIDL. |
Porty audio, profile dynamiczne, trasy i ścieżki
W tej tabeli elementy plików XML są oznaczone nawiasami ostrymi.
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 , nominal latency i minimalny rozmiar bufora są częścią struktury AudioPatch zwracanej przez HAL.
Rzeczywisty rozmiar bufora w klatkach jest częścią struktury StreamDescriptor , podobnie jak rozmiar klatki w bajtach. Rozmiar bufora w bajtach można obliczyć, mnożąc te 2 wartości. |
Połączenie efektów audio
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 obejmująca cały system
Konfiguracja obejmująca cały system, która była wcześniej zdefiniowana w plikach konfiguracji XML zasad audio (czyli audio_policy_configuration.xml
i audio_policy_engine_configuration.xml
), musi być podana w IConfig
.
Aby jednak ułatwić przejście na AIDL, dostawcy nadal mogą używać tych samych plików XML, których wcześniej używali do konfigurowania całego systemu. Implementacja referencyjna IConfig
zawiera kod niezbędny 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 API AIDL |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
Podzielone na 2 metody:ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> LUB
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
jest usuwany z pliku konfiguracyjnego, ponieważ ten element konfiguracji nie jest używany w systemie. Na wszystkich urządzeniach musi być włączona funkcja DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Funkcje związane 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 |
Wycofane metody
Metody interfejsu API HIDL | Komentarze |
---|---|
IDevice.initCheck IDevice.close |
Moduł HAL publikuje się za pomocą ServiceManager tylko po pomyślnej inicjalizacji. W tym momencie jest ona uznawana za trwałą i nie można jej zamknąć. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
Obsługa poprawek, wstrzymywania, wznawiania i wyłączania jest obowiązkowa. |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
Przestarzałe. |
Rozszerzenia dostawców
W interfejsie HIDL API rozszerzenia dostawcy są implementowane za pomocą metod getParameters
lub setParameters
z interfejsów IDevice
i IStream
. Te metody akceptują dowolne ciągi znaków.
W interfejsie AIDL API istnieją odpowiednie metody, takie jak getVendorParameters
lub setVendorParameters
, które przyjmują dowolne instancje Parcelable
, używając enkapsulacji w ParcelableHolders
.
Inne zmiany
Inne ogólne zmiany:
Aby zwiększyć możliwość testowania interfejsów API HAL, w wersji AIDL wprowadzamy opcje debugowania, które są używane przez testy VTS i dostępne za pomocą typu
ModuleDebug
parcelable. Te opcje instruują HAL, aby emulował pewne funkcje (np. połączenie urządzeń zewnętrznych), które w inny sposób wymagają ręcznej interwencji i użycia zewnętrznego sprzętu testowego.Usługi HAL muszą zostać ponownie uruchomione, gdy wartość właściwości systemowej
sys.audio.restart.hal
zostanie ustawiona na1
. Ponowne uruchomienie odbywa się za pomocąaudioserver.rc
. Podczas wdrażania HAL używaj odpowiedniej nazwy usługi HAL wymienionej w plikuaudioserver.rc
. W Androidzie 14 nazwavendor.audio-hal-aidl
jest dodawana specjalnie w przypadku wersji AIDL interfejsu HAL.
Warstwa HAL efektów
Wszystkie interfejsy HIDL znajdują się w 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 API HIDL i pliki konfiguracyjne | Interfejsy API AIDL |
---|---|
IEffectsFactory |
IFactory |
IEffect |
IEffect |
audio_effects.xml |
IEffect |
Effect Factory
Interfejsy HIDL API (android.hardware.audio.effect@X.X) |
Interfejsy API AIDL (android.hardware.audio.effect) |
---|---|
IEffectsFactory.getAllDescriptors |
IFactory.queryEffects z parametrem UUID o wartości null |
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 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 |
Mapowanie na IEffect.command , IEffect.setParameter lub IEffect.getParameter na podstawie 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 AIDL HAL efektów |
EFFECT_CMD_SET_PARAM_COMMIT |
Wycofane w AIDL HAL efektów |
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 |
Wycofano.
W przypadku AIDL przełączanie między trybami odciążania i bez odciążania jest obsługiwane w ramach platformy. |
EFFECT_CMD_DUMP |
Obsługiwane przez wbudowaną transakcję bindera AIBinder_dump . |
Definicja parametrów efektu wspólnego
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 API AIDL (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |