Ao capturar áudio, o HAL de áudio recebe uma chamada openInputStream
que
inclui um argumento AudioSource
para indicar como a entrada do microfone precisa ser
processada.
A fonte VOICE_RECOGNITION
espera um stream de microfone estéreo que tenha um
efeito de cancelamento de eco (se disponível), mas nenhum outro processamento aplicado a ele.
Entrada de microfone multicanal
Para capturar áudio de um dispositivo com mais de dois canais (estéreo), use uma
máscara de índice de canal em vez de uma máscara de índice posicional (como CHANNEL_IN_LEFT
).
Por exemplo:
final AudioFormat audioFormat = new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelIndexMask(0xf /* 4 channels, 0..3 */)
.build();
final AudioRecord audioRecord = new AudioRecord.Builder()
.setAudioFormat(audioFormat)
.build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);
Quando setChannelMask
e setChannelIndexMask
são definidos, AudioRecord
usa
apenas o valor definido por setChannelMask
(máximo de dois canais).
Captura simultânea
A partir do Android 10, o framework do Android oferece suporte à
captura simultânea de entradas, mas com
restrições para proteger a privacidade do usuário. Como parte dessas restrições,
fontes virtuais, como AUDIO_SOURCE_FM_TUNER
, são ignoradas e podem
ser capturadas simultaneamente com uma entrada normal (como o microfone).
HwAudioSource
não é considerado parte das restrições de captura simultânea.
Os apps projetados para funcionar com dispositivos AUDIO_DEVICE_IN_BUS
ou
AUDIO_DEVICE_IN_FM_TUNER
secundários precisam identificar explicitamente esses
dispositivos e usar AudioRecord.setPreferredDevice()
para ignorar a lógica de seleção de origem
padrão do Android.