Аудио эффекты

Начиная с Android 11 производители устройств могут автоматически подключать и включать определенные звуковые эффекты, когда данное аудиоустройство выбирается для захвата или воспроизведения звука. Одним из основных улучшений является то, что звуковые эффекты, вставленные в звуковой тракт, полностью реализованный ниже аудио HAL (прямое соединение между устройством ввода и устройством вывода), могут управляться структурой звуковых эффектов.

Эта функция в первую очередь предназначена для OEM-производителей автомобилей, но ее также можно использовать в других форм-факторах Android. Пример приложения вставляет эффект улучшения голоса на выходе FM-тюнера при прямом подключении к динамику через аудио DSP.

Предпосылки

  • Как и любой другой звуковой эффект, эффект должен быть реализован библиотекой поставщика и указан в файле конфигурации audio_effects.xml .
  • Эффект должен иметь тип предварительной обработки или постобработки (флаг TYPE_PRE_PROC или TYPE_POST_PROC установлен в EffectDescriptor.flags ).
  • Если реализация эффекта аппаратно ускорена (флаг HW_ACC_TUNNEL установлен в EffectDescriptor.flags ), он может быть присоединен к аудиоканалу, полностью подключенному ниже HAL (аудиопоток воспроизведения или захвата не открыт в аудио HAL).

Создание и включение эффекта устройства

Звуковые эффекты для конкретных устройств можно создать с помощью одного из двух методов, указанных ниже.

Использование файла конфигурации звуковых эффектов

Этот метод позволяет статично создавать звуковой эффект, который систематически прикрепляется и включается к любому звуковому тракту, выбирая указанное устройство в качестве приемника или источника.

Это делается путем добавления определенного раздела в файл audio_effects.xml следующим образом:

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

Использование системного API

В класс android.media.audiofx.AudioEffect добавлен новый конструктор @SystemApi для создания и включения эффекта устройства:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

После создания эффекта путем указания уникального идентификатора аудиоэффекта и дескриптора аудиоустройства его можно включить или отключить с помощью существующих API-интерфейсов AudioEffect.

API также доступен для запроса, поддерживает ли реализация данную комбинацию устройства/эффекта.

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

Новые API-интерфейсы HAL

Звуковой эффект HAL

Звуковой эффект HAL V6.0 имеет новую сигнатуру для createEffect() , позволяющую создавать эффект, прикрепленный к устройству:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Указанный AudioSession должен быть AudioSessionConsts.DEVICE .
  • AudioIoHandle игнорируется, если session AudioSessionConsts.DEVICE .
  • device идентифицируется по его уникальному AudioPortHandle , назначаемому звуковой структурой, когда устройство выбирается в звуковом HAL с IDevice::createAudioPatch() .

Аудио ХАЛ

Для поддержки функции эффекта устройства звуковой HAL должен реализовать управление маршрутизацией звука с помощью IDevice::createAudioPatch() . На это указывает метод IDevice::supportsAudioPatches() , сообщающий true .

Два новых метода API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) и IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) сообщают реализации HAL, что эффект устройства был включен или отключен на данном устройстве.

Устройство идентифицируется по его идентификатору AudioPortHandle , который используется при создании аудиопатча с помощью IDevice::createAudioPatch() .

API-интерфейсы Audio HAL могут использоваться реализацией, если требуется координация между HAL аудио и эффектов, когда эффект включен или отключен.