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