亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mcuendpoint.cpp

?? 一個簡單的視頻會議VC++MFC工程文件
?? CPP
字號:
// MCUEndPoint.cpp: implementation of the CMCUEndPoint class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VISMCU.h"
#include "MCUEndPoint.h"
#include "MainFrm.h"
#include "Shlwapi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMCUEndPoint::CMCUEndPoint(CMainFrame &mainFrm):CH323EndPoint(FALSE),m_mainFrm(mainFrm)
{
	m_findingGK=FALSE;
}

CMCUEndPoint::~CMCUEndPoint()
{
	for(int i=0;i<m_roomList.GetSize();i++)
	{
		CRoom *p=m_roomList.GetAt(i);
		if(p)
			delete p;
	}
}

void CMCUEndPoint::OnAnswerCall(DWORD connID,const char *RoomID)
{//有終端呼入
	m_mainFrm.Output(IDS_LOG_INCOMING_CALL,connID,RoomID);

	if(AddMember(connID,RoomID))
	{
		
		AnswerCall(connID,TRUE);
	}
	else
	{
		AnswerCall(connID,FALSE);
	}
}

void CMCUEndPoint::OnWaitForAnswer(DWORD connID)
{
}

void CMCUEndPoint::OnConnectionCleared(DWORD connID, DWORD duration,enum CallEndReason reason)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	if(room->GetMemberCount()==1)//最后一個人離開會議,不必發送成員離開消息
		room=NULL;
	RemoveMember(connID);
	
	m_mainFrm.Output(IDS_LOG_CALLEND,connID,duration,reason);

	if(room)
	{
		//發送成員離開消息
		
		CString str;
		str.Format("MDEL %d",connID);
		for(DWORD i=0;i<room->GetMemberCount();i++)
		{
			DWORD id=room->GetMembers()[i];
			SendNonStandardMsg(id,str);
		}
	}
}

void CMCUEndPoint::OnConnectionEstablished(DWORD connID)
{
	CString roomID;
	char IP[256]="";
	char appName[256]="";
	CRoom *room=(CRoom*)GetConnectionData(connID);
	roomID=room->GetName();
	GetRemoteAddress(connID,IP,256);
	GetRemoteApplication(connID,appName,256);
	m_mainFrm.Output(IDS_LOG_ESTABLISHED,connID,roomID,GetRemoteName(connID),IP,appName);

	//通知所在會議名稱
	CString str;
	str.Format("ROOM %s",roomID);
	SendNonStandardMsg(connID,str);
	//通知會議中其他成員,有人加入
	str.Format("MADD %d %s",connID,GetRemoteName(connID));
	for(DWORD i=0;i<room->GetMemberCount();i++)
	{
		DWORD id=room->GetMembers()[i];
		if(id!=connID)
			SendNonStandardMsg(id,str);
	}
}

void CMCUEndPoint::OnReceiveUserInput(DWORD connID,const char* value)
{
}

