import android.media.audiofx.AcousticEchoCanceler; //導入方法依賴的package包/類
@Override
public boolean initCapturer() {
// initalize audio mode
audioManagerMode.acquireMode(audioManager);
// get the minimum buffer size that can be used
int minRecBufSize = AudioRecord.getMinBufferSize(
captureSettings.getSampleRate(),
NUM_CHANNELS_CAPTURING == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT
);
// double size to be more safe
int recBufSize = minRecBufSize * 2;
// release the object
if (noiseSuppressor != null) {
noiseSuppressor.release();
noiseSuppressor = null;
}
if (echoCanceler != null) {
echoCanceler.release();
echoCanceler = null;
}
if (audioRecord != null) {
audioRecord.release();
audioRecord = null;
}
try {
audioRecord = new AudioRecord(AudioSource.VOICE_COMMUNICATION,
captureSettings.getSampleRate(),
NUM_CHANNELS_CAPTURING == 1 ? AudioFormat.CHANNEL_IN_MONO
: AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT, recBufSize);
if (NoiseSuppressor.isAvailable()) {
noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());
}
if (AcousticEchoCanceler.isAvailable()) {
echoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// check that the audioRecord is ready to be used
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
throw new RuntimeException("Audio capture is not initialized " + captureSettings.getSampleRate());
}
shutdownCaptureThread = false;
new Thread(captureThread).start();
return true;
}