⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aviomgr.cpp

📁 一个实时音频或视频通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if(!capSetUserData(hCap,(DWORD)this))
		goto RET;
	if(!capCaptureSequenceNoFile(hCap))
		goto RET;
	
	bRet=TRUE;
RET:
	if(!bRet)
	{
		PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_ERR,IOME_VIDEO_IN),(LPARAM)this);
		m_ViCap.Destroy();
	}
	return bRet;
}

BOOL CAVIOMgr::DestroyCap()
{
	pMgr=0;
	m_ViCap.Destroy();
	return TRUE;
}

void CAVIOMgr::Destroy()
{
	if(m_iStatus==STA_TALK)
		EndTalk();
	if(m_timerWait)
		KillTimer(0,m_timerWait);
	m_timerWait=0;
	DestroySocket();
	DestroyAudioRec();
	DestroyCap();
	DestroyAudioPlay();
	DestroyAudioCodec();
	DestroyVideoCodec();
}
//
BOOL CAVIOMgr::InitAudioCodec()
{
	BOOL bRet=FALSE;
	
	if(!m_CodecMgr.InitCodecA())
		goto RET;
	m_ppaL=new PACK_AUDIO;
	if(!m_ppaL)
		goto RET;
	
	
	m_paR=new char[SIZE_AUDIO_FRAME];
	if(!m_paR)
		goto RET;
	bRet=TRUE;
RET:
	if(!bRet)
	{
		PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_ERR,IOME_AUDIO_CODEC),(LPARAM)this);
		DestroyAudioCodec();
	}
	return bRet;
}
//
void CAVIOMgr::DestroyAudioCodec()
{	
	
	if(m_ppaL)
	{
		delete m_ppaL;
		m_ppaL=0;
	}
	
	
	if(m_paR)
	{
		delete []m_paR;
		m_paR=0;
	}
	m_CodecMgr.DestroyCodecA();
}
//初始化视频编码解码器
BOOL CAVIOMgr::InitVideoCodec()
{
	BOOL bRet=FALSE;
	
	if(!m_CodecMgr.InitCodecV())
		goto RET;
	m_pvR=new char[m_CodecMgr.m_BmpU.bmiHeader.biSizeImage];
	if(!m_pvR)
		goto RET;
	
	m_ppvL=(PACK_VIDEO*)new char[MAX_UDP_SIZE];
	if(!m_ppvL)
		goto RET;
	m_ppvL->flag=FLAG_VIDEO;
		
	bRet=TRUE;
RET:
	if(!bRet)
	{
		PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_ERR,IOME_VIDEO_CODEC),(LPARAM)this);
		DestroyVideoCodec();
	}
	return bRet;
}

void CAVIOMgr::DestroyVideoCodec()
{
	
	if(m_pvR)
	{
		delete []m_pvR;
		m_pvR=0;
	}
	
	if(m_ppvL)
	{
		delete []m_ppvL;
		m_ppvL=0;
	}
		
	m_CodecMgr.DestroyCodecV();
}



void CAVIOMgr::GetDeviceSupport(DEVICE_SUPPORT &ds)
{

}
//呼叫某个IP
BOOL CAVIOMgr::Call(char *ip, unsigned short port)
{
	BOOL bRet=FALSE;
	if(m_iStatus!=STA_FREE)
		goto RET;
	SetDst(ip,port);
	PACK_CMD pc;
	pc.flag=FLAG_CMD;
	pc.cmd=CMD_CALL;
	pc.data_size_extra=0;
	if(m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_dst)<=0)
		goto RET;
	m_iStatus=STA_WAIT;
	bRet=TRUE;
	m_uDataSend=0;
	m_uDataRcv=0;
	if(m_timerWait)
		KillTimer(0,m_timerWait);
	m_timerWait=SetTimer(0,0,2000,(TIMERPROC)WaitTimerProc);
	

RET:
	return bRet;
}
//结束通话
BOOL CAVIOMgr::EndTalk()
{
	BOOL bRet=FALSE;
	if(m_iStatus==STA_FREE)
		goto RET;
	if(m_iStatus==STA_TALK)
	{
		m_iStatus=STA_FREE;
		PACK_CMD pc;
		pc.flag=FLAG_CMD;
		pc.cmd=CMD_END;
		pc.data_size_extra=0;
		if(m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_dst)<=0)
			goto RET;
		DestroyVideoCodec();
		DestroyAudioCodec();
		DestroyAudioPlay();
		DestroyAudioRec();
		DestroyCap();
		
		
	}
	if(m_iStatus==STA_WAIT_USER)
	{

	}
	if(m_iStatus==STA_WAIT)
	{
		m_iStatus=STA_FREE;
		KillTimer(0,m_timerWait);
	}
	bRet=TRUE;