//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 CMCUEndPoint::OnReceiveNonStandardMsg(DWORD connID,const char* value)
{
	CString v=value;
	CString prefix=v.Left(4);
	if(prefix=="LIST")
	{//終端請求成員列表
		CRoom *room=(CRoom*)GetConnectionData(connID);
		if(room)
		{
			CString str;
			for(DWORD i=0;i<room->GetMemberCount();i++)
			{
				DWORD id=room->GetMembers()[i];
				if(id!=connID)
				{					
					str.Format("MADD %d %s",id,GetRemoteName(id));
					SendNonStandardMsg(connID,str);
				}
			}
		}
	}
	else if(prefix=="SMSG")
	{//終端向其他終端發送文本信息
		CString content=v.Right(v.GetLength()-4-1);
		int index=content.Find(' ');
		DWORD id=StrToInt(content.Left(index));
		CString body=content.Right(content.GetLength()-index-1);
		CString str;
		if(id==0)//跟所有人說
		{
			str.Format("MSGA %d %s",connID,body);
			CRoom *room=(CRoom*)GetConnectionData(connID);
			if(room)
			{			
				for(DWORD i=0;i<room->GetMemberCount();i++)
				{
					DWORD id=room->GetMembers()[i];
					if(id!=connID)
					{					
						SendNonStandardMsg(id,str);
					}
				}
			}
			
		}
		else
		{
			str.Format("MSGP %d %s",connID,body);
			SendNonStandardMsg(id,str);
		}
	}
	else if(prefix=="SETV")
	{//終端要求切換視頻
		CString content=v.Right(v.GetLength()-4-1);
		DWORD id=StrToInt(content);
		CRoom *room=(CRoom*)GetConnectionData(connID);
		if(room)
		{
			if(id==0)//終端要求切換到"所有人"
				room->GetVideoMixer().SetMixerMode(connID,TRUE);
			else//終端要求切換到某一個人
			{
				room->GetVideoMixer().SetMixerMode(connID,FALSE);
				room->GetVideoMixer().SetOutgoingVideo(connID,1,&id);
			}
		}
	}
	else if(prefix=="SETA")
	{//終端要求切換音頻
		CString content=v.Right(v.GetLength()-4-1);
		DWORD id=StrToInt(content);
		CRoom *room=(CRoom*)GetConnectionData(connID);
		if(room)
		{
			if(id==0)//終端要求切換到"所有人"
				room->GetAudioMixer().SetMixerMode(connID,TRUE);
			else//終端要求切換到某一個人
			{
				room->GetAudioMixer().SetMixerMode(connID,FALSE);
				room->GetAudioMixer().SetOutgoingAudio(connID,1,&id);
			}
		}
	}
}

BOOL CMCUEndPoint::OnRenderAudioFrame(DWORD connID,BYTE* frame,int len)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetAudioMixer().Write(connID,frame,len);
}

BOOL CMCUEndPoint::OnReadAudioFrame(DWORD connID,BYTE* frame,int len)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetAudioMixer().Read(connID,frame,len);
}
	
BOOL CMCUEndPoint::OnAudioStop(DWORD connID, BOOL outgoing,const char *CodecName)
{
	m_mainFrm.Output(IDS_LOG_AUDIO_STOP,connID,outgoing?"發送":"接收",CodecName);
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetAudioMixer().RemoveChannel(connID,outgoing);
}

BOOL CMCUEndPoint::OnAudioStart(DWORD connID,BOOL outgoing,const char *CodecName)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	BOOL ret=room->GetAudioMixer().AddChannel(connID,outgoing);
	if(ret)
		m_mainFrm.Output(IDS_LOG_AUDIO_START,connID,outgoing?"發送":"接收",CodecName);

	return 	ret;
}

BOOL CMCUEndPoint::OnRenderVideoFrame(DWORD connID,BYTE *frame, int width, int height)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetVideoMixer().Write(connID,frame,width,height,FALSE);//不需要delay
}

BOOL CMCUEndPoint::OnReadVideoFrame(DWORD connID,BYTE* frame,int width,int height)
{
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetVideoMixer().Read(connID,frame,width,height);
}
	
BOOL CMCUEndPoint::OnVideoStop(DWORD connID,BOOL outgoing,const char *CodecName)
{
	m_mainFrm.Output(IDS_LOG_VIDEO_STOP,connID,outgoing?"發送":"接收",CodecName);
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	return room->GetVideoMixer().RemoveChannel(connID,outgoing);
}

BOOL CMCUEndPoint::OnVideoStart(DWORD connID,BOOL outgoing,const char* CodecName)
{	
	CRoom *room=(CRoom*)GetConnectionData(connID);
	ASSERT(room!=NULL);
	BOOL ret= room->GetVideoMixer().AddChannel(connID,outgoing,
		AfxGetApp()->GetProfileInt("",KEY_VIDEO_FPS,10),
		AfxGetApp()->GetProfileInt("",KEY_VIDEO_BKCOLOR,0x00ff0000));
	if(ret)
		m_mainFrm.Output(IDS_LOG_VIDEO_START,connID,outgoing?"發送":"接收",CodecName);
	return ret;
}

void CMCUEndPoint::OnUseGatekeeper(enum UseGKResult result,const char* name_GK)
{
	m_findingGK=FALSE;
}

