При захвате звука Audio HAL получает вызов openInputStream
, который включает аргумент AudioSource
, указывающий, как следует обрабатывать входной сигнал микрофона.
Источник VOICE_RECOGNITION
ожидает поток стереомикрофона с эффектом эхоподавления (если доступно), но без какой-либо другой обработки.
Многоканальный микрофонный вход
Для захвата звука с устройства с более чем двумя каналами (стерео) используйте маску индекса канала вместо маски позиционного индекса (например, 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 по умолчанию.