Efeitos de áudio

A partir do Android 11, os fabricantes do dispositivo podem automaticamente anexar e ativar efeitos de áudio específicos quando determinado dispositivo de áudio é selecionado para captura ou reprodução de áudio. Uma grande melhoria é que os efeitos de áudio inseridos em um caminho de áudio totalmente implementado abaixo da HAL de áudio (conexão direta entre um dispositivo de entrada e um dispositivo de saída) podem ser controlados pelo framework de efeitos de áudio.

Esse recurso é destinado principalmente a OEMs automotivos, mas também pode ser usado em outros formatos do Android. Um exemplo de app é a inserção de um efeito de aprimoramento de voz na saída do sintonizador de FM quando conectado diretamente ao alto-falante pelo DSP de áudio.

Pré-requisitos

  • Como qualquer outro efeito de áudio, o efeito precisa ser implementado por uma biblioteca do fornecedor e listado no arquivo de configuração audio_effects.xml.
  • O efeito precisa ser do tipo pré-processamento ou pós-processamento (flag TYPE_PRE_PROC ou TYPE_POST_PROC definido em EffectDescriptor.flags).
  • Se a implementação do efeito for acelerada por hardware (flag HW_ACC_TUNNEL definido em EffectDescriptor.flags), ela poderá ser anexada a um caminho de áudio totalmente conectado abaixo da HAL (sem stream de áudio de reprodução ou captura aberto na HAL de áudio).

Criar e ativar um efeito de dispositivo

Efeitos de áudio específicos do dispositivo podem ser instanciados usando um dos dois métodos abaixo.

Usar um arquivo de configuração de efeitos de áudio

Esse método permite a criação estática de um efeito de áudio que é anexado e ativado sistematicamente a qualquer caminho de áudio que selecione um dispositivo especificado como receptor ou fonte.

Isso é feito adicionando uma seção específica no arquivo audio_effects.xml, conforme mostrado abaixo:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

Usar uma API do sistema

Um novo construtor @SystemApi foi adicionado à classe android.media.audiofx.AudioEffect para criar e ativar um efeito de dispositivo:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Depois que o efeito é criado especificando o ID exclusivo do efeito de áudio e o descritor do dispositivo de áudio, ele pode ser ativado ou desativado com as APIs AudioEffect atuais.

Uma API também está disponível para consultar se uma implementação oferece suporte a uma determinada combinação de dispositivo/efeito.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Novas APIs HAL

HAL de efeito de áudio

A HAL de efeito de áudio V6.0 tem uma nova assinatura para o método createEffect(), permitindo a criação de um efeito anexado a um dispositivo:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • O AudioSession especificado precisa ser AudioSessionConsts.DEVICE.
  • AudioIoHandle é ignorado se a session for AudioSessionConsts.DEVICE.
  • O device é identificado pelo AudioPortHandle exclusivo atribuído pelo framework de áudio quando o dispositivo é selecionado em a HAL de áudio com o método IDevice::createAudioPatch().

HAL de áudio

Para oferecer suporte ao recurso de efeito de dispositivo, a HAL de áudio precisa implementar o controle de roteamento de áudio usando a API IDevice::createAudioPatch(). Isso é indicado pelo método IDevice::supportsAudioPatches() que informa true.

Dois novos métodos de API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), informam à implementação da HAL que um efeito de dispositivo foi ativado ou desativado em um determinado dispositivo.

O dispositivo é identificado pelo ID AudioPortHandle, que é usado quando um patch de áudio é criado com o método IDevice::createAudioPatch().

As APIs HAL de áudio podem ser usadas por uma implementação se a coordenação for necessária entre as HALs de áudio e efeito quando um efeito é ativado ou desativado.