CRoom* CMCUEndPoint::AddRoom(CString name)
{//增加指定名稱的會議
	if(name.GetLength()==0)//default room
		name=AfxGetApp()->GetProfileString("",KEY_DEFAULT_ROOM,DEFAULT_ROOM);
	//查找會議列表,看會議是否已經存在
	for(int i=0;i<m_roomList.GetSize();i++)
	{
		CRoom *p=m_roomList.GetAt(i);
		if(p&&p->GetName().CompareNoCase(name)==0)
			return p;
	}
	
	//新建會議
	CRoom * room=new CRoom;
	room->SetName(name);
	m_roomList.Add(room);
	CListCtrl &listCtrl=m_mainFrm.GetRoomListCtrl();
	int index=listCtrl.InsertItem(listCtrl.GetItemCount(),name);
	listCtrl.SetItemData(index,(DWORD)room);
	listCtrl.SetItemText(index,1,"0");

	m_mainFrm.Output(IDS_LOG_ADDROOM,room->GetName());
	return room;
}

BOOL CMCUEndPoint::RemoveRoom(LPCTSTR name)
{//刪除會議
	for(int i=0;i<m_roomList.GetSize();i++)
	{
		CRoom *p=m_roomList.GetAt(i);
		if(p&&p->GetName().CompareNoCase(name)==0)
		{
			if(p->GetMemberCount()==0)
			{				
			
				m_roomList.RemoveAt(i);
				CListCtrl &listCtrl=m_mainFrm.GetRoomListCtrl();
				for(int j=0;j<listCtrl.GetItemCount();j++)
					if(listCtrl.GetItemData(j)==((DWORD)p))
						listCtrl.DeleteItem(j);
				delete p;
				m_mainFrm.Output(IDS_LOG_REMOVEROOM,name);
				return TRUE;
			}
			break;
		}
	}
	return FALSE;
}

BOOL CMCUEndPoint::AddMember(DWORD connID, LPCTSTR RoomID)
{//把終端加入指定名稱的會議

	//嘗試新建會議
	CRoom *room=AddRoom(RoomID);
	if(room==NULL)
	{		
		return FALSE;
	}
	if(room->GetMemberCount()>=AfxGetApp()->GetProfileInt("",KEY_ROOM_SIZE,DEFAULT_ROOM_SIZE))
	{//會議已滿
		m_mainFrm.Output(IDS_LOG_ROOMFULL,room->GetName(),AfxGetApp()->GetProfileInt("",KEY_ROOM_SIZE,DEFAULT_ROOM_SIZE),connID);
		
		return FALSE;
	}
	CDWordArray& members=room->GetMembers();
	members.Add(connID);
	SetConnectionData(connID,(DWORD)room);
	//更新成員列表
	CListCtrl& roomListCtrl=m_mainFrm.GetRoomListCtrl();
	for(int i=0;i<roomListCtrl.GetItemCount();i++)
	{
		if(roomListCtrl.GetItemText(i,0).CompareNoCase(room->GetName())==0)
		{
			CString num;
			num.Format("%d",room->GetMemberCount());
			roomListCtrl.SetItemText(i,1,num);
			break;
		}
	}
	int index=roomListCtrl.GetNextItem(-1,LVNI_SELECTED);
	if(index>=0&&roomListCtrl.GetItemData(index)==((DWORD)room))
	{
		CListCtrl& memberListCtrl=m_mainFrm.GetMemberListCtrl();
		int index=memberListCtrl.InsertItem(memberListCtrl.GetItemCount(),GetRemoteName(connID));
		if(index>=0)
		{
			memberListCtrl.SetItemData(index,connID);
			char str[256]="";
			GetRemoteAddress(connID,str,256);
			memberListCtrl.SetItemText(index,1,str);
			GetRemoteApplication(connID,str,256);
			memberListCtrl.SetItemText(index,2,str);
			memberListCtrl.SetItemData(index,connID);
		}
	}
	m_mainFrm.Output(IDS_LOG_ADDTOROOM,connID,room->GetName());
	return TRUE;
}

