protected void removeDataFromInputBuffer(int start, int count) { if (mInputDataSize >= start + count) { BinaryUtility.memmove(ref mInputBuffer, start, start + count, mInputDataSize - start - count); mInputDataSize -= count; } }
protected bool receiveThread() { if (!isDeviceConnect()) { return(true); } const int MaxRecvCount = 32; if (mRecvBytes == null) { mRecvBytes = new byte[MaxRecvCount]; } // 只接收23个字节,如果不是23个字节,则丢弃该数据 int readCount = mHIDDevice.read(ref mRecvBytes, 23); if (readCount != 0) { BinaryUtility.memmove(ref mRecvBytes, 0, 1, MaxRecvCount - 1); readCount -= 4; // 去除第一个字节和最后3个字节 mInputBufferLock.waitForUnlock(); addDataToInputBuffer(mRecvBytes, readCount); mInputBufferLock.unlock(); } // 先同步发送列表 mSendPacketLock.waitForUnlock(); int count = mSendPacket.Count; for (int i = 0; i < count; ++i) { mOutputBufferList.Add(mSendPacket[i].toBytes()); } mSendPacket.Clear(); mSendPacketLock.unlock(); // 发送所有需要发送的数据 int sendCount = mOutputBufferList.Count; for (int i = 0; i < sendCount; ++i) { if (mOutputBufferList[i] != null) { mHIDDevice.write(mOutputBufferList[i]); } } mOutputBufferList.Clear(); return(true); }
public void setRecordData(short[] data, int dataSize) { // 检测数据量是否正确 if (mBlockBufferSize != dataSize) { return; } // 由于缓冲区大小和每次获取的数据数量都是固定的,所以只要有数据就需要移动 // 将已有的数据移到缓冲区头部,然后将新的数据加入尾部 if (mAllPCMCount > 0) { BinaryUtility.memmove(mAllPCMData, 0, dataSize, mRecorderDataBlockSize - dataSize); BinaryUtility.memcpy(mAllPCMData, data, mRecorderDataBlockSize - dataSize, 0, dataSize); } else { BinaryUtility.memset(mAllPCMData, (short)0, mRecorderDataBlockSize); BinaryUtility.memcpy(mAllPCMData, data, 0, 0, dataSize); mAllPCMCount = dataSize; } }