⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvmeetingdlg.cpp

📁 用c++做的视频会议源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}	
	bRet=TRUE;
	return bRet;
}
void CTVMeetingDlg::SetCmdDst(char *ip, unsigned short port)
{
	m_Cmddst.sin_family=AF_INET;
	//convert the computer name to internet Address
	m_Cmddst.sin_addr.s_addr=CUDPSocket::Name2Inet(ip);
	m_Cmddst.sin_port=htons(port);
	
}
void CTVMeetingDlg::SetAVDst(char *ip, unsigned short port)
{
	m_AVdst.sin_family=AF_INET;
	m_AVdst.sin_addr.s_addr=CUDPSocket::Name2Inet(ip);
	m_AVdst.sin_port=htons(port);
	
}
BOOL CTVMeetingDlg::SendCmd(PACK_CMD *pCmd, UINT nLen,sockaddr_in &addr, BOOL bFlag)
{
	if(!pCmd) return FALSE;
	pCmd->id=m_idCmd++;
	int l=m_CMDSocket.SendTo((char*)pCmd,nLen,(sockaddr*)&addr);
	CString str;
	str.Format("%d",pCmd->id);
	if(l>0)
	{
		if(bFlag)
		{
			m_CmdQueue.Add(pCmd->m_ChatNo,(char*)pCmd,nLen,addr);//把命令加入命令表
			SetTimer(pCmd->m_ChatNo,800,CmdTimeOutProc);
		}
		return TRUE;
	}
	else
		return FALSE;
}

void CTVMeetingDlg::OnJoin() 
{
	int i=0;
	for (i=0;i<MAX_CONNECT_USER;i++)
	{
		char sCall[20];
		CString strCall;
		strCall=sIP[i];
		if (strCall!="")
		{
			strcpy(sCall,strCall.GetBuffer(strCall.GetLength()));
			Call(sCall,PORT,i+1);
		}
	}

}

void CTVMeetingDlg::OnExit() 
{
	OnClose();
}


void CALLBACK CTVMeetingDlg::CmdTimeOutProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
	if(pDlgInst)
	{
		UINT len;
		char resend;sockaddr_in addr;
		char* p=pDlgInst->m_CmdQueue.GetBuf(idEvent,len,resend,addr);//if overtime,i will send again
		if(p)
		{
			CString strIP;
			strIP.Format("%d.%d.%d.%d",
				addr.sin_addr.S_un.S_un_b.s_b1,
				addr.sin_addr.S_un.S_un_b.s_b2,
				addr.sin_addr.S_un.S_un_b.s_b3,
				addr.sin_addr.S_un.S_un_b.s_b4);

			if(resend<5)
			{
				len=pDlgInst->m_CMDSocket.SendTo(p,len,(sockaddr*)&addr);
			}
			else//if the resend times more than 4, so will declare connect fail
			{
				
				pDlgInst->KillTimer(idEvent);//
				
				if(pDlgInst)
				{
					PACK_CMD* pCmd=(PACK_CMD*)p;
					switch(pCmd->cmd)
					{
					case CMD_JOIN:
						{
							AfxMessageBox("Can not connect to "+strIP+"!");
						}
						break;
				
					}
				}
				pDlgInst->m_CmdQueue.Remove(idEvent);//把命令从表中移除
			
			}
		}
		else
			pDlgInst->KillTimer(idEvent);
	}
}

void CTVMeetingDlg::OnDestroy()
{
	pDlgInst=0;
	DestroyAudioRec();  //wzz 2003-4-3
	DestroyAudioPlay();
	m_CodecMgr.DestroyCodecV();
	m_CodecMgr1.DestroyCodecV();
	m_CodecMgr2.DestroyCodecV();
	m_CodecMgr.DestroyCodecA();
	m_CodecMgr1.DestroyCodecA();
	m_CodecMgr2.DestroyCodecA();
	m_ViCap.Destroy();
	DestroySocket(SOCK_CMD);
	DestroySocket(SOCK_AV);		

}

