擷取音訊時,音訊 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 預設的來源選取邏輯。