Efectos de audio

A partir de Android 11, los fabricantes de dispositivos tienen la capacidad de incluir y habilitar automáticamente efectos de audio específicos cuando se selecciona un determinado dispositivo de audio para captura o reproducción. Una mejora importante es que el framework de efectos de audio puede controlar los efectos de audio insertados en una ruta de audio implementada por completo debajo del HAL de audio (conexión directa entre un dispositivo de entrada y un dispositivo de salida).

Esta función está dirigida principalmente a los OEM de la industria automotriz, pero también se puede usar en otros factores de forma de Android. Un ejemplo de app es insertar un efecto de mejora de voz en la salida del sintonizador de FM cuando se conecta directamente a la bocina a través del DSP de audio.

Requisitos previos

  • Al igual que con cualquier otro efecto de audio, una biblioteca del proveedor debe implementar el efecto y enumerarlo en el archivo de configuración audio_effects.xml.
  • El efecto debe ser de tipo procesamiento previo o posterior (marca TYPE_PRE_PROC o TYPE_POST_PROC configurada en EffectDescriptor.flags).
  • Si la implementación del efecto está acelerada por HW (la marca HW_ACC_TUNNEL se establece en EffectDescriptor.flags), se puede adjuntar a una ruta de audio completamente conectada debajo del HAL (no se abre ninguna transmisión de audio de reproducción o captura en el HAL de audio).

Cómo crear y habilitar un efecto de dispositivo

Se puede crear una instancia de los efectos de audio específicos del dispositivo con uno de los siguientes dos métodos.

Usa 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 de forma sistemática a cualquier ruta de audio que seleccione un dispositivo específico como destino o fuente.

Para ello, agrega 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>
  

Usa 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);

Después de crear el efecto especificando el ID de efecto de audio único 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

El HAL de efectos de audio V6.0 tiene una nueva firma para el método createEffect() que permite crear un efecto conectado a un dispositivo:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • El AudioSession especificado debe ser AudioSessionConsts.DEVICE.
  • Se ignora AudioIoHandle si session es AudioSessionConsts.DEVICE.
  • El device se identifica por su AudioPortHandle único que asigna el framework de audio cuando se selecciona el dispositivo en la HAL de audio con el método IDevice::createAudioPatch().

HAL de audio

Para admitir la función de efectos del dispositivo, el HAL de audio debe implementar el control de enrutamiento de audio con la API de IDevice::createAudioPatch(). Esto se indica mediante el informe true del método IDevice::supportsAudioPatches().

Dos métodos de API nuevos, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) y IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), le indican a la implementación de HAL que se habilitó o inhabilitó un efecto de dispositivo en un dispositivo determinado.

El dispositivo se identifica por su ID AudioPortHandle, que se usa cuando se crea un parche de audio con el método IDevice::createAudioPatch().

Una implementación puede usar las APIs de Audio HAL si se necesita coordinación entre los HAL de audio y de efectos cuando se habilita o inhabilita un efecto.