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

Начиная с 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 игнорируется, если 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 аудио и эффектов при включении или отключении эффекта.