?? visepdlg.cpp
字號:
case ConnNotExist:
m_statusBar.SetText("不在會議中",0,0);
break;
case IncomingCallWait:
m_statusBar.SetText("有呼叫到來...",0,0);
break;
case WaitingForAnswer:
m_statusBar.SetText("等待對方應(yīng)答...",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來實(shí)現(xiàn)簡單的會議控制
//開發(fā)者可以利用nonstandard message實(shí)現(xiàn)符合自己需求的會議控制,以及電子
//白板、文件共享等功能
//
//VIS MCU\VIS EP中使用的簡單的控制命令如下
// [前綴] 含義
// "MADD" 由MCU發(fā)給EP,告訴EP有人加入會議
// "MDEL" 由MCU發(fā)給EP,告訴EP有人離開會議
// "LIST" 由EP發(fā)給MCU,向MCU索取會議成員列表
// "ROOM" 由MCU發(fā)給EP,告訴EP當(dāng)前所在會議名
// "ANNO" 通知信息,由MCU發(fā)給所有EP
// "MSGA" 某個EP向所有人發(fā)話,由MCU發(fā)給EP
// "MSGP" 某個EP發(fā)話給另一個EP,由MCU發(fā)給EP
// "SMSG" EP發(fā)話給另一個EP,由EP發(fā)給MCU,MCU然后轉(zhuǎn)發(fā)成"MSGA"或者"MSGP"
// "SETA" EP發(fā)給MCU,告訴MCU要切換音頻
// "SETV" EP發(fā)給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("服務(wù)器消息: %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之間能夠互發(fā)消息
{
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發(fā)送成員列表請求
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()
{
//向其他終端發(fā)話
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
{
//打開視頻捕獲設(shè)備,實(shí)現(xiàn)本地視頻預(yù)覽
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發(fā)送切換音頻的請求
m_pep->SendNonStandardMsg(m_connID,str);
str.Format("SETV %d",id);
//向MCU發(fā)送切換視頻的請求
m_pep->SendNonStandardMsg(m_connID,str);
}
*pResult = 0;
}
void CVISEPDlg::OnAudio()
{
//音頻設(shè)置
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);
//默認(rèn)禁用靜音抑制
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()
{
//視頻設(shè)置
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()
{
//網(wǎng)絡(luò)設(shè)置
COptionNetwork dlg;
CWinApp *app=AfxGetApp();
dlg.m_bandwidth=m_pep->GetInitialBandwidth()/1000;
dlg.m_listenPort=app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT);
//默認(rèn)禁用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()
{
//網(wǎng)守設(shè)置
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()
{
//登錄網(wǎng)守
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("正在登錄網(wǎng)守...",3,0);
}
}
void CVISEPDlg::OnLogout()
{
//從網(wǎng)守注銷
m_pep->UnuseGatekeeper();
GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_GRAYED);
m_statusBar.SetText("未登錄到網(wǎng)守",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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -