Пример #1
0
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();
}
Пример #2
0
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);
		}
	}
}
Пример #3
0
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("客户服务线程有未知异常!");
	}
}
Пример #5
0
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);
}
Пример #7
0
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;
	}