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

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

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

Предпосылки

  • Как и любой другой звуковой эффект, он должен быть реализован библиотекой поставщика и указан в файле конфигурации 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 игнорируется, если sessionAudioSessionConsts.DEVICE .
  • device идентифицируется по его уникальному AudioPortHandle назначаемому аудиофреймворком, когда устройство выбирается в аудио HAL с помощью метода IDevice::createAudioPatch() .

Аудио HAL

Для поддержки функции эффектов устройства аудио-HAL должен реализовывать управление маршрутизацией звука с помощью API 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 при включении или отключении эффекта.