/*
* 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 java.util.List;
import com.libra.sinvoice.Buffer.BufferData;
public class Encoder implements SinGenerator.Listener, SinGenerator.Callback {
private final static String TAG = "Encoder";
private final static int STATE_ENCODING = 1;
private final static int STATE_STOPED = 2;
// index 0, 1, 2, 3, 4, 5, 6
// sampling point Count 31, 28, 25, 22, 19, 15, 10
private final static int[] CODE_FREQUENCY = { 1422, 1575, 1764, 2004, 2321, 2940, 4410 };
private int mState;
private SinGenerator mSinGenerator;
private Listener mListener;
private Callback mCallback;
public static interface Listener {
void onStartEncode();
void onEndEncode();
}
public static interface Callback {
void freeEncodeBuffer(BufferData buffer);
BufferData getEncodeBuffer();
}
public Encoder(Callback callback, int sampleRate, int bits, int bufferSize) {
mCallback = callback;
mState = STATE_STOPED;
mSinGenerator = new SinGenerator(this, sampleRate, bits, bufferSize);
mSinGenerator.setListener(this);
}
public void setListener(Listener listener) {
mListener = listener;
}
public final static int getMaxCodeCount() {
return CODE_FREQUENCY.length;
}
public final boolean isStoped() {
return (STATE_STOPED == mState);
}
// content of input from 0 to (CODE_FREQUENCY.length-1)
public void encode(List<Integer> codes, int duration) {
encode(codes, duration, 0);
}
public void encode(List<Integer> codes, int duration, int muteInterval) {
if (STATE_STOPED == mState) {
mState = STATE_ENCODING;
if (null != mListener) {
mListener.onStartEncode();
}
mSinGenerator.start();
for (int index : codes) {
if (STATE_ENCODING == mState) {
LogHelper.d(TAG, "encode:" + index);
if (index >= 0 && index < CODE_FREQUENCY.length) {
mSinGenerator.gen(CODE_FREQUENCY[index], duration);
} else {
LogHelper.e(TAG, "code index error");
}
} else {
LogHelper.d(TAG, "encode force stop");
break;
}
}
// for mute
if (STATE_ENCODING == mState) {
mSinGenerator.gen(0, muteInterval);
} else {
LogHelper.d(TAG, "encode force stop");
}
stop();
if (null != mListener) {
mListener.onEndEncode();
}
}
}
public void stop() {
if (STATE_ENCODING == mState) {
mState = STATE_STOPED;
mSinGenerator.stop();
}
}
@Override
public void onStartGen() {
LogHelper.d(TAG, "start gen codes");
}
@Override
public void onStopGen() {
LogHelper.d(TAG, "end gen codes");
}
@Override
public BufferData getGenBuffer() {
if (null != mCallback) {
return mCallback.getEncodeBuffer();
}
return null;
}
@Override
public void freeGenBuffer(BufferData buffer) {
if (null != mCallback) {
mCallback.freeEncodeBuffer(buffer);
}
}
}