?? myendpoint.cpp
字號(hào):
/*
*/
// MyEndPoint.cpp: implementation of the CMyEndPoint class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VISEP.h"
#include "MyEndPoint.h"
#include "VISEPDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//捕獲視頻流
void CMyVideoGrabber::OnStream(BYTE *frame,int width,int height)
{
//實(shí)現(xiàn)顯示本地視頻
BYTE * p=m_dlg.m_localVideo.GetBuffer(width,height);
if(p)
{
memcpy(p,frame,width*height*3);
m_dlg.m_localVideo.ReleaseBuffer();
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyEndPoint::CMyEndPoint(CVISEPDlg &dlg):CH323EndPoint(TRUE),m_dlg(dlg),m_grabber(dlg)
{
}
CMyEndPoint::~CMyEndPoint()
{
}
CString CMyEndPoint::GetRemoteName(DWORD connID)
{
CString ret;
char name[256]="";
GetRemotePartyName(connID,name,256);
ret=name;
//去掉remotePartyName后面跟的IP地址
int i=ret.ReverseFind('[');
if(i>=0)
{
ret.Delete(i,ret.GetLength()-i);
ret.TrimRight(' ');
}
return ret;
}
void CMyEndPoint::OnAnswerCall(DWORD connID,const char *RoomID)
{
m_dlg.OnAnswerCall(connID);
}
void CMyEndPoint::OnWaitForAnswer(DWORD connID)
{
m_dlg.OnWaitForAnswer();
}
void CMyEndPoint::OnConnectionCleared(DWORD connID, DWORD duration,enum CallEndReason reason)
{
m_dlg.OnCallEnded(duration,reason);
}
void CMyEndPoint::OnConnectionEstablished(DWORD connID)
{
m_dlg.OnTalking();
}
void CMyEndPoint::OnReceiveUserInput(DWORD connID,const char* value)
{
}
void CMyEndPoint::OnReceiveNonStandardMsg(DWORD connID,const char* value)
{
m_dlg.OnReceiveNonStandardMsg(value);
}
BOOL CMyEndPoint::OnRenderAudioFrame(DWORD connID,BYTE* frame,int len)
{
//直接將數(shù)據(jù)輸出到播放設(shè)備
return m_player.Write(frame,len);
}
BOOL CMyEndPoint::OnReadAudioFrame(DWORD connID,BYTE* frame,int len)
{
//直接從錄音設(shè)備讀取數(shù)據(jù)
return m_recorder.Read(frame,len);
}
BOOL CMyEndPoint::OnAudioStop(DWORD connID, BOOL outgoing,const char *CodecName)
{
if(outgoing)
{
m_recorder.Close();
}
else
{
m_player.Close();
}
return TRUE;
}
BOOL CMyEndPoint::OnAudioStart(DWORD connID,BOOL outgoing,const char *CodecName)
{
BOOL ret=FALSE;
CWinApp *app=AfxGetApp();
if(outgoing)
{
//打開(kāi)錄音設(shè)備
ret=m_recorder.Open(app->GetProfileInt("",KEY_AUDIO_INPUT_DEVICE,0));
}
else
{
//打開(kāi)播放設(shè)備
ret=m_player.Open(app->GetProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,0));
}
return ret;
}
BOOL CMyEndPoint::OnRenderVideoFrame(DWORD connID,BYTE *frame, int width, int height)
{
//畫(huà)出遠(yuǎn)端視頻
BYTE * p=m_dlg.m_remoteVideo.GetBuffer(width,height);
if(p)
{
memcpy(p,frame,width*height*3);
m_dlg.m_remoteVideo.ReleaseBuffer();
}
return TRUE;
}
BOOL CMyEndPoint::OnReadVideoFrame(DWORD connID,BYTE* frame,int width,int height)
{
//從視頻捕獲設(shè)備讀取視頻幀
return m_grabber.Read(frame,width,height);
}
BOOL CMyEndPoint::OnVideoStop(DWORD connID,BOOL outgoing,const char *CodecName)
{
if(outgoing)
{
//停止發(fā)送視頻。如果本地視頻窗口沒(méi)有開(kāi)啟,就將視頻捕獲設(shè)備關(guān)閉
if(m_dlg.m_localVideo.m_hWnd==NULL)
{
m_grabber.Close();
}
m_dlg.GetMenu()->ModifyMenu(ID_SEND_VIDEO,MF_BYCOMMAND|MF_STRING,ID_SEND_VIDEO,"開(kāi)始發(fā)送視頻(&S)");
}
else
{
//停止接收遠(yuǎn)端視頻。如果遠(yuǎn)端視頻窗口開(kāi)啟,自動(dòng)將它關(guān)閉
if(m_dlg.m_remoteVideo.m_hWnd!=NULL)
m_dlg.SendMessage(WM_COMMAND,ID_REMOTE_VIDEO);
}
return TRUE;
}
BOOL CMyEndPoint::OnVideoStart(DWORD connID,BOOL outgoing,const char* CodecName)
{
BOOL ret=FALSE;
if(outgoing)
{
//開(kāi)始發(fā)送視頻
if(m_grabber.IsOpened())
{
//視頻捕捉設(shè)備已經(jīng)開(kāi)啟
ret=TRUE;
}
else
{
//打開(kāi)視頻捕捉設(shè)備
CWinApp *app=AfxGetApp();
ret=m_grabber.Open(app->GetProfileInt("",KEY_VIDEO_DEVICE,0));
if(ret)
{
m_dlg.GetMenu()->ModifyMenu(ID_SEND_VIDEO,MF_BYCOMMAND|MF_STRING,ID_SEND_VIDEO,"停止發(fā)送視頻(&S)");
}
}
}
else
{
//開(kāi)始接收遠(yuǎn)端視頻
if(m_dlg.m_remoteVideo.m_hWnd==NULL)
m_dlg.SendMessage(WM_COMMAND,ID_REMOTE_VIDEO);
ret=TRUE;
}
return ret;
}
void CMyEndPoint::OnUseGatekeeper(enum UseGKResult result,const char* name_GK)
{
if(result==RegistrationSuccessful)
{
//成功登錄到網(wǎng)守
m_dlg.GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_ENABLED);
CString s;
s.Format("網(wǎng)守: %s",name_GK);
m_dlg.m_statusBar.SetText(s,3,0);
}
else
{
AfxMessageBox("登錄網(wǎng)守失敗!");
m_dlg.GetMenu()->EnableMenuItem(ID_LOGIN,MF_BYCOMMAND|MF_ENABLED);
m_dlg.m_statusBar.SetText("未登錄到網(wǎng)守",3,0);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -