Efekty dźwiękowe

Od Androida 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 efektami dźwiękowymi wstawionymi na ścieżce audio w całości zaimplementowanej poniżej warstwy HAL audio (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) można sterować za pomocą platformy efektów dźwiękowych.

Ta funkcja jest przeznaczona głównie dla producentów OEM z branży motoryzacyjnej, ale można jej używać także w przypadku innych urządzeń z Androidem. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest bezpośrednio połączona z głośnikiem przez procesor DSP audio.

Wymagania wstępne

  • Podobnie jak w przypadku innych efektów audio, efekt musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w audio_effects.xml pliku konfiguracyjnym.
  • 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żna ją dołączyć do ścieżki audio w całości połączonej poniżej HAL (bez otwartego strumienia audio odtwarzania lub przechwytywania w HAL audio).

Tworzenie i włączanie efektu na urządzeniu

Efekty dźwiękowe specyficzne dla urządzenia można utworzyć za pomocą jednej z tych 2 metod.

Używanie pliku konfiguracji efektów audio

Ta metoda umożliwia statyczne tworzenie efektu audio, który jest systematycznie dołączany i włączany na dowolnej ścieżce audio, która wybiera określone urządzenie jako odbiornik lub źródło.

W tym celu dodaj w pliku audio_effects.xml odpowiednią sekcję:

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

Używanie interfejsu API systemu

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 podanie unikalnego identyfikatora efektu audio i deskryptora urządzenia audio można go włączyć lub wyłączyć za pomocą istniejących interfejsów AudioEffect API.

Dostępny jest też interfejs API, który umożliwia sprawdzenie, czy implementacja obsługuje daną kombinację urządzenia i efektu.

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

Nowe interfejsy API HAL

Warstwa HAL efektów audio

Interfejs HAL efektu audio w wersji 6.0 ma nowy podpis metody createEffect(), która umożliwia tworzenie efektu dołączonego do urządzenia:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Podana wartość AudioSession musi być równa AudioSessionConsts.DEVICE.
  • Wartość AudioIoHandle jest ignorowana, jeśli wartość session to AudioSessionConsts.DEVICE.
  • device jest identyfikowany przez unikalny AudioPortHandle przypisany przez platformę audio, gdy urządzenie jest wybierane w warstwie HAL audio za pomocą metody IDevice::createAudioPatch().

HAL dźwięku

Aby obsługiwać funkcję efektu urządzenia, warstwa HAL audio musi implementować sterowanie routowaniem dźwięku za pomocą interfejsu IDevice::createAudioPatch() API. Wskazuje na to metoda IDevice::supportsAudioPatches(), która raportuje true.

Dwie nowe metody interfejsu API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)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 za pomocą identyfikatora AudioPortHandle, który jest używany podczas tworzenia poprawki audio za pomocą metody IDevice::createAudioPatch().

Implementacja może korzystać z interfejsów API HAL audio, jeśli podczas włączania lub wyłączania efektu wymagana jest koordynacja między interfejsami HAL audio i efektów.