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