Efekty dźwiękowe

Począwszy od systemu Android 11, producenci urządzeń mają możliwość automatycznego dołączania i włączania określonych efektów dźwiękowych, gdy dane urządzenie audio jest wybrane do przechwytywania lub odtwarzania dźwięku. Jednym z głównych ulepszeń jest to, że efekty audio umieszczone na ścieżce audio w całości zaimplementowane poniżej audio HAL (bezpośrednie połączenie między urządzeniem wejściowym a urządzeniem wyjściowym) mogą być kontrolowane przez strukturę efektów audio.

Ta funkcja jest skierowana przede wszystkim do producentów OEM z branży motoryzacyjnej, ale może być również używana w innych obudowach Androida. Przykładową aplikacją jest wstawianie efektu wzmocnienia głosu na wyjściu tunera FM po bezpośrednim podłączeniu do głośnika przez DSP audio.

Warunki wstępne

  • Podobnie jak w przypadku każdego innego efektu dźwiękowego, efekt musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracyjnym audio_effects.xml .
  • Efekt musi być typu preprocessing lub postprocessing (flaga TYPE_PRE_PROC lub TYPE_POST_PROC ustawiona w EffectDescriptor.flags ).
  • Jeśli implementacja efektu jest akcelerowana sprzętowo (flaga HW_ACC_TUNNEL ustawiona w EffectDescriptor.flags ), może być dołączona do ścieżki audio całkowicie połączonej poniżej warstwy HAL (brak odtwarzania lub przechwytywania strumienia audio otwartego w warstwie HAL audio).

Tworzenie i włączanie efektu urządzenia

Efekty dźwiękowe specyficzne dla urządzenia można utworzyć za pomocą jednej z dwóch poniższych metod.

Korzystanie z pliku konfiguracyjnego efektów dźwiękowych

Ta metoda pozwala na statyczne tworzenie efektu audio, który jest systematycznie dołączany i włączany do dowolnej ścieżki audio wybierając określone urządzenie jako źródło lub źródło.

Odbywa się to poprzez dodanie określonej sekcji w pliku audio_effects.xml w następujący sposób:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

Korzystanie z systemowego API

Do klasy android.media.audiofx.AudioEffect dodano nowy konstruktor @SystemApi, który umożliwia tworzenie i włączanie efektu urządzenia:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Po utworzeniu efektu przez określenie unikalnego identyfikatora efektu audio i deskryptora urządzenia audio można go włączyć lub wyłączyć za pomocą istniejących interfejsów API AudioEffect.

Dostępny jest również interfejs API do zapytania, czy implementacja obsługuje daną kombinację urządzenia/efektu.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Nowe interfejsy API HAL

Efekt dźwiękowy HAL

Efekt dźwiękowy HAL V6.0 ma nową sygnaturę metody createEffect() umożliwiającą tworzenie efektu dołączonego do urządzenia:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Określona AudioSession musi mieć AudioSessionConsts.DEVICE .
  • AudioIoHandle jest ignorowany, jeśli session to AudioSessionConsts.DEVICE .
  • device jest identyfikowane przez swój unikalny AudioPortHandle przypisany przez strukturę audio, gdy urządzenie jest wybierane w warstwie HAL dźwięku za pomocą IDevice::createAudioPatch() .

Dźwięk HAL

Aby obsługiwać funkcję efektu urządzenia, audio HAL musi implementować kontrolę routingu audio za pomocą interfejsu API IDevice::createAudioPatch() . Wskazuje na to IDevice::supportsAudioPatches() raportująca true .

Dwie nowe metody interfejsu API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) i IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) informują implementację HAL, że efekt urządzenia został włączony lub wyłączony na danym urządzeniu.

Urządzenie jest identyfikowane przez jego identyfikator AudioPortHandle , który jest używany podczas tworzenia poprawki audio za pomocą metody IDevice::createAudioPatch() .

Interfejsy API warstwy HAL dźwięku mogą być używane przez implementację, jeśli wymagana jest koordynacja między warstwami HAL dźwięku i efektów, gdy efekt jest włączony lub wyłączony.