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 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 é direcionado principalmente a OEMs automotivos, mas também pode ser usado em outros formatos do Android. Um app de exemplo está inserindo um efeito de melhoria de voz na saída do sintonizador FM quando conectado diretamente ao alto-falante pela DSP de áudio.
Pré-requisitos
- Como qualquer outro efeito de áudio, ele 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
ouTYPE_POST_PROC
definida emEffectDescriptor.flags
). - Se a implementação do efeito for acelerada por hardware
(flag
HW_ACC_TUNNEL
definida emEffectDescriptor.flags
), ele poderá ser anexado a um caminho de áudio totalmente conectado abaixo do HAL (sem reprodução ou captura de stream de áudio aberto no HAL de áudio).
Criar e ativar um efeito de dispositivo
Os 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 é sistematicamente anexado e ativado para qualquer caminho de áudio que selecione um dispositivo especificado como coletor ou origem.
Para isso, adicione uma seção específica no arquivo audio_effects.xml
da seguinte maneira:
<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 do HAL
HAL de efeitos de áudio
O HAL de efeitos 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 serAudioSessionConsts.DEVICE
. AudioIoHandle
será ignorado sesession
forAudioSessionConsts.DEVICE
.- O
device
é identificado peloAudioPortHandle
exclusivo atribuído pelo framework de áudio quando o dispositivo é selecionado na HAL de áudio com o métodoIDevice::createAudioPatch()
.
HAL de áudio
Para oferecer suporte ao recurso de efeito do dispositivo, o 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 Audio HAL podem ser usadas por uma implementação se for necessária uma coordenação entre as HALs de áudio e de efeito quando um efeito é ativado ou desativado.