A partir de Android 11, los fabricantes de dispositivos tienen la capacidad para conectar y habilitar automáticamente efectos de audio específicos cuando se haya para capturar o reproducir audio. Una mejora importante es que los efectos de audio insertados en una ruta de acceso de audio implementada completamente debajo de la HAL de audio (conexión directa entre una entrada (dispositivo de salida y de salida) se pueden controlar con el framework de efectos de audio.
Esta función está dirigida principalmente a OEM de la industria automotriz, pero también se puede usar en otros dispositivos diferentes. Una app de ejemplo inserta un efecto de mejora de voz en el sintonizador FM salida cuando se conecta directamente a la bocina a través de la DSP de audio.
Requisitos previos
- En cuanto a cualquier otro efecto de audio, una biblioteca del proveedor debe implementar el efecto y enumerarse
En el archivo de configuración
audio_effects.xml
- El efecto debe ser del tipo procesamiento previo o posterior
(marca
TYPE_PRE_PROC
oTYPE_POST_PROC
establecido enEffectDescriptor.flags
). - Si la implementación del efecto es acelerada por hardware
(marca
HW_ACC_TUNNEL
configurada enEffectDescriptor.flags
), Se puede adjuntar a una ruta de audio completamente conectada debajo de la HAL (sin reproducción o capturar una transmisión de audio abierta en la HAL de audio).
Cómo crear y habilitar un efecto de dispositivo
Se pueden crear instancias de efectos de audio específicos del dispositivo con uno de los dos métodos que se indican a continuación.
Cómo usar un archivo de configuración de efectos de audio
Este método permite la creación estática de un efecto de audio que se adjunta sistemáticamente. y habilitada para cualquier ruta de audio que seleccione un dispositivo específico como receptor o fuente.
Para ello, se debe agregar una sección específica en audio_effects.xml
de la siguiente manera:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Usa una API del sistema
Se agregó un nuevo constructor @SystemApi al
android.media.audiofx.AudioEffect
para crear y habilitar un efecto de dispositivo:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Luego de crear el efecto especificando el ID único de efecto de audio y el descriptor de dispositivo de audio, se puede habilitar o inhabilitar con las APIs de AudioEffect existentes.
También hay una API disponible para consultar si una implementación admite una determinada combinación de dispositivo/efecto.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nuevas APIs de HAL
HAL de efectos de audio
La versión 6.0 de la HAL del efecto de audio tiene una nueva firma para el método createEffect()
para permitir la creación de un efecto adjunto a un dispositivo:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- El
AudioSession
especificado debe serAudioSessionConsts.DEVICE
. AudioIoHandle
se ignora sisession
esAudioSessionConsts.DEVICE
- El
device
se identifica por suAudioPortHandle
único asignado por el framework de audio cuando el dispositivo se selecciona en la HAL de audio con el métodoIDevice::createAudioPatch()
.
HAL de audio
Para admitir la función de efecto de dispositivo, la HAL de audio debe implementar el enrutamiento de audio
con la API de IDevice::createAudioPatch()
. Esto lo indica el
El método IDevice::supportsAudioPatches()
informa true
.
Dos métodos de API nuevos:
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
y
IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
indicarle a la implementación del HAL que se habilitó o inhabilitó un efecto de dispositivo
en un dispositivo determinado.
El dispositivo se identifica por su ID de AudioPortHandle
, que se usa cuando se reproduce un
el parche se crea con el método IDevice::createAudioPatch()
.
Una implementación puede usar las API de HAL de audio si se necesita coordinación entre los HAL de audio y efectos cuando un efecto está habilitado o inhabilitado