package com.mogujie.tt.support.audio;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.task.TaskCallback;
public class SpeexEncoder implements Runnable {
private Logger log = Logger.getLogger(SpeexEncoder.class);
private final Object mutex = new Object();
private Speex speex = new Speex();
public static int encoder_packagesize = 1024;
private byte[] processedData = new byte[encoder_packagesize];
List<ReadData> list = null;
private volatile boolean isRecording;
private String fileName;
private TaskCallback mCallback;
public SpeexEncoder(String fileName, TaskCallback callback) {
super();
speex.init();
list = Collections.synchronizedList(new LinkedList<ReadData>());
this.fileName = fileName;
this.mCallback = callback;
}
@SuppressWarnings("unused")
public void run() {
SpeexWriter fileWriter = new SpeexWriter(fileName, mCallback);
Thread consumerThread = new Thread((Runnable) fileWriter);
fileWriter.setRecording(true);
consumerThread.start();
android.os.Process
.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int getSize = 0;
while (this.isRecording()) {
if (list.size() == 0) {
log.d("no data need to do encode");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
if (list.size() > 0) {
synchronized (mutex) {
ReadData rawdata = list.remove(0);
short[] playData = new short[rawdata.size];
getSize = speex.encode(rawdata.ready, 0, processedData,
rawdata.size);
log.i("after encode......................before="
+ rawdata.size + " after=" + processedData.length
+ " getsize=" + getSize);
}
if (getSize > 0) {
fileWriter.putData(processedData, getSize);
log.i("............clear....................");
processedData = new byte[encoder_packagesize];
}
}
}
log.d("encode thread exit");
fileWriter.setRecording(false);
speex.close();
}
public void putData(short[] data, int size) {
ReadData rd = new ReadData();
synchronized (mutex) {
rd.size = size;
System.arraycopy(data, 0, rd.ready, 0, size);
list.add(rd);
}
}
public void setRecording(boolean isRecording) {
synchronized (mutex) {
this.isRecording = isRecording;
}
}
public boolean isRecording() {
synchronized (mutex) {
return isRecording;
}
}
class ReadData {
private int size;
private short[] ready = new short[encoder_packagesize];
}
}