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
lubTYPE_POST_PROC
ustawiony w funkcjiEffectDescriptor.flags
). - Jeśli implementacja efektu jest przyspieszona sprzętowo (flaga
HW_ACC_TUNNEL
jest ustawiona wEffectDescriptor.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 polesession
ma wartośćAudioSessionConsts.DEVICE
device
jest identyfikowany przez swój unikalnyAudioPortHandle
przypisany przez interfejs audio, gdy urządzenie zostanie wybrane w interfejsie audio HAL za pomocą metodyIDevice::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.