CString CMCUEndPoint::GetRemoteName(DWORD connID)
{
	CString ret;
	char name[256]="";
	GetRemotePartyName(connID,name,256);
	ret=name;
	int i=ret.ReverseFind('[');
	if(i>=0)
	{
		ret.Delete(i,ret.GetLength()-i);
		ret.TrimRight(' ');
	}
	return ret;

}

BOOL CMCUEndPoint::RemoveMember(DWORD connID)
{//成員離開會議
	CRoom *room=(CRoom*)GetConnectionData(connID);
	if(room==NULL)
		return FALSE;
	room->RemoveMember(connID);
	
	CListCtrl &roomListCtrl=m_mainFrm.GetRoomListCtrl();

	int index=roomListCtrl.GetNextItem(-1,LVNI_SELECTED);
	if(index>=0&&roomListCtrl.GetItemText(index,0).CompareNoCase(room->GetName())==0)
	{
		CListCtrl& memberListCtrl=m_mainFrm.GetMemberListCtrl();
		for(int i=0;i<memberListCtrl.GetItemCount();i++)
		{
			if(memberListCtrl.GetItemData(i)==connID)
			{
				memberListCtrl.DeleteItem(i);
				break;
			}
		}
	}
	m_mainFrm.Output(IDS_LOG_LEAVE_ROOM,connID,room->GetName());
	for(int i=0;i<roomListCtrl.GetItemCount();i++)
	{
		if(roomListCtrl.GetItemData(i)==((DWORD)room))
		{
			if(room->GetMemberCount()==0)
			{
				RemoveRoom(room->GetName());
			}
			else
			{				
				CString num;
				num.Format("%d",room->GetMemberCount());
				roomListCtrl.SetItemText(i,1,num);
				break;
			}
		}
	}

	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
极品美女销魂一区二区三区| 日本免费在线视频不卡一不卡二| 欧美日韩国产高清一区二区三区| 狠狠色丁香婷综合久久| 亚洲欧美精品午睡沙发| 欧美v日韩v国产v| 欧美专区日韩专区| 成人小视频免费在线观看| 日韩影院精彩在线| 亚洲欧美激情一区二区| 久久九九99视频| 91精品国产黑色紧身裤美女| 99久久精品费精品国产一区二区| 久久99最新地址| 日韩二区三区在线观看| 亚洲日本青草视频在线怡红院| 精品久久久久99| 欧美一区二区黄色| 欧美喷潮久久久xxxxx| 91一区二区三区在线观看| 久久国产夜色精品鲁鲁99| 丝袜脚交一区二区| 亚洲一区二区视频在线| 亚洲欧美视频在线观看视频| 久久久久亚洲蜜桃| 日韩视频永久免费| 91精品国产免费久久综合| 在线中文字幕一区二区| 91丝袜高跟美女视频| 成人av先锋影音| 成人性生交大片免费看在线播放| 另类小说图片综合网| 日韩精品每日更新| 丝袜美腿亚洲一区| 男男gaygay亚洲| 日韩午夜小视频| 自拍偷拍国产精品| 欧美日韩另类一区| 精品视频999| 欧美日韩你懂的| 欧美美女视频在线观看| 欧美在线不卡视频| 欧美日韩精品系列| 欧美人xxxx| 欧美一区二区三区思思人| 制服丝袜中文字幕亚洲| 4438成人网| 成人免费看的视频| 亚洲福利视频导航| 国产欧美日韩视频在线观看| 91精品在线免费观看| av一区二区三区在线| 成人永久aaa| 欧美成人欧美edvon| 国产成人在线电影| 亚洲午夜电影在线| 国产精品视频一二三| 日韩久久久精品| 欧美一级免费观看| 成人污污视频在线观看| 国产乱淫av一区二区三区| 久久99热这里只有精品| 蜜臀久久99精品久久久久久9 | 欧美成人性战久久| 91麻豆精品视频| 欧洲一区在线电影| 99精品黄色片免费大全| 亚洲欧美日韩中文播放 | 国产亚洲一本大道中文在线| 精品久久久久久久久久久院品网| 欧美午夜一区二区| 日韩av在线发布| 精东粉嫩av免费一区二区三区| 国产福利不卡视频| 91在线你懂得| 欧美日韩国产美女| 久久久久九九视频| 亚洲精品综合在线| 免费成人性网站| 成人av资源站| 日韩欧美一卡二卡| 最新久久zyz资源站| 日韩成人一区二区三区在线观看| 国产一区二区免费视频| 91网站在线观看视频| 日韩欧美电影一二三| 亚洲国产高清aⅴ视频| 午夜视黄欧洲亚洲| 一区二区三区高清| 亚洲青青青在线视频| 免费欧美日韩国产三级电影| 国产精品12区| 欧美亚洲一区二区在线| 日韩欧美亚洲国产另类| 欧美日韩久久不卡| 精品不卡在线视频| 亚洲图片欧美综合| 极品销魂美女一区二区三区| 色婷婷精品大在线视频| 亚洲精品日韩一| 亚洲欧洲www| 伦理电影国产精品| 欧美日韩一区久久| 日韩理论片在线| 国产成人一级电影| 欧美成人精品高清在线播放| 成人中文字幕合集| 欧美日韩1区2区| 午夜精品久久久久久久久| 91在线视频观看| 国产亚洲视频系列| 本田岬高潮一区二区三区| 欧美xxx久久| 久久99精品国产麻豆不卡| 欧美一区二区精品久久911| 亚洲成人动漫在线观看| 91免费观看视频在线| 亚洲精品中文字幕在线观看| 丁香婷婷综合色啪| 国产精品超碰97尤物18| 一本色道亚洲精品aⅴ| 中文字幕日韩欧美一区二区三区| 成人丝袜18视频在线观看| 亚洲国产乱码最新视频| 欧美色综合久久| 一区二区三区 在线观看视频| 激情成人综合网| 亚洲精品在线免费播放| 国产精品一区三区| 国产精品夜夜嗨| 91热门视频在线观看| 91福利在线观看| 欧美成人一区二区三区在线观看| 午夜在线电影亚洲一区| 欧美午夜精品久久久| 亚洲福利一区二区三区| 欧美日韩精品欧美日韩精品| 亚洲图片自拍偷拍| 3d动漫精品啪啪| 午夜成人在线视频| 欧美肥妇free| 久久99精品久久只有精品| 337p日本欧洲亚洲大胆精品 | 欧美日韩aaaaa| 免费亚洲电影在线| 欧美变态tickling挠脚心| 经典三级视频一区| 国产日韩欧美高清| 欧美天天综合网| 亚洲国产一区二区a毛片| 欧美日产国产精品| 激情综合色综合久久综合| 久久美女艺术照精彩视频福利播放 | 国产成人aaaa| 国产精品你懂的在线| 国产精品夜夜爽| 国产精品午夜在线| 91视频精品在这里| 午夜电影久久久| 久久一二三国产| av男人天堂一区| 亚洲自拍偷拍av| 日韩三级精品电影久久久| 国产一区二区三区在线观看精品 | 亚洲一卡二卡三卡四卡五卡| 7777精品伊人久久久大香线蕉| 麻豆91在线播放免费| 国产日韩欧美精品一区| 欧美自拍偷拍一区| 美女免费视频一区| 国产精品久久久久三级| 欧美福利视频导航| 成人黄色在线网站| 午夜欧美在线一二页| 精品日韩在线一区| 91网站最新地址| 久草在线在线精品观看| 亚洲人成小说网站色在线| 正在播放亚洲一区| 99视频超级精品| 美国av一区二区| 一区二区三区电影在线播| 久久中文娱乐网| 欧美日韩国产欧美日美国产精品| 国产美女精品一区二区三区| 夜夜揉揉日日人人青青一国产精品| 日韩视频一区二区三区在线播放| 91丨porny丨在线| 国产麻豆精品久久一二三| 亚洲午夜精品在线| 欧美激情一区在线观看| 日韩亚洲欧美一区二区三区| 99久久久精品| 国产在线观看免费一区| 亚洲成人免费看| 亚洲男人的天堂一区二区| 久久久久久亚洲综合| 欧美片网站yy| 欧洲中文字幕精品| 99久久婷婷国产精品综合|