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
IConfigzostał 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.getSurroundSoundConfigw Core HAL.W AIDL Audio Effects HAL logika
effectProxyzdefiniowana 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.queryEffectsi 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
IDevicezostał zmieniony naIModulew interfejsie AIDL Audio HAL.AIDL Audio HAL zastępuje
IPrimaryDevice. Platforma wysyła aktualizacje dotyczące bieżącego trybu audio i obrotu ekranu do każdej instancjiIModule. Specjalny interfejsIBluetoothobsługuje parametry związane z połączeniem synchronicznym Bluetooth (BT SCO) i profilem zestawu głośnomówiącego (HFP). Dedykowany interfejsITelephonyzapewnia kontrolę nad funkcjami telefonicznymi. Instancje obu tych interfejsów możesz pobrać z instancji głównej interfejsuIModule. Więcej informacji znajdziesz w tabelach porównawczych w sekcjach Core HAL i Funkcje związane z funkcjonalnością.IDevicesFactoryjest usuwany w AIDL Audio HAL, aby uniknąć nadmiarowości. Moduły HAL (czyliIModuleinstancje interfejsu) są teraz rejestrowane bezpośrednio w Menedżerze usług przy użyciu nazw instancji modułów, takich jakbluetoothlubr_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 sekcji Audio HAL.
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 | 
   StreamDescriptor.Command.pause .start | 
  
IStream.start IStream.stop (MMAP Streams)  | 
   StreamDescriptor.Command.start lub .burst
       .pause (wejście) lub .flush (wyjście) | 
  
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_enabledjest 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.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
   IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.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.initCheckIDevice.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
ModuleDebugparcelable. 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.Gdy platforma lub zestawy testów VTS ustawią właściwość systemową
sys.audio.restart.halna1, usługi HAL muszą zostać ponownie uruchomione. Za ponowne uruchomienie odpowiada plikaudioserver.rc. Podczas wdrażania HAL użyj odpowiedniej nazwy usługi HAL podanej w plikuaudioserver.rc. W Androidzie 14 nazwavendor.audio-hal-aidljest dodawana specjalnie w przypadku wersji AIDL 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 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 | 
   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 |