package com.source.sounds; import com.my_interface.SendMessageListener; import com.rftransceiver.datasets.AudioData; import com.rftransceiver.datasets.MyDataQueue; import com.rftransceiver.util.Constants; import com.source.DataPacketOptions; public class SoundsEntity implements Runnable { private volatile boolean isSendering = false; //mark is sendering sounds private boolean isRunning = false; //mark the thread is running,only control by this thread private MyDataQueue dataQueue; //sounds data cache private DataPacketOptions options; private SendMessageListener sendListener = null; byte[] temp; public SoundsEntity() { dataQueue = MyDataQueue.getInstance(MyDataQueue.DataType.Sounds_Send); } public void startSending() { isRunning = true; isSendering = true; try { new Thread(this).start(); } catch (Exception e) { e.printStackTrace(); } } public void addData(byte[] data, int size) { byte[] tempData = new byte[size]; System.arraycopy(data,0,tempData,0,size); AudioData encodedData = new AudioData(); encodedData.setSize(size); encodedData.setencodeData(tempData); dataQueue.add(encodedData); data = null; tempData = null; } //stop send public void stopSending() { this.isSendering = false; } public void run() { initTemp(); int index = options.getOffset(); //the packet's counter int sum = 0; //count the number of packets /** * every encode sounds packet's length is ten ,soundsPacket record a sounds sending packet have how much encode sounds packets */ int soundsPackets = (options.getLength()-options.getOffset()-1) / Constants.Small_Sounds_Packet_Length; while (isRunning) { if(isSendering) { //now the cache length is dynamic if(dataQueue.getSize() > 5) { for(int i = 0; i < 4;i++) { AudioData restData = (AudioData)dataQueue.get(); for(int j = 0;j<restData.getSize();j++) { temp[index++] = restData.getencodeData()[j]; if (index == options.getLength()-1) { //temp have been full,can to be sent sendListener.sendPacketedData(temp,false); initTemp(); //reset to recount index = options.getOffset(); } } } }else { // try { // Thread.sleep(10); // }catch (Exception e) { // e.printStackTrace(); // } } }else { //the user have stop,now the cache's length is changeless int restCountsInDataQueue = dataQueue.getSize(); int restCountsIntemp = (index-options.getOffset()) / Constants.Small_Sounds_Packet_Length; if(restCountsInDataQueue == 0) { isRunning = false; } for(int i = 0;i < restCountsInDataQueue;i++) { AudioData restData = (AudioData)dataQueue.get(); for(int j = 0;j<restData.getSize();j++) { temp[index++] = restData.getencodeData()[j]; if (index == options.getLength()-1) { //temp have been full,can to be sent if((restCountsInDataQueue+restCountsIntemp) % soundsPackets == 0 && i == restCountsInDataQueue-1) { temp[options.getRealLenIndex()] = (byte) (index-options.getOffset()); sendListener.sendPacketedData(temp,true); isRunning = false; //shutdown this thread sum = 0; //ready to count next send }else { sendListener.sendPacketedData(temp,false); initTemp(); } //reset to recount index = options.getOffset(); } } } if(index > options.getOffset()) { //now temp is the last packet temp[options.getRealLenIndex()] = (byte) (index-options.getOffset()); sendListener.sendPacketedData(temp,true); isRunning = false; //shutdown this thread sum = 0; //ready to count next send index = options.getOffset(); } } } } private void initTemp() { temp = null; temp = new byte[options.getLength()]; temp[0] = options.getHead(); temp[options.getLength()-1] = options.getTail(); temp[options.getTypeFlagIndex()] = options.getTypeFlag(); temp[options.getRealLenIndex()] = options.getRealLen(); } public void setSendListener(SendMessageListener sendListener) { this.sendListener = null; this.sendListener = sendListener; } public void setOptions(DataPacketOptions options) { this.options =null; this.options = options; } }