RET:
	return bRet;
}
//接受请求
BOOL CAVIOMgr::Accept()
{
	BOOL bRet=FALSE;
	if(m_iStatus!=STA_WAIT_USER)
		goto RET;
	PACK_CMD pc;
	pc.flag=FLAG_CMD;
	pc.cmd=CMD_ACCEPT;
	pc.data_size_extra=0;
	if(m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_dst)<=0)
		goto RET;
	ZeroMemory(&m_ds,sizeof(m_ds));
	m_ds.bVideoOut=true;//always ok
	if(InitVideoCodec())//why this must ahead InitAudioCodec??i don't know why
		m_ds.bVideoCodec=true;
	if(InitAudioCodec())
		m_ds.bAudioCodec=true;
	if(InitAudioPlay())
		m_ds.bAudioOut=true;
	if(InitAudioRec())
		m_ds.bAudioIn=true;
	
	if(m_ds.bVideoCodec&&InitCap())
		m_ds.bVideoIn=true;

	if(!m_ds.bAudioCodec&&!m_ds.bVideoCodec)
	{
		DestroyVideoCodec();
		DestroyAudioCodec();
		DestroyAudioPlay();
		DestroyAudioRec();
		DestroyCap();
		goto RET;
	}
	m_iStatus=STA_TALK;
	bRet=TRUE;
RET:
	return bRet;

}
//解释发送来的命令
void CAVIOMgr::OnCommand(PACK_CMD *ppc, int len)
{
	switch(ppc->cmd)
	{
	case CMD_CALL:
		if(m_iStatus==STA_FREE)
		{
			m_dst=m_sockaddr;
			
			PACK_CMD pc;
			pc.flag=FLAG_CMD;
			pc.data_size_extra=0;
			pc.cmd=CMD_KEEP;
			m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_sockaddr);
			m_iStatus=STA_WAIT_USER;
			PostMessage(m_hwndMainWnd,IOM_NOTIFY,IOMN_CALL,(LPARAM)this);
		}
		else
		{
			PACK_CMD pc;
			pc.flag=FLAG_CMD;
			pc.cmd=CMD_REFUSE;
			pc.data_size_extra=0;
			pc.ex=R_BUSY;
			m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_sockaddr);
		}break;
	case CMD_END:
		{
			if(m_iStatus==STA_TALK)
				PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_END,E_USER),(LPARAM)this);
		}
		break;
	case CMD_REFUSE:
		{
			if(m_iStatus==STA_WAIT)
			{
				m_iStatus=STA_FREE;
				PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_REFUSE,ppc->ex),(LPARAM)this);
			}
		}
		break;
	case CMD_ACCEPT:
		{
			PostMessage(m_hwndMainWnd,IOM_NOTIFY,IOMN_ACCEPT,(LPARAM)this);
			
		}
		break;
	case CMD_KEEP:
		{
			KillTimer(0,m_timerWait);
			m_timerWait=0;
		}break;
	case CMD_VIDEO:
		{
			PostMessage(m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_VIDEO,ppc->ex),(LPARAM)this);
		}break;

	}
}
//拒绝请求
BOOL CAVIOMgr::Refuse()
{
	BOOL bRet=FALSE;
	if(m_iStatus!=STA_WAIT_USER)
		goto RET;
	PACK_CMD pc;
	pc.flag=FLAG_CMD;
	pc.cmd=CMD_REFUSE;
	pc.ex=R_USER;
	pc.data_size_extra=0;
	if(m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_dst)<=0)
		goto RET;
	m_iStatus=STA_FREE;
	bRet=TRUE;
RET:
	return bRet;
}
///////////////////////////////////
//以下是设置对外消息接口
//设置主窗口
void CAVIOMgr::SetMainWnd(HWND hwnd)
{
	m_hwndMainWnd=hwnd;
}

void CAVIOMgr::SetLocalVideoRcvWnd(HWND hwnd)
{
	m_hwndLocalVideoRcv=hwnd;
}

void CAVIOMgr::SetLocalAudioRcvWnd(HWND hwnd)
{
	m_hwndLocalAudioRcv=hwnd;
}

