Od Androida 14 partnerzy i dostawców układów SoC zachęcamy do zastąpienia obecnej implementacji HIDL HAL implementacją AIDL HAL.
Aby ułatwić przejście z interfejsu HIDL Audio HAL na interfejs AIDL Audio HAL, na tej stronie wyróżniliśmy niektóre kluczowe różnice. Ta strona zawiera też mapowanie interfejsów AIDL i HIDL dla Audio HAL.
Różnica 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 Core HAL, a nie z pliku konfiguracyjnego dostawcy. Na przykład lista formatów dźwięku przestrzennego, które są wyświetlane 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 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 naIModule
w AIDL Audio HAL.IPrimaryDevice
zostanie zastąpiony 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 Bluetooth Synchronous Connection Oriented (BT SCO) i Profilem zestawu głośnomówiącego (HFP) są obsługiwane przez specjalny interfejsIBluetooth
. Specjalny interfejsITelephony
zapewnia ustawienia dotyczące telefonu. Wystąpienia obu tych interfejsów można pobrać z głównego wystąpienia interfejsuIModule
. Więcej informacji znajdziesz w tabelach porównawczych Core HAL i Funkcje związane z funkcjami.Aby uniknąć nadmiarowości, w interfejsie HAL Audio w AIDL usunięto element
IDevicesFactory
. Moduł HAL (czyli instancje interfejsuIModule
) są teraz rejestrowane bezpośrednio w menedżerze usług przy użyciu nazw instancji, takich jakbluetooth
lubr_submix
. Jedynym wyjątkiem jest modułprimary
, który rejestruje się pod nazwą instancjidefault
.
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 konfiguracyjne HIDL API | Interfejsy API AIDL |
---|---|
IDevicesFactory |
Rejestracja domeny 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 |
Pliki konfiguracji 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.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.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 , 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 , razem z rozmiarem klatki w bajtach. Wielkość 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 w całym systemie
Konfiguracja dla całego systemu, która została wcześniej zdefiniowana w plikach konfiguracji zasad audio (czyli audio_policy_configuration.xml
i audio_policy_engine_configuration.xml
), musi być udostępniana za pomocą usługi 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> <call_screen_mode_supported>
<engine_library> |
Podzieliliśmy na 2 różne metody:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> LUB
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
zostanie usunięty 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 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ą 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 rozładowywania 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 IDevice
i IStream
. 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:
Aby poprawić możliwość testowania interfejsów HAL API, w wersji AIDL wprowadzamy opcje debugowania, które są używane w testach VTS i są dostępne w pakiecie
ModuleDebug
. Te opcje instruują HAL, aby emulował określone funkcje (np. połączenie urządzeń zewnętrznych), które w innym przypadku wymagają ręcznej interwencji i zastosowania zewnętrznego sprzętu testowego.Usługi HAL wymagają ponownego uruchomienia, gdy wartość właściwości systemowej
sys.audio.restart.hal
jest ustawiona na1
. Ponowne uruchamianie odbywa się przezaudioserver.rc
. Podczas implementowania HAL użyj odpowiedniej nazwy usługi HAL podanej w plikuaudioserver.rc
. W Androidzie 14 nazwavendor.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 HIDL API i pliki konfiguracyjne | 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 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 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 trybem 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 |