Efekty dźwiękowe

Od Androida 11 producenci urządzeń mogą automatycznie dołączać i włączać określone efekty dźwiękowe, gdy do przechwytywania lub odtwarzania dźwięku zostanie wybrane dane urządzenie audio. Jednym z głównych ulepszeń jest to, że efekty dźwiękowe wstawione na ścieżce audio w całości zaimplementowanej poniżej HAL audio (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) mogą być sterowane przez framework efektów dźwiękowych.

Ta funkcja jest przeznaczona głównie dla producentów samochodów, ale można jej też używać w innych urządzeniach z Androidem. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest on bezpośrednio połączony z głośnikiem przez DSP audio.

Wymagania wstępne

  • Podobnie jak w przypadku innych efektów dźwiękowych, efekt musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracyjnym audio_effects.xml.
  • Efekt musi być typu przetwarzanie wstępne lub przetwarzanie końcowe (flaga TYPE_PRE_PROC lub TYPE_POST_PROC ustawiona w EffectDescriptor.flags).
  • Jeśli implementacja efektu jest przyspieszana przez sprzęt (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 strumienia audio odtwarzania lub przechwytywania otwartego w HAL audio).

Tworzenie i włączanie efektu urządzenia

Efekty dźwiękowe specyficzne dla urządzenia można tworzyć za pomocą jednej z 2 metod opisanych poniżej.

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

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

W tym celu dodaj do pliku audio_effects.xml tę 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 dodaliśmy 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 dźwiękowego i deskryptora urządzenia audio można go włączać i wyłączać 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 HAL API

HAL efektów dźwiękowych

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

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Określona wartość AudioSession musi być równa AudioSessionConsts.DEVICE.
  • Jeśli session ma wartość AudioSessionConsts.DEVICE, parametr AudioIoHandle jest ignorowany.
  • device jest identyfikowane przez unikalny identyfikator AudioPortHandle przypisany przez framework audio, gdy urządzenie jest wybierane w HAL audio za pomocą metody IDevice::createAudioPatch().

HAL audio

Aby obsługiwać funkcję efektu urządzenia, HAL audio musi implementować sterowanie routingiem audio za pomocą interfejsu IDevice::createAudioPatch() API. Wskazuje na to metoda IDevice::supportsAudioPatches() zwracająca wartość true.

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

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

Interfejsy Audio HAL API mogą być używane przez implementację, jeśli podczas włączania lub wyłączania efektu wymagana jest koordynacja między HAL audio a HAL efektów.