Efekty dźwiękowe

Od Androida 11 producenci urządzeń mają możliwość aby automatycznie dołączać i włączać określone efekty dźwiękowe, gdy dane urządzenie audio jest wybrany do przechwytywania lub odtwarzania dźwięku. Istotną poprawą jest to, że wstawiane efekty dźwiękowe na ścieżce audio w całości zaimplementowanej poniżej audio HAL (bezpośrednie połączenie między wejściem urządzenia i urządzenia wyjściowego) można sterować za pomocą platformy efektów audio.

Ta funkcja jest przeznaczona głównie dla firm motoryzacyjnych OEM, ale może być używana również na urządzeniach z Androidem i formatów. Przykładowa aplikacja dodaje efekt ulepszenia głosu w tunerze FM bezpośrednio z głośnika przez procesor DSP audio.

Wymagania wstępne

  • Podobnie jak w przypadku innych efektów dźwiękowych, efekt ten musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracji audio_effects.xml.
  • Efekt musi być typu wstępnego lub końcowego przetwarzania (flaga TYPE_PRE_PROC lub TYPE_POST_PROC ustawiony w funkcji EffectDescriptor.flags).
  • Jeśli implementacja efektu jest przyspieszona sprzętowo (flaga HW_ACC_TUNNEL jest ustawiona w EffectDescriptor.flags), można ją dołączyć do ścieżki audio całkowicie połączonej poniżej HAL (bez odtwarzania lub przechwytywania strumienia audio otwartego w HAL dźwięku).

Utwórz i włącz efekt urządzenia

Wystąpienia efektów dźwiękowych specyficznych dla urządzenia można utworzyć za pomocą jednej z 2 poniższych metod.

Użyj pliku konfiguracji efektów dźwiękowych

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

Aby to zrobić, dodaj do pliku audio_effects.xml odpowiednią sekcję w ten sposób:

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

Użyj systemowego interfejsu 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 podanie unikalnego identyfikatora efektu dźwiękowego 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 do wysyłania zapytań, aby sprawdzić, czy implementacja obsługuje określoną kombinację urządzenia i efektu.

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

Nowe interfejsy HAL

Interfejs HAL efektów dźwiękowych

Interfejs HAL efektów dźwiękowych w wersji 6.0 ma nowy podpis dla metody createEffect(), która umożliwia tworzenie efektów dołączonych do urządzenia:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Wskazany parametr AudioSession musi być AudioSessionConsts.DEVICE.
  • Wartość AudioIoHandle jest ignorowana, jeśli pole session ma wartość AudioSessionConsts.DEVICE
  • device jest identyfikowany przez swój unikalny AudioPortHandle przypisany przez interfejs audio, gdy urządzenie zostanie wybrane w interfejsie audio HAL za pomocą metody IDevice::createAudioPatch().

Interfejs HAL dźwięku

Aby obsługiwać funkcję efektów urządzenia, HAL audio musi zaimplementować kontrolę kierowania dźwięku za pomocą interfejsu API IDevice::createAudioPatch(). Jest to wskazywane przez tag Raportowanie metod IDevice::supportsAudioPatches() true.

2 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 za pomocą identyfikatora AudioPortHandle, który jest używany, gdy dźwięk poprawka jest tworzona za pomocą metody IDevice::createAudioPatch().

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