package com.source.sounds;
import android.util.Log;
import com.audio.Speex;
import com.rftransceiver.datasets.AudioData;
import com.rftransceiver.datasets.MyDataQueue;
public class Audio_Decoder implements Runnable
{
private static Audio_Decoder decoder; //解码器单一实例
private MyDataQueue dataList = null;
private static final int MAX_BUFFER_SIZE = 2048;
private Speex coder=new Speex();
private short[] decodedData = new short[1024];
public boolean isDecoding=false;
StringBuilder sb = new StringBuilder();
private Audio_Decoder()
{
//实例化解码缓冲区
this.dataList = MyDataQueue.getInstance(MyDataQueue.DataType.Sound_Decoder);
}
@Override
public void run()
{
Log.e("Decoder","开启解码");
Audio_Player player = Audio_Player.getInstance();
player.startPlaying();
this.isDecoding = true;
coder.init();
int decodeSize = 0;
while (isDecoding) {
AudioData encodeData = (AudioData)dataList.get();
if(encodeData == null) {
//此处可增加一个延时
}else{
decodedData = new short[MAX_BUFFER_SIZE];
// 解码数据的大小
byte[] raw = encodeData.getencodeData();
decodeSize=coder.decode(raw, decodedData, encodeData.getSize());
if (decodeSize > 0)
{
player.addData(decodedData, decodeSize);
//decodedData = new short[decodeSize];
}
}
}
player.stopPlaying();
}
public void addData(AudioData data)
{
//将数据添加至解码器缓存区
dataList.add(data);
}
//开始解码
public void startDecoding()
{
if (isDecoding)
{
return;
}
Log.e("Audio_Decoder","start a new decode thread");
new Thread(this).start();
}
//关闭解码器
public void stopDecoding()
{
this.isDecoding = false;
}
//获取单一实例
public static Audio_Decoder getInstance()
{
if (decoder == null)
{
decoder = new Audio_Decoder();
}
return decoder;
}
}