Начиная с 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 ID, который используется при создании аудиопатча с помощью метода IDevice::createAudioPatch() .
API-интерфейсы Audio HAL могут использоваться реализацией, если требуется координация между аудио- и эффект-HAL при включении или выключении эффекта.