マイク入力

Audio HAL は、音声キャプチャ時に、マイク入力の処理方法を示す AudioSource 引数を含む openInputStream 呼び出しを受け取ります。

VOICE_RECOGNITION ソースは、エコー キャンセル効果(可能な場合)以外には処理が一切適用されていないステレオ マイク ストリームを想定しています。

マルチチャンネル マイク入力

チャンネル数が 2 つ(ステレオ)を超えるデバイスから音声をキャプチャするには、位置インデックス マスク(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);

setChannelMasksetChannelIndexMask の両方を設定した場合、AudioRecord は、setChannelMask によって設定された値(最大 2 チャンネル)のみを使用します。

同時キャプチャ

Android 10 では、Android フレームワークは入力の同時キャプチャをサポートしていますが、ユーザーのプライバシーを保護するための制限が設けられています。たとえば AUDIO_SOURCE_FM_TUNER などの仮想ソースは無視されますが、通常の入力(マイクなど)とは同時キャプチャできます。HwAudioSource は同時キャプチャ制限の一部と見なされません。

AUDIO_DEVICE_IN_BUS デバイスまたはセカンダリ AUDIO_DEVICE_IN_FM_TUNER デバイスで動作するように設計されているアプリは、明示的にこれらのデバイスを特定し、AudioRecord.setPreferredDevice() を使って Android のデフォルト ソース選択ロジックをバイパスする必要があります。