Efekty dźwiękowe

Od Androida 11 producenci urządzeń mogą automatycznie dołączać i włączać określone efekty dźwiękowe, gdy wybrane urządzenie audio jest używane do przechwytywania lub odtwarzania dźwięku. Jedną z głównych zmian jest to, że efektami dźwiękowymi wstawianymi na ścieżce audio implementowanej całkowicie poniżej interfejsu HAL (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) można sterować za pomocą ramki efektów dźwiękowych.

Ta funkcja jest przeznaczona głównie dla producentów OEM w branży motoryzacyjnej, ale może być też używana w przypadku innych formułek Androida. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest bezpośrednio połączona z głośnikiem za pomocą 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 pre-processing lub post-processing (flaga TYPE_PRE_PROC lub TYPE_POST_PROC ustawiona w EffectDescriptor.flags).
  • Jeśli implementacja efektu jest przyspieszona sprzętowo (flaga HW_ACC_TUNNEL 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 audio).

Tworzenie i włączanie efektu urządzenia

Efekty dźwiękowe dla poszczególnych urządzeń można instancjonować za pomocą jednej z tych 2 metod.

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

Ta metoda umożliwia tworzenie statycznych efektów dźwiękowych, które są systematycznie dołączane i włączane do dowolnej ścieżki audio, wybierając określone urządzenie jako odbiornik lub źródło.

Aby to zrobić, dodaj w 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>
  

Korzystanie z 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 dźwiękowego i deskryptora urządzenia audio można go włączyć lub wyłączyć za pomocą istniejących interfejsów API efektów dźwiękowych.

Interfejs API umożliwia też sprawdzanie, czy implementacja obsługuje daną kombinację urządzenia i efektu.

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

Nowe interfejsy HAL

Warstwa HAL efektów dźwiękowych

Efekt dźwiękowy HAL V6.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 wartość session to AudioSessionConsts.DEVICE.
  • device jest identyfikowany przez 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, interfejs HAL dźwięku musi implementować kontrolę routingu dźwięku za pomocą interfejsu API IDevice::createAudioPatch(). Jest to wskazane w raportach dotyczących metody 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 podczas tworzenia łatki audio za pomocą metody IDevice::createAudioPatch().

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