void CTVMeetingDlg::OnTimer(UINT nIDEvent) 
{
	CDialog::OnTimer(nIDEvent);
}
void CTVMeetingDlg::InitAV() 
{
	if(!m_CodecMgr.InitCodecV()||!m_CodecMgr1.InitCodecV()||!m_CodecMgr2.InitCodecV())
	{
		AfxMessageBox("Video Codec Init Failed !");
	}

    if(!m_CodecMgr.InitCodecA())
	{
		AfxMessageBox("Audio Decode Init fail!");
	}
	m_hAudioIn=CreateThread(0,0,AudioInThreadProc,this,0,&m_dwAudioInId);
	if(!m_hAudioIn)
	{
		AfxMessageBox("Init Audio Thread fail!");
	}
	m_AudioPlay.Destroy();	
	m_AudioRec.Destroy();
	if(!m_AudioRec.Create(0,m_dwAudioInId,(DWORD)this,CALLBACK_THREAD,SIZE_AUDIO_FRAME))
	{
		AfxMessageBox("Record Init fail!");
	}
	
	if(!m_AudioRec.Start())
	{
		AfxMessageBox("Record fail!");
	}

	DestroyAudioPlay();
	m_hAudioDecode=CreateThread(0,0,AudioDecodeThreadProc,this,0,&m_dwAudioDecodeId);
	if(!m_hAudioDecode)
	{
		AfxMessageBox("Init Audio output thread fail!");
	}
	m_hAudioDecode2=CreateThread(0,0,AudioDecodeThreadProc2,this,0,&m_dwAudioDecodeId2);
	if(!m_hAudioDecode2)
	{
		AfxMessageBox("Init Audio output thread fail!");
	}
	m_hAudioDecode3=CreateThread(0,0,AudioDecodeThreadProc3,this,0,&m_dwAudioDecodeId3);
	if(!m_hAudioDecode3)
	{
		AfxMessageBox("Init Audio output thread fail!");
	}

	m_hPlayAudio=CreateThread(0,0,PlayAudioThreadProc,this,0,&m_dwPlayAudioId);
	if(!m_hPlayAudio)
	{
		AfxMessageBox("Init Play Audio thread fail!");
	}
	m_hPlayAudioExt=CreateThread(0,0,PlayAudioExtThreadProc,this,0,&m_dwPlayAudioExtId);
	if(!m_hPlayAudioExt)
	{
		AfxMessageBox("Init Play AudioExt thread fail!");
	}
	if(!m_AudioPlay.Create(0,m_dwAudioDecodeId,(DWORD)this,CALLBACK_THREAD))
	{
		AfxMessageBox("Init audio output fail!");
	}
	/*
	if(!m_AudioPlay.Create(0,m_dwAudioDecodeId2,(DWORD)this,CALLBACK_THREAD))
	{
		AfxMessageBox("Init audio output fail!");
	}
	if(!m_AudioPlay.Create(0,m_dwAudioDecodeId3,(DWORD)this,CALLBACK_THREAD))
	{
		AfxMessageBox("Init audio output fail!");
	}
	*/
	if(!InitCap())
	{
		AfxMessageBox("Init Capture fail!");
	}
	
}


DWORD WINAPI CTVMeetingDlg::AudioInThreadProc(LPVOID lpParameter)
{
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	MSG msg;
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{
		case WIM_DATA:
			{
				WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
				waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));			
				if(pWH->dwBytesRecorded!=SIZE_AUDIO_FRAME)
					break;	
				CopyMemory(pDlg->m_AudioLocal,pWH->lpData,SIZE_AUDIO_FRAME);
				pDlg->OnEncodeAudioData(pDlg->m_AudioLocal,SIZE_AUDIO_FRAME);
				waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
				waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));

			}
			break;
		}
	}	
	
	return msg.wParam;
}


