Вход для микрофона

При захвате звука 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 по умолчанию.