Efeitos de áudio

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

Esse recurso é direcionado principalmente a OEMs automotivos, mas também pode ser usado em outros formatos Android. Um exemplo de aplicativo é inserir um efeito de aprimoramento de voz na saída do sintonizador FM quando conectado diretamente ao alto-falante por meio do DSP de áudio.

Pré-requisitos

  • Assim como qualquer outro efeito de áudio, o efeito deve ser implementado por uma biblioteca do fornecedor e listado no arquivo de configuração audio_effects.xml .
  • O efeito deve 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 HW (sinalizador HW_ACC_TUNNEL definido em EffectDescriptor.flags ), ele pode ser anexado a um caminho de áudio totalmente conectado abaixo do HAL (nenhum fluxo de reprodução ou captura de áudio aberto no HAL de áudio).

Crie e ative um efeito de dispositivo

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

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

Este método permite a criação estática de um efeito de áudio que é sistematicamente anexado e habilitado a qualquer caminho de áudio selecionando um dispositivo específico como coletor ou fonte.

Isso é feito adicionando uma seção específica no arquivo audio_effects.xml da seguinte forma:

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

Use 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 for criado especificando o ID exclusivo do efeito de áudio e o descritor do dispositivo de áudio, ele poderá ser ativado ou desativado com APIs AudioEffect existentes.

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

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

Novas APIs HAL

Efeito de áudio HAL

O efeito de áudio HAL V6.0 possui 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)
  • A AudioSession especificada deve ser AudioSessionConsts.DEVICE .
  • AudioIoHandle será ignorado se a session for AudioSessionConsts.DEVICE .
  • O device é identificado por seu AudioPortHandle exclusivo atribuído pela estrutura de áudio quando o dispositivo é selecionado no HAL de áudio com o método IDevice::createAudioPatch() .

Áudio HAL

Para suportar o recurso de efeito de dispositivo, o HAL de áudio deve implementar o controle de roteamento de áudio usando a API IDevice::createAudioPatch() . Isso é indicado pelo método IDevice::supportsAudioPatches() reportando 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 HAL que um efeito de dispositivo foi ativado ou desativado em um determinado dispositivo.

O dispositivo é identificado por seu 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 for necessária coordenação entre os HALs de áudio e de efeito quando um efeito for ativado ou desativado.