📄 aviomgr.cpp
字号:
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 + -