/*
* Copyright (C) 2013 gujicheng
*
* Licensed under the GPL License Version 2.0;
* you may not use this file except in compliance with the License.
*
* If you have any question, please contact me.
*
*************************************************************************
** Author information **
*************************************************************************
** Email: gujicheng197@126.com **
** QQ : 29600731 **
** Weibo: http://weibo.com/gujicheng197 **
*************************************************************************
*/
package com.libra.sinvoice;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import com.libra.sinvoice.Buffer.BufferData;
public class Record {
private final static String TAG = "Record";
private final static int STATE_START = 1;
private final static int STATE_STOP = 2;
public final static int BITS_8 = 1;
public final static int BITS_16 = 2;
public final static int CHANNEL_1 = 1;
public final static int CHANNEL_2 = 2;
private int mState;
private int mFrequence = 8000;
private int mChannel = CHANNEL_1;
private int mBits = BITS_8;
private int mBufferSize;
private int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
private int mAudioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private Listener mListener;
private Callback mCallback;
public static interface Listener {
void onStartRecord();
void onStopRecord();
}
public static interface Callback {
BufferData getRecordBuffer();
void freeRecordBuffer(BufferData buffer);
}
public Record(Callback callback, int frequence, int channel, int bits, int bufferSize) {
mState = STATE_STOP;
mCallback = callback;
mFrequence = frequence;
mChannel = channel;
mBits = bits;
mBufferSize = bufferSize;
}
public void setListener(Listener listener) {
mListener = listener;
}
public void start() {
if (STATE_STOP == mState) {
switch (mChannel) {
case CHANNEL_1:
mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
break;
case CHANNEL_2:
mChannelConfig = AudioFormat.CHANNEL_IN_STEREO;
break;
}
switch (mBits) {
case BITS_8:
mAudioEncoding = AudioFormat.ENCODING_PCM_8BIT;
break;
case BITS_16:
mAudioEncoding = AudioFormat.ENCODING_PCM_16BIT;
break;
}
int minBufferSize = AudioRecord.getMinBufferSize(mFrequence, mChannelConfig, mAudioEncoding);
LogHelper.d(TAG, "minBufferSize:" + minBufferSize);
if ( mBufferSize >= minBufferSize ) {
AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC, mFrequence, mChannelConfig, mAudioEncoding, mBufferSize);
if (null != record) {
try {
mState = STATE_START;
record.startRecording();
LogHelper.d(TAG, "record start");
if (null != mCallback) {
if (null != mListener) {
mListener.onStartRecord();
}
while (STATE_START == mState) {
BufferData data = mCallback.getRecordBuffer();
if (null != data) {
if (null != data.mData) {
int bufferReadResult = record.read(data.mData, 0, mBufferSize);
data.setFilledSize(bufferReadResult);
mCallback.freeRecordBuffer(data);
} else {
// end of input
LogHelper.d(TAG, "get end input data, so stop");
break;
}
} else {
LogHelper.e(TAG, "get null data");
break;
}
}
if (null != mListener) {
mListener.onStopRecord();
}
}
record.stop();
record.release();
LogHelper.d(TAG, "record stop");
} catch ( IllegalStateException e) {
e.printStackTrace();
LogHelper.e(TAG, "start record error");
}
mState = STATE_STOP;
}
} else {
LogHelper.e(TAG, "bufferSize is too small");
}
}
}
public int getState() {
return mState;
}
public void stop() {
if (STATE_START == mState) {
mState = STATE_STOP;
}
}
}