Począwszy 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 zostanie wybrane do przechwytywania lub odtwarzania dźwięku. Jednym z głównych ulepszeń jest to, że efekty audio wstawione na ścieżkę audio w całości zaimplementowaną poniżej audio HAL (bezpośrednie połączenie między urządzeniem wejściowym a urządzeniem wyjściowym) mogą być kontrolowane przez platformę efektów audio.
Ta funkcja jest przeznaczona głównie dla producentów OEM z branży motoryzacyjnej, ale można jej również używać w innych obudowach Androida. Przykładowa aplikacja wstawia efekt poprawy głosu na wyjściu tunera FM po bezpośrednim podłączeniu do głośnika poprzez procesor DSP audio.
Warunki wstępne
- Podobnie jak w przypadku innych efektów dźwiękowych, efekt musi zostać zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracyjnym
audio_effects.xml
. - Efekt musi być typu preprocessing lub postprocessing (flaga
TYPE_PRE_PROC
lubTYPE_POST_PROC
ustawiona wEffectDescriptor.flags
). - Jeśli implementacja efektu jest przyspieszana sprzętowo (flaga
HW_ACC_TUNNEL
ustawiona wEffectDescriptor.flags
), można ją podłączyć do ścieżki audio całkowicie podłączonej poniżej warstwy HAL (w warstwie audio HAL nie jest otwarty żaden strumień odtwarzania ani przechwytywania dźwięku).
Utwórz i włącz efekt urządzenia
Efekty dźwiękowe specyficzne dla urządzenia można utworzyć przy użyciu jednej z dwóch poniższych metod.
Użyj pliku konfiguracyjnego efektów dźwiękowych
Metoda ta pozwala na statyczne utworzenie efektu audio, który jest systematycznie dołączany i włączany do dowolnej ścieżki audio, wybierając określone urządzenie jako ujście 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>
Użyj systemowego API
Do klasy android.media.audiofx.AudioEffect
dodano nowy konstruktor @SystemApi umożliwiający utworzenie i włączenie efektu urządzenia:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Po utworzeniu efektu poprzez określenie 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 AudioEffect.
Dostępny jest także interfejs API umożliwiający sprawdzenie, 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ę dla metody createEffect()
umożliwiającą utworzenie efektu dołączonego do urządzenia:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Określona
AudioSession
musi mieć wartośćAudioSessionConsts.DEVICE
. -
AudioIoHandle
jest ignorowane, jeślisession
toAudioSessionConsts.DEVICE
. -
device
jest identyfikowane na podstawie unikalnegoAudioPortHandle
przypisanego przez strukturę audio, gdy urządzenie jest wybierane w warstwie audio HAL za pomocą metodyIDevice::createAudioPatch()
.
Dźwięk HAL
Aby obsługiwać funkcję efektu urządzenia, warstwa audio HAL musi implementować kontrolę routingu audio przy użyciu interfejsu API IDevice::createAudioPatch()
. Wskazuje na to metoda IDevice::supportsAudioPatches()
zgłaszająca true
.
Dwie nowe metody 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 na podstawie identyfikatora AudioPortHandle
, który jest używany podczas tworzenia poprawki audio za pomocą metody IDevice::createAudioPatch()
.
Interfejsy API Audio HAL mogą być używane w implementacji, jeśli wymagana jest koordynacja między warstwami HAL audio i efektowymi, gdy efekt jest włączony lub wyłączony.