package com.yixia.camera;
import android.media.AudioFormat;
import android.media.AudioRecord;
/**
* 音频录制
*
* @author yixia.com
*
*/
public class AudioRecorder extends Thread {
private AudioRecord mAudioRecord = null;
/** 采样率 */
private int mSampleRate = 44100;
private IMediaRecorder mMediaRecorder;
public AudioRecorder(IMediaRecorder mediaRecorder) {
this.mMediaRecorder = mediaRecorder;
}
/** 设置采样率 */
public void setSampleRate(int sampleRate) {
this.mSampleRate = sampleRate;
}
@Override
public void run() {
if (mSampleRate != 8000 && mSampleRate != 16000 && mSampleRate != 22050 && mSampleRate != 44100) {
mMediaRecorder.onAudioError(MediaRecorderBase.AUDIO_RECORD_ERROR_SAMPLERATE_NOT_SUPPORT, "sampleRate not support.");
return;
}
final int mMinBufferSize = AudioRecord.getMinBufferSize(mSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
if (AudioRecord.ERROR_BAD_VALUE == mMinBufferSize) {
mMediaRecorder.onAudioError(MediaRecorderBase.AUDIO_RECORD_ERROR_GET_MIN_BUFFER_SIZE_NOT_SUPPORT, "parameters are not supported by the hardware.");
return;
}
mAudioRecord = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC, mSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mMinBufferSize);
if (null == mAudioRecord) {
mMediaRecorder.onAudioError(MediaRecorderBase.AUDIO_RECORD_ERROR_CREATE_FAILED, "new AudioRecord failed.");
return;
}
try {
mAudioRecord.startRecording();
} catch (IllegalStateException e) {
mMediaRecorder.onAudioError(MediaRecorderBase.AUDIO_RECORD_ERROR_UNKNOWN, "startRecording failed.");
return;
}
byte[] sampleBuffer = new byte[mMinBufferSize];
try {
while (!Thread.currentThread().isInterrupted()) {
int result = mAudioRecord.read(sampleBuffer, 0, mMinBufferSize);
if (result > 0) {
mMediaRecorder.receiveAudioData(sampleBuffer, result);
}
}
} catch (Exception e) {
String message = "";
if (e != null)
message = e.getMessage();
mMediaRecorder.onAudioError(MediaRecorderBase.AUDIO_RECORD_ERROR_UNKNOWN, message);
}
mAudioRecord.release();
mAudioRecord = null;
}
}