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

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

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

Требования

  • Как и любой другой звуковой эффект, этот эффект должен быть реализован с помощью библиотеки поставщика и указан в файле конфигурации audio_effects.xml.
  • Эффект должен быть типа preprocessing или postprocessing (флаг 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

Audio Effect HAL

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