При захвате звука Audio HAL получает вызов openInputStream , который включает аргумент AudioSource , указывающий, как следует обрабатывать входной сигнал с микрофона.
В качестве источника VOICE_RECOGNITION требуется стереофонический поток с микрофона, к которому применен эффект подавления эха (если он доступен), но не применена никакая другая обработка.
Multi-channel microphone input
Для захвата звука с устройства с более чем двумя каналами (стерео) используйте маску индекса канала вместо маски позиционного индекса (например, CHANNEL_IN_LEFT ). Например:
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);
Если заданы значения setChannelMask и setChannelIndexMask , AudioRecord использует только значение, заданное параметром setChannelMask (максимум два канала).
Одновременный захват
Начиная с Android 10, платформа Android поддерживает одновременный захват входных данных, но с ограничениями для защиты конфиденциальности пользователя. В рамках этих ограничений виртуальные источники, такие как AUDIO_SOURCE_FM_TUNER , игнорируются и могут захватываться одновременно с обычным входным сигналом (например, микрофоном). HwAudioSource не считается частью ограничений на одновременный захват.
Приложения, предназначенные для работы с устройствами AUDIO_DEVICE_IN_BUS или с дополнительными устройствами AUDIO_DEVICE_IN_FM_TUNER должны явно указывать эти устройства и использовать AudioRecord.setPreferredDevice() для обхода логики выбора источника по умолчанию в Android.