📄 tvmeetingdlg.cpp
字号:
}
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 + -