void CAVIOMgr::SetRemoteVideoRcvWnd(HWND hwnd)
{
	m_hwndRemoteVideoRcv=hwnd;
}

void CAVIOMgr::SetRemoteAudioRcvWnd(HWND hwnd)
{
	m_hwndRemoteAudioRcv=hwnd;
}

//////////////////////
//得到当前状态
int CAVIOMgr::GetStatus()
{
	return m_iStatus;
}
//等待定时器,如果发出请求命令超过一定时间没有得到回应,就会触发
void CALLBACK CAVIOMgr::WaitTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
	if(pMgr)
	{
		if(pMgr->m_hwndMainWnd)
			PostMessage(pMgr->m_hwndMainWnd,IOM_NOTIFY,MAKEWPARAM(IOMN_REFUSE,R_TIMEOUT),(LPARAM)pMgr);
		KillTimer(0,pMgr->m_timerWait);
		pMgr->m_iStatus=STA_FREE;
	}
	
}
//调用以下函数要谨慎
//只有在收到相应消息时才能调用
/////////////////////////
///
char* CAVIOMgr::GetLocalVideo(UINT &len)
{
	len=m_CodecMgr.m_BmpU.bmiHeader.biSizeImage;
	return m_pvL;
}

char* CAVIOMgr::GetLocalAudio(UINT &len)
{
	len=SIZE_AUDIO_FRAME;
	return m_paL;
}

char* CAVIOMgr::GetRemoteVideo(UINT &len)
{
	len=m_CodecMgr.m_BmpU.bmiHeader.biSizeImage;
	return m_pvR;
}

char* CAVIOMgr::GetRemoteAudio(UINT &len)
{
	len=SIZE_AUDIO_FRAME;
	return m_paR;
}
//////////////////////////////////
BITMAPINFO* CAVIOMgr::GetBitampInfo()
{
	return &m_CodecMgr.m_BmpU;
}
//得到数据发送量
UINT CAVIOMgr::GetDataSend()
{
	return m_uDataSend;
}
//得到数据接收量
UINT CAVIOMgr::GetDataRcv()
{
	return m_uDataRcv;
}

//设置是否传输视频
void CAVIOMgr::VideoSend(BOOL b)
{
	m_bVideoSend=b;
	if(m_iStatus==STA_TALK&&m_ds.bVideoIn)
	{
		PACK_CMD pc;
		pc.flag=FLAG_VIDEO;
		pc.data_size_extra=0;
		pc.cmd=CMD_VIDEO;
		pc.ex=b&0xff;
		m_Socket.SendTo((char*)&pc,sizeof(pc),(sockaddr*)&m_dst);
	
	}
}
//得到对方地址
sockaddr_in CAVIOMgr::GetRemoteAddr()
{
	return m_dst;
}
//设置视频质量
void CAVIOMgr::SetVideoQuality(UINT q)
{
	m_CodecMgr.m_cv.lQ=q*100;
}
//预览
BOOL CAVIOMgr::EnablePreview(BOOL b)
{
	if(m_iStatus==STA_FREE&&b)
	{
		return InitCap();			
	}
	else
	if(m_iStatus==STA_FREE&&!b)
	{
		DestroyCap();
		
	}
	return TRUE;
}
//当对方接收请求后,会受到Accept的消息,这时必须调用此函数,来打开各种设备
void CAVIOMgr::OnAccept()
{
	if(m_iStatus!=STA_WAIT) return;
	ZeroMemory(&m_ds,sizeof(m_ds));
	m_ds.bVideoOut=true;//always ok

	if(InitVideoCodec())
		m_ds.bVideoCodec=true;
	if(InitAudioCodec())
		m_ds.bAudioCodec=true;
	if(InitAudioPlay())
		m_ds.bAudioOut=true;
	if(InitAudioRec())
		m_ds.bAudioIn=true;
	
	if(m_ds.bVideoCodec&&InitCap())
		m_ds.bVideoIn=true;
	
	if(!m_ds.bAudioCodec&&!m_ds.bVideoCodec)
	{
		DestroyCap();
		DestroyAudioRec();
		DestroyAudioPlay();
		DestroyAudioCodec();
		DestroyVideoCodec();
		
		return;
	}
	m_iStatus=STA_TALK;
}
//得到帧数
UINT CAVIOMgr::GetFrameCount()
{
	return m_nFrameCount;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -