📄 myendpoint.cpp
字号:
/*
*/
// 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)
{
//实现显示本地视频
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)
{
//直接将数据输出到播放设备
return m_player.Write(frame,len);
}
BOOL CMyEndPoint::OnReadAudioFrame(DWORD connID,BYTE* frame,int len)
{
//直接从录音设备读取数据
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)
{
//打开录音设备
ret=m_recorder.Open(app->GetProfileInt("",KEY_AUDIO_INPUT_DEVICE,0));
}
else
{
//打开播放设备
ret=m_player.Open(app->GetProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,0));
}
return ret;
}
BOOL CMyEndPoint::OnRenderVideoFrame(DWORD connID,BYTE *frame, int width, int height)
{
//画出远端视频
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)
{
//从视频捕获设备读取视频帧
return m_grabber.Read(frame,width,height);
}
BOOL CMyEndPoint::OnVideoStop(DWORD connID,BOOL outgoing,const char *CodecName)
{
if(outgoing)
{
//停止发送视频。如果本地视频窗口没有开启,就将视频捕获设备关闭
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,"开始发送视频(&S)");
}
else
{
//停止接收远端视频。如果远端视频窗口开启,自动将它关闭
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)
{
//开始发送视频
if(m_grabber.IsOpened())
{
//视频捕捉设备已经开启
ret=TRUE;
}
else
{
//打开视频捕捉设备
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,"停止发送视频(&S)");
}
}
}
else
{
//开始接收远端视频
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)
{
//成功登录到网守
m_dlg.GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_ENABLED);
CString s;
s.Format("网守: %s",name_GK);
m_dlg.m_statusBar.SetText(s,3,0);
}
else
{
AfxMessageBox("登录网守失败!");
m_dlg.GetMenu()->EnableMenuItem(ID_LOGIN,MF_BYCOMMAND|MF_ENABLED);
m_dlg.m_statusBar.SetText("未登录到网守",3,0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -