A partir de Android 11, los fabricantes de dispositivos tienen la capacidad de adjuntar y habilitar automáticamente efectos de audio específicos cuando se selecciona un dispositivo de audio determinado para la captura o reproducción de audio. Una mejora importante es que los efectos de audio insertados en una ruta de audio implementada completamente debajo del HAL de audio (conexión directa entre un dispositivo de entrada y un dispositivo de salida) pueden controlarse mediante el marco de efectos de audio.
Esta característica está dirigida principalmente a fabricantes de equipos originales de automóviles, pero también se puede utilizar en otros factores de forma de Android. Una aplicación de ejemplo inserta un efecto de mejora de voz en la salida del sintonizador de FM cuando se conecta directamente al altavoz a través del DSP de audio.
Requisitos previos
- Al igual que con cualquier otro efecto de audio, el efecto debe implementarse mediante una biblioteca del proveedor y figurar en el archivo de configuración
audio_effects.xml
. - El efecto debe ser de tipo preprocesamiento o posprocesamiento (marca
TYPE_PRE_PROC
oTYPE_POST_PROC
configurada enEffectDescriptor.flags
). - Si la implementación del efecto está acelerada por HW (marca
HW_ACC_TUNNEL
configurada enEffectDescriptor.flags
), se puede adjuntar a una ruta de audio completamente conectada debajo del HAL (no se abre ninguna reproducción ni captura de flujo de audio en el HAL de audio).
Crear y habilitar un efecto de dispositivo
Se pueden crear instancias de efectos de audio específicos del dispositivo utilizando uno de los dos métodos siguientes.
Utilice 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 y habilita sistemáticamente a cualquier ruta de audio seleccionando un dispositivo específico como sumidero o fuente.
Esto se hace agregando una sección específica en el archivo audio_effects.xml
de la siguiente manera:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Utilice una API del sistema
Se agregó un nuevo constructor @SystemApi a la clase android.media.audiofx.AudioEffect
para crear y habilitar un efecto de dispositivo:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Una vez creado el efecto especificando el ID exclusivo del efecto de audio y el descriptor del dispositivo de audio, se puede habilitar o deshabilitar con las API AudioEffect existentes.
También está disponible una API para consultar si una implementación admite una determinada combinación de dispositivo/efecto.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nuevas API HAL
Efecto de audio HAL
El efecto de audio HAL V6.0 tiene una nueva firma para el método createEffect()
que permite la creación de un efecto adjunto a un dispositivo:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- La
AudioSession
especificada debe serAudioSessionConsts.DEVICE
. -
AudioIoHandle
se ignora si lasession
esAudioSessionConsts.DEVICE
. - El
device
se identifica por suAudioPortHandle
único asignado por el marco de audio cuando el dispositivo se selecciona en el HAL de audio con el métodoIDevice::createAudioPatch()
.
AudioHAL
Para admitir la función de efecto del dispositivo, el HAL de audio debe implementar el control de enrutamiento de audio mediante la API IDevice::createAudioPatch()
. Esto lo indica el método IDevice::supportsAudioPatches()
que informa true
.
Dos nuevos métodos API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
le indican a la implementación HAL que un efecto de dispositivo se ha habilitado o deshabilitado en un dispositivo determinado.
El dispositivo se identifica por su ID AudioPortHandle
, que se utiliza cuando se crea un parche de audio con el método IDevice::createAudioPatch()
.
Las API de Audio HAL pueden ser utilizadas por una implementación si se necesita coordinación entre el audio y los HAL de efectos cuando un efecto está habilitado o deshabilitado.