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