//compress the audio data and then send
void CTVMeetingDlg::OnEncodeAudioData(char *pa, int len)
{
	
		POSITION pos;
		sockaddr_in m_ASenddst;

		if (m_ClientInfoList.GetCount()!=0)
		{
			for( pos = m_ClientInfoList.GetHeadPosition(); pos != NULL; )
			{				
				CClientInfo *pClientInfo=m_ClientInfoList.GetAt(pos);
				if (pClientInfo!=NULL)
				{
					CString strIP;
					strIP.Format("%d.%d.%d.%d",
						pClientInfo->m_Cmddst.sin_addr.S_un.S_un_b.s_b1,
						pClientInfo->m_Cmddst.sin_addr.S_un.S_un_b.s_b2,
						pClientInfo->m_Cmddst.sin_addr.S_un.S_un_b.s_b3,
						pClientInfo->m_Cmddst.sin_addr.S_un.S_un_b.s_b4);
					char szIP[20];
					strcpy(szIP,strIP.GetBuffer(strIP.GetLength()));
					
					m_sockaddr=GetCurrentAddr();
					////////////////////////////////////////////////////////////////////
					m_AudioPack.flag=FLAG_AUDIO;
					m_AudioPack.type=0;
					if(m_CodecMgr.EncodeAudioData(pa,len,(char*)m_AudioPack.data,0))
					{			
						m_ASenddst.sin_family=AF_INET;
						m_ASenddst.sin_addr.s_addr=CUDPSocket::Name2Inet(szIP);
						
						if (strIP==DistributeIP[0])
						{
								m_ASenddst.sin_port=htons(m_nDistributePort1);
								m_ARecSocket1.SendTo((char*)&m_AudioPack,sizeof(PACK_AUDIO),(sockaddr*)&m_ASenddst);
								m_uDataSend+=sizeof(PACK_AUDIO);
						}
						else
						if (strIP==DistributeIP[1])
						{
								m_ASenddst.sin_port=htons(m_nDistributePort2);
								m_ARecSocket2.SendTo((char*)&m_AudioPack,sizeof(PACK_AUDIO),(sockaddr*)&m_ASenddst);
								m_uDataSend+=sizeof(PACK_AUDIO);

						}
						else 
						if (strIP==DistributeIP[2])
						{
								m_ASenddst.sin_port=htons(m_nDistributePort3);
								m_ARecSocket3.SendTo((char*)&m_AudioPack,sizeof(PACK_AUDIO),(sockaddr*)&m_ASenddst);
								m_uDataSend+=sizeof(PACK_AUDIO);

						}
					}
					
					////////////////////////////////////////////////////////////////////
					pClientInfo=NULL;
					delete pClientInfo;
				}
				m_ClientInfoList.GetNext(pos);
			}
		}			
}
BOOL CTVMeetingDlg::EncodeAudioData(char *pin,int len,char* pout,int* lenr)
{
	BOOL bRet=FALSE;
	if(!pin||len!=SIZE_AUDIO_FRAME||!pout)
		goto RET;
	//encode the audio frames
	va_g729a_encoder((short*)pin,(BYTE*)pout);
	va_g729a_encoder((short*)(pin+160),(BYTE*)pout+10);
	va_g729a_encoder((short*)(pin+320),(BYTE*)pout+20);
	va_g729a_encoder((short*)(pin+480),(BYTE*)pout+30);
	va_g729a_encoder((short*)(pin+640),(BYTE*)pout+40);
	va_g729a_encoder((short*)(pin+800),(BYTE*)pout+50);

	va_g729a_encoder((short*)(pin+960),(BYTE*)pout+60);
	va_g729a_encoder((short*)(pin+1120),(BYTE*)pout+70);
	va_g729a_encoder((short*)(pin+1280),(BYTE*)pout+80);
	va_g729a_encoder((short*)(pin+1440),(BYTE*)pout+90);
	va_g729a_encoder((short*)(pin+1600),(BYTE*)pout+100);
	va_g729a_encoder((short*)(pin+1760),(BYTE*)pout+110);

	va_g729a_encoder((short*)(pin+1920),(BYTE*)pout+120);
	va_g729a_encoder((short*)(pin+2080),(BYTE*)pout+130);
	va_g729a_encoder((short*)(pin+2240),(BYTE*)pout+140);
	va_g729a_encoder((short*)(pin+2400),(BYTE*)pout+150);
	va_g729a_encoder((short*)(pin+2560),(BYTE*)pout+160);
	va_g729a_encoder((short*)(pin+2720),(BYTE*)pout+170);

	va_g729a_encoder((short*)(pin+2880),(BYTE*)pout+180);
	va_g729a_encoder((short*)(pin+3040),(BYTE*)pout+190);
	va_g729a_encoder((short*)(pin+3200),(BYTE*)pout+200);
	va_g729a_encoder((short*)(pin+3360),(BYTE*)pout+210);
	va_g729a_encoder((short*)(pin+3520),(BYTE*)pout+220);
	va_g729a_encoder((short*)(pin+3680),(BYTE*)pout+230);

	if(lenr)
		*lenr=SIZE_AUDIO_PACKED;

	bRet=TRUE;
RET:
	return bRet;
}
DWORD WINAPI CTVMeetingDlg::AudioDecodeThreadProc(LPVOID lpParameter)
{
	
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	MSG msg;
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{	
		case IOM_AUDIO:	
			{
				if(pDlg->m_CodecMgr.DecodeAudioData((char*)((PACK_AUDIO*)msg.lParam)->data,SIZE_AUDIO_PACKED,pDlg->m_AudioRemote,0))
				{
					pDlg->PlayFlag[0]=1;
					pDlg->m_Count[0]=0;
					if(pDlg->m_iAudioBuf<MAX_AUDIO_BUFFER)
					{
						pDlg->m_iAudioBuf++;
						PostThreadMessage(pDlg->m_dwPlayAudioId,IOM_PLAY_AUDIO,0,0);
					}	
				}
						
			}
			break;
		case WOM_DONE:
			{
				WAVEHDR* pwh=(WAVEHDR*)msg.lParam;
				waveOutUnprepareHeader((HWAVEOUT)msg.wParam,pwh,sizeof(WAVEHDR));
				pDlg->m_iAudioBuf--;
				delete []pwh->lpData;//delete the momery that allocate when play the audio frame
				delete pwh;
				
			}
			break;
		}
	}
	return msg.wParam;
}
DWORD WINAPI CTVMeetingDlg::AudioDecodeThreadProc2(LPVOID lpParameter)
{
	
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	MSG msg;
	
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{	
		case IOM_AUDIO2:	
			{
				if(pDlg->m_CodecMgr.DecodeAudioData((char*)((PACK_AUDIO*)msg.lParam)->data,SIZE_AUDIO_PACKED,pDlg->m_AudioRemote2,0))
				{
					pDlg->PlayFlag[1]=1;
					pDlg->m_Count[1]=0;
					if(pDlg->m_iAudioBuf<MAX_AUDIO_BUFFER)
					{
						pDlg->m_iAudioBuf++;
						PostThreadMessage(pDlg->m_dwPlayAudioId,IOM_PLAY_AUDIO,0,0);
					}
				}
				
			}
			break;
		/*
		case WOM_DONE:
			{
				WAVEHDR* pwh=(WAVEHDR*)msg.lParam;
				waveOutUnprepareHeader((HWAVEOUT)msg.wParam,pwh,sizeof(WAVEHDR));
				pDlg->m_iAudioBuf--;
				delete []pwh->lpData;
				delete pwh;
				
			}
			break;
		*/
		}
	}
	return msg.wParam;
}
DWORD WINAPI CTVMeetingDlg::AudioDecodeThreadProc3(LPVOID lpParameter)
{
	
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	MSG msg;
	
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{	
		case IOM_AUDIO3:	
			{
				if(pDlg->m_CodecMgr.DecodeAudioData((char*)((PACK_AUDIO*)msg.lParam)->data,SIZE_AUDIO_PACKED,pDlg->m_AudioRemote3,0))
				{
					pDlg->PlayFlag[2]=1;
					pDlg->m_Count[2]=0;
					if(pDlg->m_iAudioBuf<MAX_AUDIO_BUFFER)
					{
						pDlg->m_iAudioBuf++;
						PostThreadMessage(pDlg->m_dwPlayAudioId,IOM_PLAY_AUDIO,0,0);
					}
										
				}
				
			}
			break;
		/*
		case WOM_DONE:
			{
				WAVEHDR* pwh=(WAVEHDR*)msg.lParam;
				waveOutUnprepareHeader((HWAVEOUT)msg.wParam,pwh,sizeof(WAVEHDR));
				pDlg->m_iAudioBuf--;
				delete []pwh->lpData;
				delete pwh;
				
			}
			break;
		*/
		}
	}
	return msg.wParam;
}

