gusucode.com > UDP语音通讯控件源码程序 > UDP语音通讯控件源码程序/AUDIOS/AUDIO/SortData.cpp
#include "stdafx.h" #include "SortData.h" #include "head.h" #include "WaveOut.h" //------------------------------- extern CWaveOut *g_pOut; //------------------------------- CSortData::CSortData() { for (int i = 0;i<NUM_BUFFER;i++) { m_pBuffer[i] = new char[60]; m_iFill[i] = 0; } m_iLast = 0; } CSortData::~CSortData() { for (int i = 0;i<NUM_BUFFER;i++) { delete []m_pBuffer[i]; } } void CSortData::ReceiveData(char *pBuffer, int iLen) { struct Frame *m_pFrame; m_pFrame = (struct Frame *)pBuffer; TRACE("Rece %d %d .\n",iLen,m_pFrame->iIndex ); if (m_pFrame->iIndex < m_iLast + 1) { TRACE("Lost %d.\n",m_pFrame->iIndex); } if (m_pFrame->iIndex == m_iLast + 1) { unsigned __int32 iTemp; ///play //it is right next data in buffer Play(pBuffer + sizeof(struct Frame),60); m_iLast = m_pFrame->iIndex ; //TRACE("Receive and paly %d.\n",m_iLast); iTemp = m_pFrame->iIndex; int iNext; for (iNext= 0;iNext < DELAY_BUFFER;iNext ++) { if (m_iFill[iNext] != iTemp + 1) break; iTemp = m_iFill[iNext]; } if (iNext != 0) { //paly right for (iTemp =0;iTemp < (unsigned int)iNext;iTemp ++) { Play(m_pBuffer[iTemp],60); //TRACE("Play %d.\n",m_iFill[iTemp]); m_iFill[iTemp] = 0; } //move back int iHead; iHead = 0; for (iTemp = iNext;iTemp < DELAY_BUFFER;iTemp ++) { if (m_iFill[iTemp] != 0) { m_iFill[iHead] = m_iFill[iTemp]; memcpy(m_pBuffer[iHead],m_pBuffer[iTemp],60); m_iFill[iTemp] = 0; iHead = 0; } else { break; } } } } int iNow; int iEnd; int iMove; for (iNow = 0;iNow < DELAY_BUFFER ;iNow++) { if (m_iFill[iNow] != 0) { //insert if (m_iFill[iNow] > m_pFrame->iIndex) { for (iEnd = iNow;iEnd < DELAY_BUFFER;iEnd ++) { if (m_iFill[iEnd] == 0) { break; } } for (iMove = iEnd;iMove > iNow;iMove --) { m_iFill[iMove] = m_iFill[iMove - 1]; memcpy(m_pBuffer[iMove],m_pBuffer[iMove - 1],60); } memcpy(m_pBuffer[iNow],pBuffer + sizeof(struct Frame),60); m_iFill[iNow] = m_pFrame->iIndex; break; } }//append else { memcpy(m_pBuffer[iNow],pBuffer + sizeof(struct Frame),60); m_iFill[iNow] = m_pFrame->iIndex; break; } }//buffer full if (m_iFill[DELAY_BUFFER - 1] != 0) { m_iLast = m_iFill[DELAY_BUFFER - 1]; for (iNow = 0;iNow < DELAY_BUFFER ;iNow++) { m_iFill[iNow] = 0; } } } void CSortData::Play(char *pBuffer, int iLen) { int iOut; iOut = sizeof(m_cOut); g_ACode.DecodeAudioData (pBuffer,iLen,m_cOut,&iOut); g_pOut->Play (m_cOut,iOut); }