A partir do Android 11, os fabricantes de dispositivos têm a capacidade de anexar e ativar automaticamente efeitos de áudio específicos quando um 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 do áudio HAL (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 é voltado principalmente para OEMs automotivos, mas também pode ser usado em outros fatores de forma do Android. Um aplicativo de exemplo está inserindo 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
- Como para qualquer outro efeito de áudio, o efeito deve ser implementado por uma biblioteca de fornecedor e listado no arquivo de configuração
audio_effects.xml
. - O efeito deve ser do tipo pré-processamento ou pós-processamento (sinalizador
TYPE_PRE_PROC
ouTYPE_POST_PROC
definido emEffectDescriptor.flags
). - Se a implementação do efeito for acelerada por HW (flag
HW_ACC_TUNNEL
configurada emEffectDescriptor.flags
), ele pode ser anexado a um caminho de áudio totalmente conectado abaixo do HAL (nenhuma reprodução ou captura de fluxo de áudio aberto no HAL de áudio).
Criando e habilitando um efeito de dispositivo
Os efeitos de áudio específicos do dispositivo podem ser instanciados usando um dos dois métodos abaixo.
Usando 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 para qualquer caminho de áudio selecionando um dispositivo especificado 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>
Usando uma API do sistema
Um novo construtor @SystemApi foi adicionado à classe android.media.audiofx.AudioEffect
para criar e habilitar 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 existentes.
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
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 serAudioSessionConsts.DEVICE
. -
AudioIoHandle
será ignorado se asession
forAudioSessionConsts.DEVICE
. - O
device
é identificado por seuAudioPortHandle
exclusivo atribuído pela estrutura de áudio quando o dispositivo é selecionado no HAL de áudio comIDevice::createAudioPatch()
.
Áudio HAL
Para oferecer suporte ao recurso de efeito de dispositivo, o HAL de áudio deve implementar o controle de roteamento de áudio usando a IDevice::createAudioPatch()
. Isso é indicado pelo IDevice::supportsAudioPatches()
relatando 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 de HAL que um efeito de dispositivo foi ativado ou desativado em um determinado dispositivo.
O dispositivo é identificado por seu AudioPortHandle
ID, que é usado quando um patch de áudio é criado com o IDevice::createAudioPatch()
.
As APIs de HAL de áudio podem ser usadas por uma implementação se a coordenação for necessária entre as HALs de áudio e de efeito quando um efeito for ativado ou desativado.