DWORD WINAPI CTVMeetingDlg::PlayAudioThreadProc(LPVOID lpParameter)
{
	
	CTVMeetingDlg* pDlg=(CTVMeetingDlg*)lpParameter;
	MSG msg;
	char Frame[SIZE_AUDIO_FRAME];
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{	
		case IOM_PLAY_AUDIO:	
			{
				if (pDlg->m_nDistributePort1!=0)
				{
					while (pDlg->PlayFlag[0]==0 )
					{
						::Sleep(10);
						pDlg->m_Count[0]++;
						if (pDlg->m_Count[0]>=500)
						{
							CString str;
							str.Format("*** [%s] happen exception!",pDlg->DistributeIP[0]);
							pDlg->WriteLogInfoToCtrl(str);
							pDlg->DeleteUserFromLst(pDlg->DistributeIP[0]);
							pDlg->PortBusy[0]=0;
							pDlg->m_nDistributePort1=0;
							pDlg->DistributeIP[0]="";
							pDlg->PlayFlag[0]=0;
							pDlg->m_Count[0]=0;
							ZeroMemory(pDlg->m_AudioRemote,SIZE_AUDIO_FRAME);
							
							break;
						}

					}
				}
				pDlg->m_Count[0]=0;
				if (pDlg->m_nDistributePort2!=0)
				{
					while (pDlg->PlayFlag[1]==0 )
					{
					    ::Sleep(10);
						pDlg->m_Count[1]++;
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -