A partir do Android 11, os fabricantes de dispositivos podem para anexar e ativar automaticamente efeitos de áudio específicos quando um determinado dispositivo de áudio for 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 uma e um de saída) podem ser controladas pela estrutura de efeitos de áudio.
Esse recurso é destinado principalmente a OEMs automotivos, mas também pode ser usado em outras plataformas Android. formatos. Um app de exemplo é inserir um efeito de melhoria de voz no sintonizador FM quando estiver conectado diretamente ao alto-falante pela 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 precisa ser do tipo pré-processamento ou pós-processamento
(sinalização
TYPE_PRE_PROC
ouTYPE_POST_PROC
) definido emEffectDescriptor.flags
). - Se a implementação do efeito tiver aceleração de hardware
(sinalização
HW_ACC_TUNNEL
definida emEffectDescriptor.flags
), ele pode ser anexado a um caminho de áudio totalmente conectado abaixo da HAL (sem reprodução capturam o stream de áudio aberto na 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 ativadas em qualquer caminho de áudio que selecione um dispositivo especificado como coletor ou origem.
Para isso, é preciso adicionar 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>
Usar uma API do sistema
Um novo construtor @SystemApi foi adicionado ao
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 existentes.
Uma API também estará disponível para consulta se uma implementação oferecer 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
O efeito de áudio HAL 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 em a HAL de áudio com o métodoIDevice::createAudioPatch()
.
HAL de áudio
Para oferecer suporte ao recurso de efeitos do dispositivo, a HAL de áudio precisa implementar o roteamento de áudio.
usando a API IDevice::createAudioPatch()
. Isso é indicado pelo
O método IDevice::supportsAudioPatches()
de relatórios true
.
Dois novos métodos de API,
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
e
IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
informar à implementação da HAL que um efeito do dispositivo foi ativado ou desativado
de um determinado dispositivo.
O dispositivo é identificado pelo ID AudioPortHandle
, que é usado quando um áudio
patch é criado com o método IDevice::createAudioPatch()
.
As APIs de HAL de áudio podem ser usadas por uma implementação se a coordenação for necessária entre os HALs de áudio e de efeito quando um efeito é ativado ou desativado.