Efectos de audio

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 completamente implementada por debajo de la HAL (conexión directa entre un dispositivo de entrada y un dispositivo de salida) de audio pueden controlarse mediante el marco de efectos de audio.

Esta función está dirigida principalmente a los 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 está insertando 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

  • En cuanto a cualquier otro efecto de audio, el efecto debe ser implementado por una biblioteca de proveedores y enumerado en el archivo de configuración audio_effects.xml .
  • El efecto debe ser de tipo preprocesamiento o posprocesamiento (flag TYPE_PRE_PROC o TYPE_POST_PROC establecido en EffectDescriptor.flags ).
  • Si la implementación del efecto es HW acelerada ( HW_ACC_TUNNEL configurada en EffectDescriptor.flags ), se puede adjuntar a una ruta de audio completamente conectada debajo de la HAL (sin reproducción o captura de flujo de audio abierto en la HAL de audio).

Creación y activación de un efecto de dispositivo

Los efectos de audio específicos del dispositivo se pueden instanciar mediante uno de los dos métodos siguientes.

Uso de 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>
  

Uso de 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 que se crea el efecto especificando el ID de efecto de audio único y el descriptor del dispositivo de audio, se puede habilitar o deshabilitar con las API de AudioEffect existentes.

También está disponible una API para consultar si una implementación es compatible con 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 ser AudioSessionConsts.DEVICE .
  • AudioIoHandle se ignora si la session es AudioSessionConsts.DEVICE .
  • El device se identifica por su AudioPortHandle único asignado por el marco de audio cuando el dispositivo se selecciona en la HAL de audio con IDevice::createAudioPatch() .

HAL de audio

Para admitir la función de efecto de dispositivo, la HAL de audio debe implementar el control de enrutamiento de audio mediante la IDevice::createAudioPatch() . Esto lo indica el IDevice::supportsAudioPatches() que informa true .

Dos nuevos métodos de API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) le indican a la implementación de 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 IDevice::createAudioPatch() .

Las API HAL de audio pueden ser utilizadas por una implementación si se necesita coordinación entre las HAL de audio y efectos cuando un efecto está habilitado o deshabilitado.