void CBufferOutputAudioEngine::Play() { //BufferTrace("CBufferOutputAudioEngine::Play()....\n"); if (!m_bFilled && m_mapOutputAudioBuf.size() < (1.0f*BUFFER_PERSEC_AUDIO_NUMBER*BUFFER_OUTPUT_ONMIC_AUDIO_MAX_LIMIT)/1000){ return ; } if (!m_bFilled) { m_fLastPlayTime = GetTickCount(); m_iStartPlayCount = 0; m_bFilled = true; } if (m_mapOutputAudioBuf.size() < 1 || (GetTickCount() - m_lastRecvTime) > 1000*10){//10s钟没有收到数据 超时 刷新 MutexLocker locker(&m_mutex);//播放线程 网络线程 m_mapOutputAudioBuf ResetStatus(); return; } IsCanCalcRecvRate()?m_fRecvRate = CalcRecevRate():NULL; m_fSendRate = CanCalcPlayRate(); //ErrTrace("CBufferOutputAudioEngine::Play() m_mapOutputAudioBuf.size()=%d,seq=%d,m_fRecvRate=%f,m_fSendRate=%f\n",m_mapOutputAudioBuf.size(),m_iMaxSequenceId - m_iMinSequenceId+1,m_fRecvRate,m_fSendRate); unsigned int iLimit = 0; DWORD dwCurrTime = GetTickCount(); while (m_fLastPlayTime < dwCurrTime && ++iLimit<5) { m_fLastPlayTime += m_fSendRate; m_iStartPlayCount++; PlayPackets(); SwitchToThread(); } CheckPacket(); RefreshStatus(); }
int Start(struct xmodem_receiver *rx) { unsigned char xmodem_buffer[BUFF_LEN]; unsigned short cur_char = 0; unsigned char wrong_char = 0; unsigned char cur_packet = 1; while (1) { while (cur_char < BUFF_LEN) { xmodem_buffer[cur_char] = rx->get_char(); if (cur_char == 0) { switch (xmodem_buffer[cur_char]) { case SOH: { cur_char++; break; } case EOT: { rx->put_char(ACK); return 0; /*finished ok*/ } default: { //PORTA = xmodem_buffer[0]; wrong_char++; if (wrong_char == 5) { return -1; /*too many errors*/ } rx->put_char(NAK); break; } } } else { cur_char++; } } if (CheckPacket(xmodem_buffer, cur_packet, rx)) { cur_packet++; //rx->writer(); cur_char = 0; rx->put_char(ACK); } else { cur_char = 0; rx->put_char(NAK); } } }
void LcEpollCli::EpollRecv(OverLap* pOverLap) { int ret = 0; bool bIsHeadChecked = false; while(1) { ret = recv(pOverLap->fd, pOverLap->szpComBuf + pOverLap->uiFinishLen, pOverLap->uiComLen, 0); if(ret == 0 || ret > (int)pOverLap->uiComLen) { m_pCoreLog->Write("error: ret == 0 || ret > %u connect %llu closed", pOverLap->uiComLen, pOverLap->u64SessionID); RemoveConnect(pOverLap); return; } else if(ret == -1 && errno == EAGAIN) { break; } else if(ret == -1) { m_pCoreLog->Write("error: ret < 0, connect %llu closed", pOverLap->u64SessionID); RemoveConnect(pOverLap); return; } pOverLap->uiComLen -= ret; pOverLap->uiFinishLen += ret; switch(CheckPacket(pOverLap, bIsHeadChecked)) { case 0: continue; case 1: case 2: RemoveConnect(pOverLap); return; case 3: case 4: continue; } } }
//*================================================================================= //*原型: void ProcessRequest(SOCKET hSocket) //*功能: 处理客户机的请求 //*参数: 无 //*返回: 无 //*说明: 先读入包头, 再读包数据, 然后再处理请求 //*================================================================================= void TSmartOutThread::ProcessRequest(SOCKET hSocket, SOCKADDR_IN *psockAddr) { TSmartPacket Packet; try { if( ReadRequestPacket(hSocket, Packet) ) { if( CheckPacket(psockAddr, Packet) ) { Dispatch(hSocket, psockAddr, Packet); } } } catch(TException& e) { WriteLog(e.GetText()); } catch(...) { WriteLog("客户服务线程有未知异常!"); } }
void CBufferOutputVideoEngine::Play() { //视频填充 if (!m_bFilled && m_mapOutputVideoBuf.size() < (1.0f*BUFFER_PERSEC_VIDEO_NUMBER*1300)/1000){ //缓冲1.3s的数据 return ; } if (!m_bFilled) { m_dwLastPlayTime = GetTickCount(); m_iStartPlayCount = 0; m_bFilled = true; } //BufferTrace("CBufferOutputVideoEngine::Play().....\n"); if (m_iMinSequenceId == 0) return; if (m_bStartPlay && m_iMinSequenceId>0){ if (m_dwStartPlayTime==0){ m_dwStartPlayTime = GetTickCount(); } if (GetTickCount()-m_dwStartPlayTime>BUFFER_VIDEO_PREVIEW_TIME){ m_bStartPlay = false; } } //计算缓冲区大小 if (m_pRate){ if (CanCalcAudioParam()){ if (m_pInPlace){ m_iAudioBufferSize = m_pInPlace->GetBufferSize(m_iFromUin,bfAudio); m_dwLastRecvAudioTime = m_pInPlace->GetRecvTime(m_iFromUin,bfAudio); }else{ m_dwLastRecvAudioTime = 0; m_iAudioBufferSize = BUFFER_OUTPUT_ONMIC_AUDIO_MAX_LIMIT; AssertVS(0,m_iFromUin,"CBufferOutputVideoEngine::Play m_pInPlace=NULL"); } } m_iBufferSize = m_pRate->CalcBufferSize( BUFFER_OUTPUT_ONMIC_VIDEO_MIN_LIMIT, //缓冲区最小缓冲时间 - 麦上 最小 BUFFER_OUTPUT_ONMIC_VIDEO_MAX_LIMIT, //缓冲区最大缓冲时间 - 麦上 最大 BUFFER_OUTPUT_UNMIC_VIDEO_MIN_LIMIT, //缓冲区最小缓冲时间 - 麦下 最小 BUFFER_OUTPUT_UNMIC_VIDEO_MAX_LIMIT, //缓冲区最大缓冲时间 - 麦下 最大 BUFFER_PERSEC_AUDIO_NUMBER, //平均速率 m_fLostRate, //当前丢包率 m_dwLastCalcBufSizeTime, //上一次计算缓冲区时间 m_iBufferSize, m_iAudioBufferSize, m_dwLastRecvAudioTime ); //BufferTrace("计算缓冲区大小 m_iBufferSize=%d, lostrate=%f, m_dwLastCalcBufSizeTime=%d,m_iAudioBufferSize=%d,m_dwLastRecvAudioTime=%d\n", // m_iBufferSize,m_fLostRate,m_dwLastCalcBufSizeTime,m_iAudioBufferSize,m_dwLastRecvAudioTime); }else{ AssertVS(0,m_iFromUin,"CBufferOutputVideoEngine::Play m_pRate=NULL"); } //计算接收视频速率 m_fRecvRate = CalcRecevRate(); m_fRecvFrameRate = CalcRecevFrameRate(); if (IsCanCalcPlayRate()){ if (m_pRate){ //计算发送数据帧的速率 if (m_bStartPlay){ m_dwSendRate = 1000 / BUFFER_PERSEC_VIDEO_FRAMES; }else{ m_dwSendRate = m_pRate->CalcSendRate( m_iBufferSize, //缓冲区大小 (UInt32)m_mapOutputVideoBuf.size(), //缓冲区中当前数据包个数 m_iMaxFrameId - m_iMinFrameId+1, m_fRecvRate, //收包速率 m_dwSendRate //上次计算的发送数据时间间隔大小 ); } //ErrTrace("CBufferOutputVideoEngine::Play() m_mapOutputVideoBuf.size()=%d,frames=%d,m_fRecvRate=%f,m_fRecvFrameRate=%f,m_dwSendRate=%d\n",m_mapOutputVideoBuf.size(),m_iMaxFrameId - m_iMinFrameId+1,m_fRecvRate,m_fRecvFrameRate,m_dwSendRate); }else{ AssertVS(0,m_iFromUin,"CBufferOutputVideoEngine m_pRate=NULL"); } } if(m_dwSendRate==0){ Assert(0); } //播放数据 按帧播放 unsigned int iLoop = 0; while (m_dwLastPlayTime < GetTickCount() && m_dwSendRate>0 && iLoop++ <10){ // BufferTrace("CBufferOutputVideoEngine::Play() while1 m_mapOutputVideoBuf.size()=%d,m_mapFrameToSeq.size()=%d,m_fRecvRate=%f,m_fRecvFrameRate=%f,m_dwSendRate=%d time=%d………… %d\n",m_mapOutputVideoBuf.size(),m_mapFrameToSeq.size(),m_fRecvRate,m_fRecvFrameRate,m_dwSendRate,GetTickCount()); (m_dwLastPlayTime==0)?(m_dwLastPlayTime=GetTickCount()+m_dwSendRate):(m_dwLastPlayTime += m_dwSendRate); m_iStartPlayCount++; PlayFrames(); SwitchToThread(); } RemoveExpireFrame(); CheckPacket(); if (m_mapOutputVideoBuf.size()==0 && GetTickCount()-m_lastRecvTime>=2000){ //2s没有收到数据,重置状态 ResetStatus(); } if(GetTickCount()-m_lastRecvTime>=10000){ //10s没有收到数据,且buf中有数据 ResetStatus(); } }
void CPythonNetworkStream::SelectPhase() { TPacketHeader header; if (!CheckPacket(&header)) return; switch (header) { case HEADER_GC_PHASE: if (RecvPhasePacket()) return; break; case HEADER_GC_EMPIRE: if (__RecvEmpirePacket()) return; break; case HEADER_GC_LOGIN_SUCCESS3: if (__RecvLoginSuccessPacket3()) return; break; case HEADER_GC_LOGIN_SUCCESS4: if (__RecvLoginSuccessPacket4()) return; break; case HEADER_GC_PLAYER_CREATE_SUCCESS: if (__RecvPlayerCreateSuccessPacket()) return; break; case HEADER_GC_PLAYER_CREATE_FAILURE: if (__RecvPlayerCreateFailurePacket()) return; break; case HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID: if (__RecvPlayerDestroyFailurePacket()) return; break; case HEADER_GC_PLAYER_DELETE_SUCCESS: if (__RecvPlayerDestroySuccessPacket()) return; break; case HEADER_GC_CHANGE_NAME: if (__RecvChangeName()) return; break; case HEADER_GC_HANDSHAKE: RecvHandshakePacket(); return; break; case HEADER_GC_HANDSHAKE_OK: RecvHandshakeOKPacket(); return; break; case HEADER_GC_HYBRIDCRYPT_KEYS: RecvHybridCryptKeyPacket(); return; break; case HEADER_GC_HYBRIDCRYPT_SDB: RecvHybridCryptSDBPacket(); return; break; #ifdef _IMPROVED_PACKET_ENCRYPTION_ case HEADER_GC_KEY_AGREEMENT: RecvKeyAgreementPacket(); return; break; case HEADER_GC_KEY_AGREEMENT_COMPLETED: RecvKeyAgreementCompletedPacket(); return; break; #endif case HEADER_GC_PLAYER_POINT_CHANGE: TPacketGCPointChange PointChange; Recv(sizeof(TPacketGCPointChange), &PointChange); return; break; /////////////////////////////////////////////////////////////////////////////////////////// case HEADER_GC_PING: if (RecvPingPacket()) return; break; } RecvErrorPacket(header); }
TInt YModem::ReadPackets(TUint8*& aDest, TInt aLength) { TInt l=0; TInt r=KErrNone; while(l<aLength || iState==0) { TInt retries=0; for(retries=0; retries<KMaxRetries; retries++) { if (iState==0) iTimeout=2000000, WriteC(iInitChar); r=ReadPacket(iPacketBuf); // test.Printf(_L("%d\n"),r); if (r==KErrTimedOut) continue; if (r==KErrNone) r=CheckPacket(aDest); if (r==KErrEof || r==KErrSessionClosed) break; if (r==KErrNone || r==KErrAlreadyExists) { if (r==KErrNone) iState++; if (iState>1) aDest+=iBlockSize; // don't store packet 0 if (iInitChar==BIGC) WriteC(ACK); if (iState==1) WriteC(iInitChar); // Send another 'C' after ACK if (r==KErrAlreadyExists) continue; break; } if (r==KErrAbort) break; if (iInitChar==BIGG) break; WriteC(NAK); } if (r==KErrNone) { if (iState>1) l+=iBlockSize; } else if (r==KErrSessionClosed) { if (iInitChar==BIGC) WriteC(ACK); break; } else if (r==KErrEof) { WriteC(ACK); // acknowledge end break; } else if (r!=KErrAbort) { WriteC(CAN); WriteC(CAN); WriteC(CAN); WriteC(CAN); WriteC(CAN); break; } } return r; }