📄 visepdlg.cpp
字号:
case ConnNotExist:
m_statusBar.SetText("不在会议中",0,0);
break;
case IncomingCallWait:
m_statusBar.SetText("有呼叫到来...",0,0);
break;
case WaitingForAnswer:
m_statusBar.SetText("等待对方应答...",0,0);
break;
case MakingCall:
m_statusBar.SetText("正在呼叫...",0,0);
break;
case HangingUp:
m_statusBar.SetText("正在挂断...",0,0);
break;
}
}
}
void CVISEPDlg::OnOK()
{
}
void CVISEPDlg::OnCancel()
{
}
void CVISEPDlg::OnAnswer()
{
//接听
m_pep->AnswerCall(m_connID,TRUE);
}
//VIS MCU和VIS EP示例程序中利用nonstandard message来实现简单的会议控制
//开发者可以利用nonstandard message实现符合自己需求的会议控制,以及电子
//白板、文件共享等功能
//
//VIS MCU\VIS EP中使用的简单的控制命令如下
// [前缀] 含义
// "MADD" 由MCU发给EP,告诉EP有人加入会议
// "MDEL" 由MCU发给EP,告诉EP有人离开会议
// "LIST" 由EP发给MCU,向MCU索取会议成员列表
// "ROOM" 由MCU发给EP,告诉EP当前所在会议名
// "ANNO" 通知信息,由MCU发给所有EP
// "MSGA" 某个EP向所有人发话,由MCU发给EP
// "MSGP" 某个EP发话给另一个EP,由MCU发给EP
// "SMSG" EP发话给另一个EP,由EP发给MCU,MCU然后转发成"MSGA"或者"MSGP"
// "SETA" EP发给MCU,告诉MCU要切换音频
// "SETV" EP发给MCU,告诉MCU要切换视频
void CVISEPDlg::OnReceiveNonStandardMsg(CString value)
{
CString prefix=value.Left(4);
CString content=value.Right(value.GetLength()-4-1);
if(prefix=="MADD")//有人加入会议
{
int index=content.Find(' ');
DWORD id=StrToInt(content.Left(index));
CString body=content.Right(content.GetLength()-index-1);
index=m_memberList.InsertItem(m_memberList.GetItemCount(),body);
m_memberList.SetItemData(index,id);
index=m_ctlTalkTo.AddString(body);
m_ctlTalkTo.SetItemData(index,id);
}
else if(prefix=="MDEL")//有人离开会议
{
int index;
DWORD id=StrToInt(content);
LVFINDINFO lfi;
lfi.flags=LVFI_PARAM;
lfi.lParam=id;
index=m_memberList.FindItem(&lfi);
if(index>=0)
{
m_memberList.DeleteItem(index);
m_ctlTalkTo.DeleteString(index);
}
}
else if(prefix=="ROOM")//会议名称
{
GetDlgItem(IDC_ROOM_NAME)->SetWindowText(content);
Output("加入会议:\"%s\"",content);
}
else if(prefix=="ANNO")
{
Output("服务器消息: %s",content);
}
else if(prefix=="MSGA")//对所有人说
{
int index=content.Find(' ');
DWORD id=StrToInt(content.Left(index));
CString body=content.Right(content.GetLength()-index-1);
LVFINDINFO lfi;
lfi.flags=LVFI_PARAM;
lfi.lParam=id;
index=m_memberList.FindItem(&lfi);
if(index>=0)
{
Output("%s 对所有人说: %s",m_memberList.GetItemText(index,0),body);
}
}
else if(prefix=="MSGP")//对我说
{
int index=content.Find(' ');
DWORD id=StrToInt(content.Left(index));
CString body=content.Right(content.GetLength()-index-1);
LVFINDINFO lfi;
lfi.flags=LVFI_PARAM;
lfi.lParam=id;
index=m_memberList.FindItem(&lfi);
if(index>=0)
{
Output("%s 说: %s",m_memberList.GetItemText(index,0),body);
}
}
else if(prefix=="SMSG")//为了使VISEP之间能够互发消息
{
int index=content.Find(' ');
DWORD id=StrToInt(content.Left(index));
CString body=content.Right(content.GetLength()-index-1);
Output("%s 说: %s",m_pep->GetRemoteName(m_connID),body);
}
}
void CVISEPDlg::OnRefresh()
{
//刷新会议成员列表
m_memberList.DeleteAllItems();
m_memberList.InsertItem(0,"所有人");
m_memberList.SetItemData(0,0);
m_ctlTalkTo.ResetContent();
m_ctlTalkTo.AddString("所有人");
m_ctlTalkTo.SetItemData(0,0);
m_ctlTalkTo.SetCurSel(0);
//向MCU发送成员列表请求
m_pep->SendNonStandardMsg(m_connID,"LIST");
}
HBRUSH CVISEPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_STATIC&&pWnd->GetDlgCtrlID()==IDC_MSG_LIST)
{
pDC->SetBkColor(0x00ffffff);
return m_brush;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
void CVISEPDlg::OnSend()
{
//向其他终端发话
UpdateData();
int index=m_ctlTalkTo.GetCurSel();
if(index>=0&&!m_msg.IsEmpty())
{
DWORD id=m_ctlTalkTo.GetItemData(index);
//如果id==0表示向所有人说
CString str;
str.Format("SMSG %d %s",id,m_msg);
m_pep->SendNonStandardMsg(m_connID,str);
CString talkTo;
m_ctlTalkTo.GetWindowText(talkTo);
str.Format("你对 %s说: %s",talkTo,m_msg);
Output(str);
m_msg="";
UpdateData(FALSE);
}
}
void CVISEPDlg::Output(LPCTSTR str,...)
{
CString out;
va_list argList;
va_start(argList, str);
out.FormatV(str,argList);
va_end(argList);
CEdit *edit=(CEdit*)GetDlgItem(IDC_MSG_LIST);
CString output;
char t[20];
_strtime(t);
output.Format("[%s] %s\r\r\n",t,out);
edit->SetSel(edit->GetWindowTextLength(),-1);
edit->ReplaceSel(output);
}
void CVISEPDlg::Output(UINT nID,...)
{
CString str;
str.LoadString(nID);
CString out;
va_list argList;
va_start(argList, nID);
out.FormatV(str,argList);
va_end(argList);
Output(out);
}
void CVISEPDlg::OnLocalVideo()
{
if(m_localVideo.m_hWnd==NULL)
{
m_localVideo.Create(this,0,"本地视频",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,0,0);
if(m_pep->m_grabber.IsOpened())
m_pep->m_grabber.StartStream(176,144);
else
{
//打开视频捕获设备,实现本地视频预览
CWinApp *app=AfxGetApp();
m_pep->m_grabber.Open(app->GetProfileInt("",KEY_VIDEO_DEVICE,0));
m_pep->m_grabber.StartStream(176,144);
}
}
else
{
m_pep->m_grabber.StopStream();
if(!m_pep->IsVideoSending(m_connID))
m_pep->m_grabber.Close();
m_localVideo.DestroyWindow();
}
}
void CVISEPDlg::OnRemoteVideo()
{
if(m_remoteVideo.m_hWnd==NULL)
{
m_remoteVideo.Create(this,0,"对方视频",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,0,0);
}
else
{
m_remoteVideo.DestroyWindow();
}
}
void CVISEPDlg::OnItemchangedMemberList(NMHDR* pNMHDR, LRESULT* pResult)
{
//切换会议成员
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(m_pep->GetConnectionStatus(m_connID)==ConnEstablished)
{
int index=m_memberList.GetNextItem(-1,LVNI_SELECTED);
DWORD id=0;
if(index>=0)
{
id=m_memberList.GetItemData(index);
}
CString str;
str.Format("SETA %d",id);
//向MCU发送切换音频的请求
m_pep->SendNonStandardMsg(m_connID,str);
str.Format("SETV %d",id);
//向MCU发送切换视频的请求
m_pep->SendNonStandardMsg(m_connID,str);
}
*pResult = 0;
}
void CVISEPDlg::OnAudio()
{
//音频设置
COptionAudio dlg;
CWinApp *app=AfxGetApp();
dlg.m_outputDevice=app->GetProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,0);
dlg.m_inputDevice=app->GetProfileInt("",KEY_AUDIO_INPUT_DEVICE,0);
dlg.m_jitter=app->GetProfileInt("",KEY_AUDIO_JITTER,60);
//默认禁用静音抑制
dlg.m_silenceDetection=app->GetProfileInt("",KEY_SILENCE_DETECTION_MODE,0);
dlg.m_threshold=app->GetProfileInt("",KEY_SILENCE_DETECTION_THRESHOLD,0);
dlg.m_preferredCodec=m_pep->GetPreferredAudioCodec();
if(dlg.DoModal()==IDOK)
{
app->WriteProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,dlg.m_outputDevice);
app->WriteProfileInt("",KEY_AUDIO_INPUT_DEVICE,dlg.m_inputDevice);
app->WriteProfileInt("",KEY_AUDIO_JITTER,dlg.m_jitter);
m_pep->SetMaxAudioDelayJitter(0,dlg.m_jitter);
m_pep->SetMaxAudioDelayJitter(m_connID,dlg.m_jitter);
app->WriteProfileInt("",KEY_SILENCE_DETECTION_MODE,dlg.m_silenceDetection);
app->WriteProfileInt("",KEY_SILENCE_DETECTION_THRESHOLD,dlg.m_threshold);
m_pep->SetSilenceDetectionMode(0,(enum SilenceDetectionMode)dlg.m_silenceDetection,dlg.m_threshold);
m_pep->SetSilenceDetectionMode(m_connID,(enum SilenceDetectionMode)dlg.m_silenceDetection,dlg.m_threshold);
app->WriteProfileInt("",KEY_PREFERRED_AUDIO_CODEC,dlg.m_preferredCodec);
m_pep->SetPreferredAudioCodec(dlg.m_preferredCodec);
}
}
void CVISEPDlg::OnVideo()
{
//视频设置
COptionVideo dlg;
CWinApp *app=AfxGetApp();
dlg.m_device=app->GetProfileInt("",KEY_VIDEO_DEVICE,0);
dlg.m_directShow=app->GetProfileInt("",KEY_USE_DIRECTSHOW,1)>0;
dlg.m_autoSend=app->GetProfileInt("",KEY_AUTO_SEND_VIDEO,1)>0;
dlg.m_format=app->GetProfileInt("",KEY_VIDEO_FORMAT,0)==0?0:1;
dlg.m_quality=app->GetProfileInt("",KEY_VIDEO_QUALITY,100);
if(dlg.DoModal()==IDOK)
{
app->WriteProfileInt("",KEY_VIDEO_DEVICE,dlg.m_device);
app->WriteProfileInt("",KEY_USE_DIRECTSHOW,dlg.m_directShow?1:0);
m_pep->m_grabber.SetGrabberMode(dlg.m_directShow?VG_DS:VG_VFW);
app->WriteProfileInt("",KEY_AUTO_SEND_VIDEO,dlg.m_autoSend?1:0);
m_pep->AutoSendVideo(dlg.m_autoSend);
app->WriteProfileInt("",KEY_VIDEO_FORMAT,dlg.m_format);
m_pep->SetVideoSize(0,dlg.m_format==0?VS_QCIF:VS_CIF);
m_pep->SetVideoSize(m_connID,dlg.m_format==0?VS_QCIF:VS_CIF);
app->WriteProfileInt("",KEY_VIDEO_QUALITY,dlg.m_quality);
m_pep->SetVideoQuality(0,dlg.m_quality);
m_pep->SetVideoQuality(m_connID,dlg.m_quality);
}
}
void CVISEPDlg::OnNetwork()
{
//网络设置
COptionNetwork dlg;
CWinApp *app=AfxGetApp();
dlg.m_bandwidth=m_pep->GetInitialBandwidth()/1000;
dlg.m_listenPort=app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT);
//默认禁用fast-start
dlg.m_faststart=app->GetProfileInt("",KEY_FASTSTART,0)>0;
dlg.m_h245insetup=app->GetProfileInt("",KEY_H245INSETUP,1)>0;
dlg.m_h245tunnel=app->GetProfileInt("",KEY_H245TUNNEL,1)>0;
if(dlg.DoModal()==IDOK)
{
app->WriteProfileInt("",KEY_BANDWIDTH,dlg.m_bandwidth);
m_pep->SetInitialBandwidth(dlg.m_bandwidth*1000);
app->WriteProfileInt("",KEY_LISTEN_PORT,dlg.m_listenPort);
m_pep->StartListen(NULL,(WORD)dlg.m_listenPort);
app->WriteProfileInt("",KEY_FASTSTART,dlg.m_faststart?1:0);
app->WriteProfileInt("",KEY_H245INSETUP,dlg.m_h245insetup?1:0);
app->WriteProfileInt("",KEY_H245TUNNEL,dlg.m_h245tunnel?1:0);
m_pep->EnableFastStart(dlg.m_faststart);
m_pep->EnableH245inSetup(dlg.m_h245insetup);
m_pep->EnableH245Tunnel(dlg.m_h245tunnel);
}
}
void CVISEPDlg::OnGatekeeper()
{
//网守设置
COptionGatekeeper dlg;
CWinApp *app=AfxGetApp();
char name[256]="";
m_pep->GetUserName(name,256);
dlg.m_userName=name;
m_pep->GetUserAlias(name,256);
dlg.m_userAlias=name;
dlg.m_password=app->GetProfileString("",KEY_PASSWORD);
dlg.m_gkAddr=app->GetProfileString("",KEY_GK_ADDRESS);
if(dlg.DoModal()==IDOK)
{
app->WriteProfileString("",KEY_USER_NAME,dlg.m_userName);
app->WriteProfileString("",KEY_USER_ALIAS,dlg.m_userAlias);
m_pep->SetUserName(dlg.m_userName,dlg.m_userAlias);
app->WriteProfileString("",KEY_PASSWORD,dlg.m_password);
app->WriteProfileString("",KEY_GK_ADDRESS,dlg.m_gkAddr);
}
}
void CVISEPDlg::OnLogin()
{
//登录网守
CWinApp *app=AfxGetApp();
if(m_pep->UseGatekeeper(app->GetProfileString("",KEY_GK_ADDRESS),
app->GetProfileString("",KEY_PASSWORD)))
{
GetMenu()->EnableMenuItem(ID_LOGIN,MF_BYCOMMAND|MF_GRAYED);
m_statusBar.SetText("正在登录网守...",3,0);
}
}
void CVISEPDlg::OnLogout()
{
//从网守注销
m_pep->UnuseGatekeeper();
GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_GRAYED);
m_statusBar.SetText("未登录到网守",3,0);
}
void CVISEPDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
m_micVolume.SetPos(m_pep->GetAudioSignalLevel(m_connID,TRUE));
m_spkVolume.SetPos(m_pep->GetAudioSignalLevel(m_connID,FALSE));
}
else if(nIDEvent==2)
{
CString s;
DWORD dur;
m_pep->GetConnectionDuration(m_connID,dur);
s.Format("正在会议...%02d:%02d:%02d",dur/3600,dur/60%60,dur%60);
m_statusBar.SetText(s,0,0);
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -