`
xujinquan19
  • 浏览: 149997 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
视频技术开发 视频通讯 聊天 音视频系统平台开发
/**
 *	视频数据回调函数
 */
void CALLBACK VideoData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
		pDemoDlg->DrawUserVideo(dwUserid,lpBuf,dwLen,bmiHeader);
}
/**
 *	音频数据回调函数
 */
void CALLBACK AudioData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, WAVEFORMATEX waveFormatEx, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		// do something ...
	}
}

/**
 *	音量更改回调函数
 */
void CALLBACK VolumeChange_CallBack(BRAC_AudioDevice device, DWORD dwCurrentVolume, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		if(device == BRAC_AD_WAVEIN)
			pDemoDlg->OnWaveInVolumeChange(dwCurrentVolume);
		else
			pDemoDlg->OnWaveOutVolumeChange(dwCurrentVolume);
	}
}
// 透明通道数据回调函数定义
void CALLBACK TransBuffer_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		CString strNotify;
		strNotify.Format("TransBuffer_CallBack:dwUserid-%d, bufSize-%d",dwUserid,dwLen);
		pDemoDlg->AppendLogString(strNotify);
	}
}

// 透明通道数据扩展回调函数定义
void CALLBACK TransBufferEx_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		BOOL bSuccess = FALSE;
		if(dwLen > 1000)
		{
			bSuccess = lpBuf[1000] == 'Y' ? TRUE : FALSE;
		}
		CString strNotify;
		strNotify.Format("TransBufferEx_CallBack:dwUserid-%d, bufSize-%d,verify:%s",dwUserid,dwLen,bSuccess ? "Success" : "Fail");
		pDemoDlg->AppendLogString(strNotify);
	}	
}
// 文件传输回调函数定义
void CALLBACK TransFile_CallBack(DWORD dwUserid, LPCTSTR lpFileName, LPCTSTR lpTempFilePath, DWORD dwFileLength, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		CString strNotify;
		strNotify.Format("TransFile_CallBack:dwUserid-%d, lpFileName-%s, lpTempFilePath-%s",dwUserid,lpFileName,lpTempFilePath);
		pDemoDlg->AppendLogString(strNotify);
	}
}

// 录像、快照任务完成回调函数定义
void CALLBACK RecordSnapShot_CallBack(DWORD dwUserid, LPCTSTR lpFileName, DWORD dwParam, BOOL bRecordType, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		CString strNotify;
		strNotify.Format("%s CallBack:dwUserid-%d, FilePathName-%s",bRecordType?"Record":"SnapShot",(int)dwUserid,lpFileName);
		pDemoDlg->AppendLogString(strNotify);
	}
}

// SDK Filter 通信数据回调函数定义
void CALLBACK SDKFilterData_CallBack(LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
{
	CBRAnyChatSDKDemoDlg*	pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
	if(pDemoDlg)
	{
		CString strNotify;
		strNotify.Format("SDK Filter CallBack:%s",lpBuf);
		pDemoDlg->AppendLogString(strNotify);
	}
}

/**
 *	绘制用户视频
 *	数据来源于回调函数
 *	@param dwUserid 用户ID号
 *	@param lpBuf 视频数据缓冲区
 *	@param dwLen 缓冲区大小
 *	@param bmiHeader 视频缓冲区的头信息,包含了视频的大小、颜色位数等信息
 */
void CBRAnyChatSDKDemoDlg::DrawUserVideo(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader)
{
	// 根据用户ID号找到合适的显示区域
	DWORD dwSite = -1;
	for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
	{
		if(m_iUserID[i] == (INT)dwUserid)
		{
			dwSite = i;
			break;
		}
	}
	if(dwSite == -1)
		return;

	CRect dispRect = m_UserRect[dwSite];

	//构建Bitmap  
	BITMAPINFOHEADER  *lpbmi = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+dwLen);  
	ZeroMemory(lpbmi,sizeof(BITMAPINFOHEADER)+dwLen);
    memcpy((LPBYTE)lpbmi,&bmiHeader,sizeof(bmiHeader));
	memcpy(((LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)),lpBuf,dwLen);  

	HDC hdc = ::GetDC(m_hWnd);
	HDC dcMem = ::CreateCompatibleDC(hdc);  
	HBITMAP hBitmap = CreateDIBitmap(hdc,lpbmi,CBM_INIT,(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER),(LPBITMAPINFO)lpbmi,DIB_RGB_COLORS);  
	//绘图  
	HBITMAP holdbm = (HBITMAP)SelectObject(dcMem,hBitmap);  
	::SetStretchBltMode(hdc,COLORONCOLOR);
	::StretchBlt(hdc,dispRect.left,dispRect.top,dispRect.Width(),dispRect.Height(),dcMem,0,0,bmiHeader.biWidth,bmiHeader.biHeight,SRCCOPY);

	SelectObject(dcMem,holdbm);  
	::DeleteDC(dcMem);
	::DeleteObject(hBitmap);
	::ReleaseDC(m_hWnd,hdc);
	free(lpbmi);
	lpbmi = NULL;
}

BOOL CBRAnyChatSDKDemoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// 初始化每个视频显示位置信息
	GetDlgItem(IDC_STATIC_USER0)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_USER0)->GetClientRect(m_UserRect[0]);	
	GetDlgItem(IDC_STATIC_USER0)->ClientToScreen(m_UserRect[0]);
	ScreenToClient(m_UserRect[0]);

	GetDlgItem(IDC_STATIC_USER1)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_USER1)->GetClientRect(m_UserRect[1]);	
	GetDlgItem(IDC_STATIC_USER1)->ClientToScreen(m_UserRect[1]);
	ScreenToClient(m_UserRect[1]);

	GetDlgItem(IDC_STATIC_USER2)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_USER2)->GetClientRect(m_UserRect[2]);	
	GetDlgItem(IDC_STATIC_USER2)->ClientToScreen(m_UserRect[2]);
	ScreenToClient(m_UserRect[2]);

	GetDlgItem(IDC_STATIC_USER3)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_USER3)->GetClientRect(m_UserRect[3]);	
	GetDlgItem(IDC_STATIC_USER3)->ClientToScreen(m_UserRect[3]);
	ScreenToClient(m_UserRect[3]);

	// 隐藏录像状态标志
	GetDlgItem(IDC_STATIC_RECORDSTATE0)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_RECORDSTATE1)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_RECORDSTATE2)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_RECORDSTATE3)->ShowWindow(SW_HIDE);
	
	for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
	{
		m_iUserID[i] = -1;
	}
	
	m_dwTransTaskId = -1;

	m_iPort = 8906;
	m_iRoomId = 1;
	SetDlgItemText(IDC_IPADDRESS_SERVER,"demo.anychat.cn");
	SetDlgItemText(IDC_EDIT_USERNAME,"AnyChat5");
	UpdateData(FALSE);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CBRAnyChatSDKDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
Global site tag (gtag.js) - Google Analytics