1. BRAnyChatSDKDemoDlg.cpp : implementation file
     
  2. //
     

  3.  
  4. #include "stdafx.h"
     
  5. #include <WINSOCK2.H>
     
  6. #include "BRAnyChatSDKDemo.h"
     
  7. #include "BRAnyChatSDKDemoDlg.h"
     

  8.  

  9.  
  10. #ifdef _DEBUG
     
  11. #define new DEBUG_NEW
     
  12. #undef THIS_FILE
     
  13. static char THIS_FILE[] = __FILE__;
     
  14. #endif
     

  15.  

  16.  
  17. #define REFRESH_TRANSTASK_STATUS_TIMER 1 ///< 刷新传输任务状态定时器
     
  18. #define REFRESH_SPEAKVOLUME_TIMER 2 ///< 更新用户说话音量定时器
     
  19. #define REFRESH_RECORDSTATE_TIMER 3 ///< 更新录像状态定时器
     

  20.  
  21. class CAboutDlg : public CDialog
     
  22. {
     
  23. public:
     
  24. CAboutDlg();
     

  25.  
  26. // Dialog Data
     
  27. //{{AFX_DATA(CAboutDlg)
     
  28. enum { IDD = IDD_ABOUTBOX };
     
  29. //}}AFX_DATA
     

  30.  
  31. // ClassWizard generated virtual function overrides
     
  32. //{{AFX_VIRTUAL(CAboutDlg)
     
  33. protected:
     
  34. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
     
  35. //}}AFX_VIRTUAL
     

  36.  
  37. // Implementation
     
  38. protected:
     
  39. //{{AFX_MSG(CAboutDlg)
     
  40. //}}AFX_MSG
     
  41. DECLARE_MESSAGE_MAP()
     
  42. };
     

  43.  
  44. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
     
  45. {
     
  46. //{{AFX_DATA_INIT(CAboutDlg)
     
  47. //}}AFX_DATA_INIT
     
  48. }
     

  49.  
  50. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
     
  51. {
     
  52. CDialog::DoDataExchange(pDX);
     
  53. //{{AFX_DATA_MAP(CAboutDlg)
     
  54. //}}AFX_DATA_MAP
     
  55. }
     

  56.  
  57. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
     
  58. //{{AFX_MSG_MAP(CAboutDlg)
     
  59. // No message handlers
     
  60. //}}AFX_MSG_MAP
     
  61. END_MESSAGE_MAP()
     

  62.  
  63. /////////////////////////////////////////////////////////////////////////////
     
  64. // CBRAnyChatSDKDemoDlg dialog
     

  65.  
  66. CBRAnyChatSDKDemoDlg::CBRAnyChatSDKDemoDlg(CWnd* pParent )
     
  67. : CDialog(CBRAnyChatSDKDemoDlg::IDD, pParent)
     
  68. {
     
  69. //{{AFX_DATA_INIT(CBRAnyChatSDKDemoDlg)
     
  70. m_bEnableAGC = TRUE;
     
  71. m_bEnableEcho = TRUE;
     
  72. m_bEnableNS = TRUE;
     
  73. m_bEnableVAD = TRUE;
     
  74. m_iPort = 8906;
     
  75. m_iRoomId = 1;
     
  76. //}}AFX_DATA_INIT
     
  77. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
     
  78. }
     

  79.  
  80. void CBRAnyChatSDKDemoDlg::DoDataExchange(CDataExchange* pDX)
     
  81. {
     
  82. CDialog::DoDataExchange(pDX);
     
  83. //{{AFX_DATA_MAP(CBRAnyChatSDKDemoDlg)
     
  84. DDX_Control(pDX, IDC_PROGRESS_SPEAKVOLUME0, m_ctrlSpeakVolume0);
     
  85. DDX_Control(pDX, IDC_PROGRESS_SPEAKVOLUME1, m_ctrlSpeakVolume1);
     
  86. DDX_Control(pDX, IDC_PROGRESS_SPEAKVOLUME2, m_ctrlSpeakVolume2);
     
  87. DDX_Control(pDX, IDC_PROGRESS_SPEAKVOLUME3, m_ctrlSpeakVolume3);
     
  88. DDX_Control(pDX, IDC_SLIDER_OUTVOLUME, m_ctrlOutVolume);
     
  89. DDX_Control(pDX, IDC_SLIDER_INVOLUME, m_ctrlInVolume);
     
  90. DDX_Control(pDX, IDC_COMBO_VCAPTURE, m_cbVideoCapture);
     
  91. DDX_Control(pDX, IDC_COMBO_ACAPTURE, m_cbAudioCapture);
     
  92. DDX_Control(pDX, IDC_EDIT_LOG, m_ctrlEditLog);
     
  93. DDX_Check(pDX, IDC_CHECK_AGC, m_bEnableAGC);
     
  94. DDX_Check(pDX, IDC_CHECK_ECHO, m_bEnableEcho);
     
  95. DDX_Check(pDX, IDC_CHECK_NS, m_bEnableNS);
     
  96. DDX_Check(pDX, IDC_CHECK_VAD, m_bEnableVAD);
     
  97. DDX_Text(pDX, IDC_EDIT_PORT, m_iPort);
     
  98. DDX_Text(pDX, IDC_EDIT_ROOMID, m_iRoomId);
     
  99. //}}AFX_DATA_MAP
     
  100. }
     

  101.  
  102. BEGIN_MESSAGE_MAP(CBRAnyChatSDKDemoDlg, CDialog)
     
  103. //{{AFX_MSG_MAP(CBRAnyChatSDKDemoDlg)
     
  104. ON_WM_SYSCOMMAND()
     
  105. ON_WM_PAINT()
     
  106. ON_WM_QUERYDRAGICON()
     
  107. ON_WM_DESTROY()
     
  108. ON_BN_CLICKED(IDC_BUTTON_INIT, OnButtonInit)
     
  109. ON_MESSAGE(WM_GV_CONNECT,OnGVClientConnect)
     
  110. ON_MESSAGE(WM_GV_LOGINSYSTEM,OnGVClientLogin)
     
  111. ON_MESSAGE(WM_GV_ENTERROOM,OnGVClientEnterRoom)
     
  112. ON_MESSAGE(WM_GV_ONLINEUSER,OnGVClientOnlineUser)
     
  113. ON_MESSAGE(WM_GV_USERATROOM,OnGVClientUserAtRoom)
     
  114. ON_MESSAGE(WM_GV_MICSTATECHANGE,OnGVClientMicStateChange)
     
  115. ON_MESSAGE(WM_GV_LINKCLOSE,OnGVClientLinkClose)
     
  116. ON_MESSAGE(WM_GV_CHATMODECHG,OnGVClientChatModeChange)
     
  117. ON_BN_CLICKED(IDC_BUTTON_ENTERROOM, OnButtonEnterRoom)
     
  118. ON_BN_CLICKED(IDC_BUTTON_LEAVEROOM, OnButtonLeaveRoom)
     
  119. ON_BN_CLICKED(IDC_BUTTON_VIDEOPROPERTY, OnButtonVideoproperty)
     
  120. ON_BN_CLICKED(IDC_BUTTON_REFRESHCAPTURE, OnButtonRefreshCapture)
     
  121. ON_CBN_SELCHANGE(IDC_COMBO_VCAPTURE, OnSelchangeComboVideoCapture)
     
  122. ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_OUTVOLUME, OnSliderOutVolumeChange)
     
  123. ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_INVOLUME, OnOnSliderInVolumeChange)
     
  124. ON_CBN_SELCHANGE(IDC_COMBO_ACAPTURE, OnSelChangeComboAudioCapture)
     
  125. ON_WM_TIMER()
     
  126. ON_BN_CLICKED(IDC_BUTTON_SENDFILE, OnButtonSendFile)
     
  127. ON_BN_CLICKED(IDC_CHECK_VAD, OnCheckVad)
     
  128. ON_BN_CLICKED(IDC_CHECK_AGC, OnCheckAgc)
     
  129. ON_BN_CLICKED(IDC_CHECK_ECHO, OnCheckEcho)
     
  130. ON_BN_CLICKED(IDC_CHECK_NS, OnCheckNs)
     
  131. ON_BN_CLICKED(IDC_BUTTON_TRANSBUF, OnButtonTransbuf)
     
  132. ON_BN_CLICKED(IDC_BUTTON_RELEASE, OnButtonRelease)
     
  133. ON_BN_CLICKED(IDC_BUTTON_VIDEOCTRL0, OnButtonVideoctrl0)
     
  134. ON_BN_CLICKED(IDC_BUTTON_VIDEOCTRL1, OnButtonVideoctrl1)
     
  135. ON_BN_CLICKED(IDC_BUTTON_VIDEOCTRL2, OnButtonVideoctrl2)
     
  136. ON_BN_CLICKED(IDC_BUTTON_VIDEOCTRL3, OnButtonVideoctrl3)
     
  137. ON_BN_CLICKED(IDC_BUTTON_AUDIOCTRL0, OnButtonAudioctrl0)
     
  138. ON_BN_CLICKED(IDC_BUTTON_AUDIOCTRL1, OnButtonAudioctrl1)
     
  139. ON_BN_CLICKED(IDC_BUTTON_AUDIOCTRL2, OnButtonAudioctrl2)
     
  140. ON_BN_CLICKED(IDC_BUTTON_AUDIOCTRL3, OnButtonAudioctrl3)
     
  141. ON_BN_CLICKED(IDC_BUTTON_RECORDCTRL0, OnButtonRecordctrl0)
     
  142. ON_BN_CLICKED(IDC_BUTTON_RECORDCTRL1, OnButtonRecordctrl1)
     
  143. ON_BN_CLICKED(IDC_BUTTON_RECORDCTRL2, OnButtonRecordctrl2)
     
  144. ON_BN_CLICKED(IDC_BUTTON_RECORDCTRL3, OnButtonRecordctrl3)
     
  145. ON_BN_CLICKED(IDC_BUTTON_SNAPSHOTCTRL0, OnButtonSnapshotctrl0)
     
  146. ON_BN_CLICKED(IDC_BUTTON_SNAPSHOTCTRL1, OnButtonSnapshotctrl1)
     
  147. ON_BN_CLICKED(IDC_BUTTON_SNAPSHOTCTRL2, OnButtonSnapshotctrl2)
     
  148. ON_BN_CLICKED(IDC_BUTTON_SNAPSHOTCTRL3, OnButtonSnapshotctrl3)
     
  149. ON_BN_CLICKED(IDC_BUTTON_LOGIN, OnButtonLogin)
     
  150. ON_BN_CLICKED(IDC_BUTTON_LOGOUT, OnButtonLogout)
     
  151. //}}AFX_MSG_MAP
     
  152. END_MESSAGE_MAP()
     

  153.  

  154.  
  155. void CALLBACK VideoData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader, LPVOID lpUserValue)
     
  156. {
     
  157. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  158. if(pDemoDlg)
     
  159. pDemoDlg->DrawUserVideo(dwUserid,lpBuf,dwLen,bmiHeader);
     
  160. }
     

  161.  
  162. void CALLBACK AudioData_CallBack(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, WAVEFORMATEX waveFormatEx, LPVOID lpUserValue)
     
  163. {
     
  164. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  165. if(pDemoDlg)
     
  166. {
     
  167. // do something ...
     
  168. }
     
  169. }
     

  170.  

  171.  
  172. void CALLBACK VolumeChange_CallBack(BRAC_AudioDevice device, DWORD dwCurrentVolume, LPVOID lpUserValue)
     
  173. {
     
  174. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  175. if(pDemoDlg)
     
  176. {
     
  177. if(device == BRAC_AD_WAVEIN)
     
  178. pDemoDlg->OnWaveInVolumeChange(dwCurrentVolume);
     
  179. else
     
  180. pDemoDlg->OnWaveOutVolumeChange(dwCurrentVolume);
     
  181. }
     
  182. }
     
  183. // 透明通道数据回调函数定义
     
  184. void CALLBACK TransBuffer_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
     
  185. {
     
  186. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  187. if(pDemoDlg)
     
  188. {
     
  189. CString strNotify;
     
  190. strNotify.Format("TransBuffer_CallBack:dwUserid-%d, bufSize-%d",dwUserid,dwLen);
     
  191. pDemoDlg->AppendLogString(strNotify);
     
  192. }
     
  193. }
     

  194.  
  195. // 透明通道数据扩展回调函数定义
     
  196. void CALLBACK TransBufferEx_CallBack(DWORD dwUserid, LPBYTE lpBuf, DWORD dwLen, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
     
  197. {
     
  198. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  199. if(pDemoDlg)
     
  200. {
     
  201. BOOL bSuccess = FALSE;
     
  202. if(dwLen > 1000)
     
  203. {
     
  204. bSuccess = lpBuf[1000] == 'Y' ? TRUE : FALSE;
     
  205. }
     
  206. CString strNotify;
     
  207. strNotify.Format("TransBufferEx_CallBack:dwUserid-%d, bufSize-%d,verify:%s",dwUserid,dwLen,bSuccess ? "Success" : "Fail");
     
  208. pDemoDlg->AppendLogString(strNotify);
     
  209. }
     
  210. }
     
  211. // 文件传输回调函数定义
     
  212. void CALLBACK TransFile_CallBack(DWORD dwUserid, LPCTSTR lpFileName, LPCTSTR lpTempFilePath, DWORD dwFileLength, DWORD wParam, DWORD lParam, DWORD dwTaskId, LPVOID lpUserValue)
     
  213. {
     
  214. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  215. if(pDemoDlg)
     
  216. {
     
  217. CString strNotify;
     
  218. strNotify.Format("TransFile_CallBack:dwUserid-%d, lpFileName-%s, lpTempFilePath-%s",dwUserid,lpFileName,lpTempFilePath);
     
  219. pDemoDlg->AppendLogString(strNotify);
     
  220. }
     
  221. }
     

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

  234.  
  235. // SDK Filter 通信数据回调函数定义
     
  236. void CALLBACK SDKFilterData_CallBack(LPBYTE lpBuf, DWORD dwLen, LPVOID lpUserValue)
     
  237. {
     
  238. CBRAnyChatSDKDemoDlg* pDemoDlg = (CBRAnyChatSDKDemoDlg*)lpUserValue;
     
  239. if(pDemoDlg)
     
  240. {
     
  241. CString strNotify;
     
  242. strNotify.Format("SDK Filter CallBack:%s",lpBuf);
     
  243. pDemoDlg->AppendLogString(strNotify);
     
  244. }
     
  245. }
     

  246.  

  247.  
  248. void CBRAnyChatSDKDemoDlg::DrawUserVideo(DWORD dwUserid, LPVOID lpBuf, DWORD dwLen, BITMAPINFOHEADER bmiHeader)
     
  249. {
     
  250. // 根据用户ID号找到合适的显示区域
     
  251. DWORD dwSite = -1;
     
  252. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
     
  253. {
     
  254. if(m_iUserID[i] == (INT)dwUserid)
     
  255. {
     
  256. dwSite = i;
     
  257. break;
     
  258. }
     
  259. }
     
  260. if(dwSite == -1)
     
  261. return;
     

  262.  
  263. CRect dispRect = m_UserRect[dwSite];
     

  264.  
  265. //构建Bitmap
     
  266. BITMAPINFOHEADER *lpbmi = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)+dwLen);
     
  267. ZeroMemory(lpbmi,sizeof(BITMAPINFOHEADER)+dwLen);
     
  268. memcpy((LPBYTE)lpbmi,&bmiHeader,sizeof(bmiHeader));
     
  269. memcpy(((LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)),lpBuf,dwLen);
     

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

  278.  
  279. SelectObject(dcMem,holdbm);
     
  280. ::DeleteDC(dcMem);
     
  281. ::DeleteObject(hBitmap);
     
  282. ::ReleaseDC(m_hWnd,hdc);
     
  283. free(lpbmi);
     
  284. lpbmi = NULL;
     
  285. }
     

  286.  
  287. BOOL CBRAnyChatSDKDemoDlg::OnInitDialog()
     
  288. {
     
  289. CDialog::OnInitDialog();
     

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

  294.  
  295. CMenu* pSysMenu = GetSystemMenu(FALSE);
     
  296. if (pSysMenu != NULL)
     
  297. {
     
  298. CString strAboutMenu;
     
  299. strAboutMenu.LoadString(IDS_ABOUTBOX);
     
  300. if (!strAboutMenu.IsEmpty())
     
  301. {
     
  302. pSysMenu->AppendMenu(MF_SEPARATOR);
     
  303. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
     
  304. }
     
  305. }
     

  306.  
  307. SetIcon(m_hIcon, TRUE); // Set big icon
     
  308. SetIcon(m_hIcon, FALSE); // Set small icon
     

  309.  
  310. // 初始化每个视频显示位置信息
     
  311. GetDlgItem(IDC_STATIC_USER0)->ShowWindow(SW_HIDE);
     
  312. GetDlgItem(IDC_STATIC_USER0)->GetClientRect(m_UserRect[0]);
     
  313. GetDlgItem(IDC_STATIC_USER0)->ClientToScreen(m_UserRect[0]);
     
  314. ScreenToClient(m_UserRect[0]);
     

  315.  
  316. GetDlgItem(IDC_STATIC_USER1)->ShowWindow(SW_HIDE);
     
  317. GetDlgItem(IDC_STATIC_USER1)->GetClientRect(m_UserRect[1]);
     
  318. GetDlgItem(IDC_STATIC_USER1)->ClientToScreen(m_UserRect[1]);
     
  319. ScreenToClient(m_UserRect[1]);
     

  320.  
  321. GetDlgItem(IDC_STATIC_USER2)->ShowWindow(SW_HIDE);
     
  322. GetDlgItem(IDC_STATIC_USER2)->GetClientRect(m_UserRect[2]);
     
  323. GetDlgItem(IDC_STATIC_USER2)->ClientToScreen(m_UserRect[2]);
     
  324. ScreenToClient(m_UserRect[2]);
     

  325.  
  326. GetDlgItem(IDC_STATIC_USER3)->ShowWindow(SW_HIDE);
     
  327. GetDlgItem(IDC_STATIC_USER3)->GetClientRect(m_UserRect[3]);
     
  328. GetDlgItem(IDC_STATIC_USER3)->ClientToScreen(m_UserRect[3]);
     
  329. ScreenToClient(m_UserRect[3]);
     

  330.  
  331. // 隐藏录像状态标志
     
  332. GetDlgItem(IDC_STATIC_RECORDSTATE0)->ShowWindow(SW_HIDE);
     
  333. GetDlgItem(IDC_STATIC_RECORDSTATE1)->ShowWindow(SW_HIDE);
     
  334. GetDlgItem(IDC_STATIC_RECORDSTATE2)->ShowWindow(SW_HIDE);
     
  335. GetDlgItem(IDC_STATIC_RECORDSTATE3)->ShowWindow(SW_HIDE);
     

  336.  
  337. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
     
  338. {
     
  339. m_iUserID[i] = -1;
     
  340. }
     

  341.  
  342. m_dwTransTaskId = -1;
     

  343.  
  344. m_iPort = 8906;
     
  345. m_iRoomId = 1;
     
  346. SetDlgItemText(IDC_IPADDRESS_SERVER,"211.155.25.90");
     
  347. SetDlgItemText(IDC_EDIT_USERNAME,"AnyChat3");
     
  348. UpdateData(FALSE);
     
  349. return TRUE; // return TRUE unless you set the focus to a control
     
  350. }
     

  351.  
  352. void CBRAnyChatSDKDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
     
  353. {
     
  354. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
     
  355. {
     
  356. CAboutDlg dlgAbout;
     
  357. dlgAbout.DoModal();
     
  358. }
     
  359. else
     
  360. {
     
  361. CDialog::OnSysCommand(nID, lParam);
     
  362. }
     
  363. }
     

  364.  
  365. // If you add a minimize button to your dialog, you will need the code below
     
  366. // to draw the icon. For MFC applications using the document/view model,
     
  367. // this is automatically done for you by the framework.
     

  368.  
  369. void CBRAnyChatSDKDemoDlg::OnPaint()
     
  370. {
     
  371. if (IsIconic())
     
  372. {
     
  373. CPaintDC dc(this); // device context for painting
     

  374.  
  375. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
     

  376.  
  377. // Center icon in client rectangle
     
  378. int cxIcon = GetSystemMetrics(SM_CXICON);
     
  379. int cyIcon = GetSystemMetrics(SM_CYICON);
     
  380. CRect rect;
     
  381. GetClientRect(&rect);
     
  382. int x = (rect.Width() - cxIcon + 1) / 2;
     
  383. int y = (rect.Height() - cyIcon + 1) / 2;
     

  384.  
  385. // Draw the icon
     
  386. dc.DrawIcon(x, y, m_hIcon);
     
  387. }
     
  388. else
     
  389. {
     
  390. CDialog::OnPaint();
     
  391. }
     
  392. }
     

  393.  
  394. HCURSOR CBRAnyChatSDKDemoDlg::OnQueryDragIcon()
     
  395. {
     
  396. return (HCURSOR) m_hIcon;
     
  397. }
     

  398.  
  399. void CBRAnyChatSDKDemoDlg::OnDestroy()
     
  400. {
     
  401. BRAC_Release();
     
  402. CDialog::OnDestroy();
     
  403. }
     

  404.  
  405. void CBRAnyChatSDKDemoDlg::OnButtonInit()
     
  406. {
     
  407. // 获取SDK的版本信息
     
  408. DWORD dwMainVer,dwSubVer;
     
  409. CHAR szCompileTime[100] = {0};
     
  410. BRAC_GetSDKVersion(dwMainVer,dwSubVer,szCompileTime,sizeof(szCompileTime));
     

  411.  
  412. CString logstr;
     
  413. logstr.Format("AnyChat Core SDK Version:%d.%d(%s)",dwMainVer,dwSubVer,szCompileTime);
     
  414. AppendLogString(logstr);
     

  415.  
  416. // 打开(关闭)SDK的日志记录功能
     
  417. BRAC_ActiveCallLog(TRUE);
     

  418.  
  419. // 设置SDK核心组件所在目录(注:demo程序只是设置为当前目录,项目中需要设置为实际路径)
     
  420. CHAR szCoreSDKPath[MAX_PATH] = {0};
     
  421. GetModuleFileName(NULL,szCoreSDKPath,sizeof(szCoreSDKPath));
     
  422. (strrchr(szCoreSDKPath,'\\'))[1] = 0;
     
  423. BRAC_SetSDKOption(BRAC_SO_CORESDK_PATH,szCoreSDKPath,strlen(szCoreSDKPath));
     

  424.  
  425. // 根据BRAC_InitSDK的第二个参数:dwFuncMode,来告诉SDK该如何处理相关的任务(详情请参考开发文档)
     
  426. DWORD dwFuncMode = BRAC_FUNC_VIDEO_AUTODISP | BRAC_FUNC_AUDIO_AUTOPLAY | BRAC_FUNC_CHKDEPENDMODULE |
     
  427. BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_NET_SUPPORTUPNP | BRAC_FUNC_FIREWALL_OPEN |
     
  428. BRAC_FUNC_AUDIO_AUTOVOLUME| BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_CONFIG_LOCALINI;
     
  429. BRAC_InitSDK(this->GetSafeHwnd(),dwFuncMode);
     
  430. BRAC_SetVideoDataCallBack(BRAC_PIX_FMT_RGB24,VideoData_CallBack,this);
     
  431. BRAC_SetAudioDataCallBack(AudioData_CallBack,this);
     
  432. BRAC_SetVolumeChangeCallBack(VolumeChange_CallBack,this);
     
  433. BRAC_SetTransBufferExCallBack(TransBufferEx_CallBack,this);
     
  434. BRAC_SetTransBufferCallBack(TransBuffer_CallBack,this);
     
  435. BRAC_SetTransFileCallBack(TransFile_CallBack,this);
     
  436. BRAC_SetRecordSnapShotCallBack(RecordSnapShot_CallBack,this);
     
  437. BRAC_SetSDKFilterDataCallBack(SDKFilterData_CallBack,this);
     
  438. // BRAC_SelectVideoCapture("USB 视频设备"); // 设置指定的视频设备,则在后面打开时,就可以打开该设备,如果不调用该方法,则会打开默认的视频设备
     

  439.  
  440. UpdateData(TRUE);
     
  441. BRAC_SetSDKOption(BRAC_SO_AUDIO_AGCCTRL,(PCHAR)&m_bEnableAGC,sizeof(m_bEnableAGC));
     
  442. BRAC_SetSDKOption(BRAC_SO_AUDIO_VADCTRL,(PCHAR)&m_bEnableVAD,sizeof(m_bEnableVAD));
     
  443. BRAC_SetSDKOption(BRAC_SO_AUDIO_NSCTRL,(PCHAR)&m_bEnableNS,sizeof(m_bEnableNS));
     
  444. BRAC_SetSDKOption(BRAC_SO_AUDIO_ECHOCTRL,(PCHAR)&m_bEnableEcho,sizeof(m_bEnableEcho));
     

  445.  
  446. // 设置录像临时文件保存路径
     
  447. CHAR szRecordDirectory[MAX_PATH] = {0};
     
  448. ::GetModuleFileName(NULL,szRecordDirectory,MAX_PATH);
     
  449. (strrchr(szRecordDirectory,'\\'))[1] = 0;
     
  450. strcat(szRecordDirectory,"Record");
     
  451. BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR,szRecordDirectory,strlen(szRecordDirectory));
     
  452. // 设置录像文件质量参数
     
  453. DWORD dwVideoBitrate = 200 * 1000; // 200kbps
     
  454. BRAC_SetSDKOption(BRAC_SO_RECORD_VIDEOBR,(PCHAR)&dwVideoBitrate,sizeof(DWORD));
     
  455. DWORD dwAudioBitrate = 96 * 1000; // 96kbps
     
  456. BRAC_SetSDKOption(BRAC_SO_RECORD_AUDIOBR,(PCHAR)&dwAudioBitrate,sizeof(DWORD));
     

  457.  
  458. // 设置快照临时文件保存路径
     
  459. CHAR szSnapShotDirectory[MAX_PATH] = {0};
     
  460. ::GetModuleFileName(NULL,szSnapShotDirectory,MAX_PATH);
     
  461. (strrchr(szSnapShotDirectory,'\\'))[1] = 0;
     
  462. strcat(szSnapShotDirectory,"SnapShot");
     
  463. BRAC_SetSDKOption(BRAC_SO_SNAPSHOT_TMPDIR,szSnapShotDirectory,strlen(szSnapShotDirectory));
     

  464.  
  465. // 设置SDK临时文件路径
     
  466. CHAR szTempPath[MAX_PATH] = {0};
     
  467. ::GetModuleFileName(NULL,szTempPath,MAX_PATH);
     
  468. (strrchr(szTempPath,'\\'))[1] = 0;
     
  469. strcat(szTempPath,"Temp");
     
  470. BRAC_SetSDKOption(BRAC_SO_CORESDK_TMPDIR,szTempPath,strlen(szTempPath));
     

  471.  
  472. // 设置服务器认证密码
     
  473. BRAC_SetServerAuthPass("BaiRuiTech"); // 需要与服务器配置项“SDKAuthPass”相同(大小写敏感),SDK才能正常连接到服务器
     

  474.  
  475. DWORD dwVolume = 0;
     
  476. BRAC_AudioGetVolume(BRAC_AD_WAVEOUT,dwVolume);
     
  477. m_ctrlOutVolume.SetPos(dwVolume);
     

  478.  
  479. dwVolume = 0;
     
  480. BRAC_AudioGetVolume(BRAC_AD_WAVEIN,dwVolume);
     
  481. m_ctrlInVolume.SetPos(dwVolume);
     

  482.  
  483. SetTimer(REFRESH_SPEAKVOLUME_TIMER,100,NULL);
     
  484. SetTimer(REFRESH_RECORDSTATE_TIMER,1000,NULL);
     
  485. }
     

  486.  
  487. void CBRAnyChatSDKDemoDlg::OnButtonLogin()
     
  488. {
     
  489. UpdateData(TRUE);
     
  490. CString strServerIp,strUserName,strPassword;
     
  491. GetDlgItemText(IDC_IPADDRESS_SERVER,strServerIp);
     
  492. GetDlgItemText(IDC_EDIT_USERNAME,strUserName);
     
  493. GetDlgItemText(IDC_EDIT_LOGINPASS,strPassword);
     
  494. if(strServerIp.IsEmpty() || m_iPort <= 0)
     
  495. {
     
  496. AfxMessageBox("Invalid server ip address or port!");
     
  497. return;
     
  498. }
     
  499. if(strUserName.IsEmpty())
     
  500. {
     
  501. AfxMessageBox("Must input username for login system!");
     
  502. return;
     
  503. }
     

  504.  
  505. BRAC_Connect(strServerIp.GetBuffer(0),m_iPort);
     
  506. BRAC_Login(strUserName.GetBuffer(0),strPassword.GetBuffer(0),0);
     
  507. }
     

  508.  
  509. void CBRAnyChatSDKDemoDlg::OnButtonEnterRoom()
     
  510. {
     
  511. UpdateData(TRUE);
     
  512. BRAC_EnterRoom(m_iRoomId,"",0);
     
  513. }
     

  514.  
  515. void CBRAnyChatSDKDemoDlg::OnButtonLeaveRoom()
     
  516. {
     
  517. BRAC_LeaveRoom(1);
     

  518.  
  519. // 保留自己的userid,因为这儿只是leaveroom,并非logout
     
  520. for(INT i=1; i<DEMO_SHOW_USER_NUM; i++)
     
  521. {
     
  522. m_iUserID[i] = -1;
     
  523. }
     
  524. }
     

  525.  
  526. void CBRAnyChatSDKDemoDlg::OnButtonLogout()
     
  527. {
     
  528. BRAC_Logout();
     
  529. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
     
  530. {
     
  531. m_iUserID[i] = -1;
     
  532. }
     
  533. }
     

  534.  
  535. void CBRAnyChatSDKDemoDlg::OnButtonRelease()
     
  536. {
     
  537. BRAC_Release();
     

  538.  
  539. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
     
  540. {
     
  541. m_iUserID[i] = -1;
     
  542. }
     
  543. m_dwTransTaskId = -1;
     
  544. }
     

  545.  

  546.  
  547. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientConnect(WPARAM wParam, LPARAM lParam)
     
  548. {
     
  549. BOOL bSuccess = (BOOL)wParam;
     
  550. AppendLogString(bSuccess ? "连接服务器成功..." : "连接服务器失败...");
     
  551. return 0;
     
  552. }
     

  553.  
  554. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientLogin(WPARAM wParam, LPARAM lParam)
     
  555. {
     
  556. CString logstr;
     
  557. DWORD dwUserID = wParam;
     
  558. if(lParam == 0)
     
  559. {
     
  560. CHAR username[30]={0};
     
  561. BRAC_GetUserName(dwUserID,username,sizeof(username));
     
  562. logstr.Format("登录服务器成功,自己的用户编号为:%d(%s)",wParam,username);
     

  563.  
  564. // 将用户的ID保存在第一个位置,否则在回调函数里面可能找不到绘制的位置
     
  565. m_iUserID[0] = dwUserID;
     
  566. }
     
  567. else
     
  568. logstr.Format("登录服务器失败,出错代码为: %d ",lParam);
     

  569.  
  570. AppendLogString(logstr);
     

  571.  
  572. return 0;
     
  573. }
     

  574.  
  575. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientEnterRoom(WPARAM wParam, LPARAM lParam)
     
  576. {
     
  577. CString logstr;
     
  578. INT roomid = (INT)wParam;
     
  579. if(lParam == 0)
     
  580. {
     
  581. logstr.Format("成功进入编号为:%d 的房间",roomid);
     

  582.  
  583. BRAC_SetVideoPos(-1,m_hWnd,m_UserRect[0].left,m_UserRect[0].top,m_UserRect[0].right,m_UserRect[0].bottom);
     
  584. BRAC_UserCameraControl(-1,TRUE);
     
  585. BRAC_UserSpeakControl(-1,TRUE);
     
  586. }
     
  587. else
     
  588. logstr.Format("申请进入房间失败,出错代码为: %d ",lParam);
     

  589.  
  590. AppendLogString(logstr);
     
  591. return 0;
     
  592. }
     

  593.  
  594. void CBRAnyChatSDKDemoDlg::AppendLogString(CString logstr)
     
  595. {
     
  596. m_strLogInfo += (logstr + "\r\n");
     
  597. m_ctrlEditLog.SetWindowText(m_strLogInfo);
     
  598. m_ctrlEditLog.LineScroll(m_ctrlEditLog.GetLineCount());
     
  599. }
     

  600.  

  601.  
  602. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientOnlineUser(WPARAM wParam, LPARAM lParam)
     
  603. {
     
  604. CString logstr;
     
  605. INT onlinenum = (INT)wParam;
     

  606.  
  607. logstr.Format("在编号为:%d 的房间共有 %d 位在线用户",lParam, onlinenum);
     
  608. AppendLogString(logstr);
     

  609.  

  610.  

  611.  
  612. DWORD dwUserNum = 0;
     
  613. BRAC_GetOnlineUser(NULL,dwUserNum); ///< 首先获取房间内在线人数
     
  614. if(!dwUserNum)
     
  615. return 0;
     

  616.  
  617. LPDWORD lpdwUserList = (LPDWORD)malloc(sizeof(DWORD)*dwUserNum);
     
  618. BRAC_GetOnlineUser(lpdwUserList,dwUserNum); ///< 真正获取在线用户列表
     

  619.  
  620. for(INT i=0; i< (INT)dwUserNum; i++)
     
  621. {
     
  622. DWORD userid = lpdwUserList[i];
     
  623. // 给用户找一个空的位置显示面板(第0号位置留给自己)
     
  624. INT site = -1;
     
  625. for(INT i=1; i<DEMO_SHOW_USER_NUM; i++)
     
  626. {
     
  627. if(m_iUserID[i] == -1)
     
  628. {
     
  629. site = i;
     
  630. break;
     
  631. }
     
  632. }
     
  633. if(site != -1)
     
  634. {
     
  635. BRAC_SetVideoPos(userid,m_hWnd,m_UserRect[site].left,m_UserRect[site].top,m_UserRect[site].right,m_UserRect[site].bottom);
     
  636. BRAC_UserCameraControl(userid,TRUE);
     
  637. BRAC_UserSpeakControl(userid,TRUE);
     

  638.  
  639. DWORD dwState = 0;
     
  640. BRAC_GetCameraState(userid,dwState);
     
  641. logstr.Format("用户%d 的视频状态是: %d",userid,dwState);
     
  642. AppendLogString(logstr);
     

  643.  

  644.  
  645. m_iUserID[site] = userid;
     
  646. }
     
  647. else ///< 已经没有位置了,Demo演示限制
     
  648. break;
     
  649. }
     

  650.  
  651. free(lpdwUserList);
     

  652.  
  653. return 0;
     
  654. }
     

  655.  
  656. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientUserAtRoom(WPARAM wParam, LPARAM lParam)
     
  657. {
     
  658. CString logstr;
     
  659. INT userid = (INT)wParam;
     
  660. BOOL bEnter = (BOOL)lParam;
     

  661.  
  662. CHAR username[30]={0};
     
  663. BRAC_GetUserName(userid,username,sizeof(username));
     
  664. logstr.Format("编号为:%d 的用户(%s) %s 房间",userid,username, bEnter ? "进入" : "离开");
     
  665. AppendLogString(logstr);
     

  666.  
  667. if(bEnter)
     
  668. {
     
  669. // 给用户找一个空的位置显示面板(第0号位置留给自己)
     
  670. INT site = -1;
     
  671. for(INT i=1; i<DEMO_SHOW_USER_NUM; i++)
     
  672. {
     
  673. if(m_iUserID[i] == -1)
     
  674. {
     
  675. site = i;
     
  676. break;
     
  677. }
     
  678. }
     
  679. if(site != -1)
     
  680. {
     
  681. BRAC_SetVideoPos(userid,m_hWnd,m_UserRect[site].left,m_UserRect[site].top,m_UserRect[site].right,m_UserRect[site].bottom);
     
  682. BRAC_UserCameraControl(userid,TRUE);
     
  683. BRAC_UserSpeakControl(userid,TRUE);
     
  684. m_iUserID[site] = userid;
     
  685. }
     

  686.  
  687. }
     
  688. else
     
  689. {
     
  690. //清除该用户占用位置的信息
     
  691. for(INT i=1; i<DEMO_SHOW_USER_NUM; i++)
     
  692. {
     
  693. if(m_iUserID[i] == userid)
     
  694. {
     
  695. m_iUserID[i] = -1;
     
  696. break;
     
  697. }
     
  698. }
     
  699. }
     

  700.  
  701. return 0;
     
  702. }
     

  703.  

  704.  
  705. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientMicStateChange(WPARAM wParam, LPARAM lParam)
     
  706. {
     
  707. CString logstr;
     

  708.  
  709. logstr.Format("编号为:%d 的用户 %s 本地Mic设备",wParam, lParam ? "打开" : "关闭");
     
  710. AppendLogString(logstr);
     

  711.  
  712. return 0;
     
  713. }
     

  714.  

  715.  
  716. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientLinkClose(WPARAM wParam, LPARAM lParam)
     
  717. {
     
  718. AppendLogString("网络连接已关闭(断开)");
     

  719.  
  720. for(INT i=0; i<DEMO_SHOW_USER_NUM; i++)
     
  721. {
     
  722. m_iUserID[i] = -1;
     
  723. }
     
  724. return 0;
     
  725. }
     

  726.  

  727.  
  728. LRESULT CBRAnyChatSDKDemoDlg::OnGVClientChatModeChange(WPARAM wParam, LPARAM lParam)
     
  729. {
     
  730. CString logstr;
     
  731. INT userid = (INT)wParam;
     
  732. INT chatmode = (INT)lParam;
     

  733.  
  734. if(m_iUserID[0] == userid)
     
  735. {
     
  736. logstr.Format("自己(%d )的聊天模式改变,当前聊天模式为:%s",userid, chatmode == 0 ? "公聊模式" : "私聊模式");
     
  737. }
     
  738. else
     
  739. logstr.Format("编号为:%d 的用户聊天模式改变,当前聊天模式为:%s",userid, chatmode == 0 ? "公聊模式" : "私聊模式");
     

  740.  
  741. AppendLogString(logstr);
     
  742. return 0;
     
  743. }
     
  744. void CBRAnyChatSDKDemoDlg::OnButtonVideoproperty()
     
  745. {
     
  746. BRAC_ShowLVProperty(m_hWnd,"AnyChat 本地视频画质调节");
     

  747.  
  748. }
     

  749.  
  750. void CBRAnyChatSDKDemoDlg::OnButtonRefreshCapture()
     
  751. {
     
  752. // 刷新视频采集设备下拉列表
     
  753. PCHAR DeviceName[10] = {0};
     
  754. DWORD DeviceNum = 10;
     
  755. BRAC_EnumVideoCapture(DeviceName,DeviceNum);
     

  756.  

  757.  
  758. m_cbVideoCapture.ResetContent();
     
  759. INT i=0;
     
  760. for(i=0; i<(INT)DeviceNum; i++)
     
  761. {
     
  762. if(DeviceName[i])
     
  763. {
     
  764. m_cbVideoCapture.AddString(DeviceName[i]);
     
  765. ::GlobalFree((HGLOBAL)DeviceName[i]);
     
  766. DeviceName[i] = NULL;
     
  767. }
     
  768. }
     

  769.  
  770. // 选择当前打开的视频采集设备
     
  771. CHAR szVideoDeviceName[100] = {0};
     
  772. BRAC_GetCurVideoCapture(szVideoDeviceName,sizeof(szVideoDeviceName));
     
  773. m_cbVideoCapture.SelectString(-1,szVideoDeviceName);
     

  774.  
  775. // 刷新音频采集设备下拉列表
     
  776. DeviceNum = 10;
     
  777. BRAC_EnumAudioCapture(DeviceName,DeviceNum);
     

  778.  
  779. m_cbAudioCapture.ResetContent();
     
  780. for(i=0; i<(INT)DeviceNum; i++)
     
  781. {
     
  782. if(DeviceName[i])
     
  783. {
     
  784. m_cbAudioCapture.AddString(DeviceName[i]);
     
  785. ::GlobalFree((HGLOBAL)DeviceName[i]);
     
  786. DeviceName[i] = NULL;
     
  787. }
     
  788. }
     
  789. // 选择当前打开的视频采集设备
     
  790. CHAR szAudioDeviceName[100] = {0};
     
  791. BRAC_GetCurAudioCapture(szAudioDeviceName,sizeof(szAudioDeviceName));
     
  792. m_cbAudioCapture.SelectString(-1,szAudioDeviceName);
     
  793. }
     

  794.  
  795. void CBRAnyChatSDKDemoDlg::OnSelchangeComboVideoCapture()
     
  796. {
     
  797. CString strCaptureName;
     
  798. m_cbVideoCapture.GetLBText(m_cbVideoCapture.GetCurSel(),strCaptureName);
     
  799. BRAC_SelectVideoCapture(strCaptureName);
     
  800. }
     

  801.  
  802. void CBRAnyChatSDKDemoDlg::OnSelChangeComboAudioCapture()
     
  803. {
     
  804. CString strCaptureName;
     
  805. m_cbAudioCapture.GetLBText(m_cbAudioCapture.GetCurSel(),strCaptureName);
     
  806. BRAC_SelectAudioCapture(strCaptureName);
     
  807. }
     

  808.  
  809. void CBRAnyChatSDKDemoDlg::OnSliderOutVolumeChange(NMHDR* pNMHDR, LRESULT* pResult)
     
  810. {
     
  811. DWORD dwVolume = m_ctrlOutVolume.GetPos();
     
  812. BRAC_AudioSetVolume(BRAC_AD_WAVEOUT,dwVolume);
     
  813. *pResult = 0;
     
  814. }
     

  815.  
  816. void CBRAnyChatSDKDemoDlg::OnOnSliderInVolumeChange(NMHDR* pNMHDR, LRESULT* pResult)
     
  817. {
     
  818. DWORD dwVolume = m_ctrlInVolume.GetPos();
     
  819. BRAC_AudioSetVolume(BRAC_AD_WAVEIN,dwVolume);
     
  820. *pResult = 0;
     
  821. }
     

  822.  
  823. // 录音的音量发生改变
     
  824. void CBRAnyChatSDKDemoDlg::OnWaveInVolumeChange(DWORD dwVolume)
     
  825. {
     
  826. m_ctrlInVolume.SetPos(dwVolume);
     
  827. }
     
  828. // 放音的音量发生改变
     
  829. void CBRAnyChatSDKDemoDlg::OnWaveOutVolumeChange(DWORD dwVolume)
     
  830. {
     
  831. m_ctrlOutVolume.SetPos(dwVolume);
     
  832. }
     

  833.  

  834.  

  835.  
  836. void CBRAnyChatSDKDemoDlg::OnTimer(UINT nIDEvent)
     
  837. {
     
  838. switch(nIDEvent)
     
  839. {
     
  840. case REFRESH_TRANSTASK_STATUS_TIMER: // 刷新缓冲区传输任务状态
     
  841. {
     
  842. if(m_dwTransTaskId == -1)
     
  843. {
     
  844. KillTimer(REFRESH_TRANSTASK_STATUS_TIMER);
     
  845. break;
     
  846. }
     
  847. DWORD ret;
     
  848. DWORD dwStatus = 0;
     
  849. ret = BRAC_QueryTransTaskInfo(-1,m_dwTransTaskId,BRAC_TRANSTASK_STATUS,(PCHAR)&dwStatus,sizeof(DWORD));
     
  850. if(ret != GV_ERR_SUCCESS)
     
  851. {
     
  852. KillTimer(REFRESH_TRANSTASK_STATUS_TIMER);
     
  853. m_dwTransTaskId = -1;
     
  854. SetDlgItemText(IDC_STATIC_FILESTATUS,"");
     
  855. if(ret == GV_ERR_TRANSBUF_NOTASK)
     
  856. AppendLogString("传输任务不存在,可能对方已离开房间!");
     
  857. else
     
  858. AppendLogString("查询任务信息失败!");
     
  859. break;
     
  860. }
     
  861. DOUBLE dbProgress = 0.0;
     
  862. BRAC_QueryTransTaskInfo(-1,m_dwTransTaskId,BRAC_TRANSTASK_PROGRESS,(PCHAR)&dbProgress,sizeof(DOUBLE));
     
  863. DWORD dwBitrate = 0;
     
  864. BRAC_QueryTransTaskInfo(-1,m_dwTransTaskId,BRAC_TRANSTASK_BITRATE,(PCHAR)&dwBitrate,sizeof(DWORD));
     

  865.  
  866. CString strStatus;
     
  867. switch(dwStatus)
     
  868. {
     
  869. case 1: strStatus = "Ready"; break;
     
  870. case 2: strStatus = "Process"; break;
     
  871. case 3: strStatus = "Finish"; break;
     
  872. case 4: strStatus = "Cancel"; break;
     
  873. case 5: strStatus = "Reject"; break;
     
  874. default: strStatus = "Unkonw"; break;
     
  875. }
     
  876. if(dwStatus == 3) // finish
     
  877. {
     
  878. KillTimer(REFRESH_TRANSTASK_STATUS_TIMER);
     
  879. m_dwTransTaskId = -1;
     
  880. AppendLogString("传输任务已完成!");
     
  881. }
     
  882. CString strBitrate;
     
  883. if(dwBitrate >= 1000 * 1000)
     
  884. strBitrate.Format("%.02f Mbps",(float)dwBitrate/1000/1000);
     
  885. else if(dwBitrate >= 1000)
     
  886. strBitrate.Format("%.02f Kbps",(float)dwBitrate/1000);
     
  887. else
     
  888. strBitrate.Format("%.02f bps",(float)dwBitrate);
     

  889.  
  890. CString strNotify;
     
  891. strNotify.Format("%s-%.02f%%-%s",strStatus,dbProgress,strBitrate);
     
  892. SetDlgItemText(IDC_STATIC_FILESTATUS,strNotify);
     
  893. }
     
  894. case REFRESH_SPEAKVOLUME_TIMER: // 刷新用户说话音量
     
  895. {
     
  896. DOUBLE fSpeakVolume = 0.0;
     
  897. if(m_iUserID[0] != -1 && BRAC_QueryUserState(m_iUserID[0],BRAC_USERSTATE_SPEAKVOLUME,(PCHAR)&fSpeakVolume,sizeof(DOUBLE)) == GV_ERR_SUCCESS)
     
  898. m_ctrlSpeakVolume0.SetPos((INT)fSpeakVolume);
     
  899. else
     
  900. m_ctrlSpeakVolume0.SetPos(0);
     

  901.  
  902. fSpeakVolume = 0.0;
     
  903. if(m_iUserID[1] != -1 && BRAC_QueryUserState(m_iUserID[1],BRAC_USERSTATE_SPEAKVOLUME,(PCHAR)&fSpeakVolume,sizeof(DOUBLE)) == GV_ERR_SUCCESS)
     
  904. m_ctrlSpeakVolume1.SetPos((INT)fSpeakVolume);
     
  905. else
     
  906. m_ctrlSpeakVolume1.SetPos(0);
     
  907. fSpeakVolume = 0.0;
     
  908. if(m_iUserID[2] != -1 && BRAC_QueryUserState(m_iUserID[2],BRAC_USERSTATE_SPEAKVOLUME,(PCHAR)&fSpeakVolume,sizeof(DOUBLE)) == GV_ERR_SUCCESS)
     
  909. m_ctrlSpeakVolume2.SetPos((INT)fSpeakVolume);
     
  910. else
     
  911. m_ctrlSpeakVolume2.SetPos(0);
     
  912. fSpeakVolume = 0.0;
     
  913. if(m_iUserID[3] != -1 && BRAC_QueryUserState(m_iUserID[3],BRAC_USERSTATE_SPEAKVOLUME,(PCHAR)&fSpeakVolume,sizeof(DOUBLE)) == GV_ERR_SUCCESS)
     
  914. m_ctrlSpeakVolume3.SetPos((INT)fSpeakVolume);
     
  915. else
     
  916. m_ctrlSpeakVolume3.SetPos(0);
     
  917. }
     
  918. break;
     
  919. case REFRESH_RECORDSTATE_TIMER: // 刷新录像状态
     
  920. {
     
  921. DWORD dwRecordState = 0;
     
  922. if(m_iUserID[0] != -1 && BRAC_QueryUserState(m_iUserID[0],BRAC_USERSTATE_RECORDING,(PCHAR)&dwRecordState,sizeof(DWORD)) == GV_ERR_SUCCESS)
     
  923. {
     
  924. static BOOL bShow = FALSE;
     
  925. bShow = dwRecordState ? !bShow : FALSE;
     
  926. GetDlgItem(IDC_STATIC_RECORDSTATE0)->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
     
  927. }
     
  928. dwRecordState = 0;
     
  929. if(m_iUserID[1] != -1 && BRAC_QueryUserState(m_iUserID[1],BRAC_USERSTATE_RECORDING,(PCHAR)&dwRecordState,sizeof(DWORD)) == GV_ERR_SUCCESS)
     
  930. {
     
  931. static BOOL bShow = FALSE;
     
  932. bShow = dwRecordState ? !bShow : FALSE;
     
  933. GetDlgItem(IDC_STATIC_RECORDSTATE1)->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
     
  934. }
     
  935. dwRecordState = 0;
     
  936. if(m_iUserID[2] != -1 && BRAC_QueryUserState(m_iUserID[2],BRAC_USERSTATE_RECORDING,(PCHAR)&dwRecordState,sizeof(DWORD)) == GV_ERR_SUCCESS)
     
  937. {
     
  938. static BOOL bShow = FALSE;
     
  939. bShow = dwRecordState ? !bShow : FALSE;
     
  940. GetDlgItem(IDC_STATIC_RECORDSTATE2)->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
     
  941. }
     
  942. dwRecordState = 0;
     
  943. if(m_iUserID[3] != -1 && BRAC_QueryUserState(m_iUserID[3],BRAC_USERSTATE_RECORDING,(PCHAR)&dwRecordState,sizeof(DWORD)) == GV_ERR_SUCCESS)
     
  944. {
     
  945. static BOOL bShow = FALSE;
     
  946. bShow = dwRecordState ? !bShow : FALSE;
     
  947. GetDlgItem(IDC_STATIC_RECORDSTATE3)->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
     
  948. }
     
  949. }
     
  950. break;
     
  951. default:
     
  952. break;
     
  953. }
     

  954.  
  955. CDialog::OnTimer(nIDEvent);
     
  956. }
     

  957.  
  958. void CBRAnyChatSDKDemoDlg::OnButtonSendFile()
     
  959. {
     
  960. if(m_dwTransTaskId != -1) // 演示程序为了简洁,同时只允许传一个任务,实际上SDK是可以多任务并发的
     
  961. return;
     

  962.  
  963. static TCHAR BASED_CODE szFilter[] = _T("All Files (*.*)||*.*\0");
     
  964. CFileDialog dlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, szFilter, this);
     
  965. if (dlg.DoModal() == IDOK)
     
  966. {
     
  967. CString strFileName = dlg.GetPathName();
     
  968. DWORD dwTaskId = 0;
     
  969. DWORD wParam = 1; // 上层应用程序可自定义wParam、lParam的值,这两个参数的值将被回调给对方
     
  970. DWORD lParam = 2;
     
  971. DWORD dwFlags = 0; // 该标志设置为0,则SDK将自动根据网络状态选择合适的传输途径(TCP、UDP or P2P)
     
  972. DWORD ret = BRAC_TransFile(m_iUserID[1],strFileName.GetBuffer(0),wParam,lParam,dwFlags,dwTaskId);
     
  973. if(ret == GV_ERR_SUCCESS)
     
  974. {
     
  975. m_dwTransTaskId = dwTaskId;
     
  976. SetTimer(REFRESH_TRANSTASK_STATUS_TIMER,100,NULL);
     
  977. }
     
  978. else
     
  979. {
     
  980. CString strError;
     
  981. strError.Format("创建文件传输任务失败,出错代码:%d",ret);
     
  982. AppendLogString(strError);
     
  983. SetDlgItemText(IDC_STATIC_FILESTATUS,"");
     
  984. }
     
  985. }
     
  986. }
     
  987. // 传输超大缓冲区任务演示
     
  988. void CBRAnyChatSDKDemoDlg::OnButtonTransbuf()
     
  989. {
     
  990. if(m_dwTransTaskId != -1) // 演示程序为了简洁,同时只允许传一个任务,实际上SDK是可以多任务并发的
     
  991. return;
     

  992.  
  993. PCHAR lpBuf = (PCHAR)malloc(10*1024); // 为了演示,创建一个10KByte大小的缓冲区
     
  994. DWORD dwLen = 10*1024;
     
  995. if(!lpBuf)
     
  996. return;
     
  997. lpBuf[1000] = 'Y'; // 演示的需要,为了验证收到的数据是否正确,在缓冲区中间某个位置设置一个标志,对方接收后,可判断该标志是否为设定值
     

  998.  
  999. DWORD dwTaskId = 0;
     
  1000. DWORD wParam = 3; // 上层应用程序可自定义wParam、lParam的值,这两个参数的值将被回调给对方
     
  1001. DWORD lParam = 4;
     
  1002. DWORD dwFlags = 0; // 该标志设置为0,则SDK将自动根据网络状态选择合适的传输途径(TCP、UDP or P2P)
     
  1003. DWORD ret = BRAC_TransBufferEx(m_iUserID[1],(PBYTE)lpBuf,dwLen,wParam,lParam,dwFlags,dwTaskId);
     
  1004. if(ret == GV_ERR_SUCCESS)
     
  1005. {
     
  1006. m_dwTransTaskId = dwTaskId;
     
  1007. SetTimer(REFRESH_TRANSTASK_STATUS_TIMER,100,NULL);
     
  1008. }
     
  1009. else
     
  1010. {
     
  1011. CString strError;
     
  1012. strError.Format("创建缓冲区传输任务失败,出错代码:%d",ret);
     
  1013. AppendLogString(strError);
     
  1014. SetDlgItemText(IDC_STATIC_FILESTATUS,"");
     
  1015. }
     
  1016. // 缓冲区调用完成后, 可以立即释放掉
     
  1017. free(lpBuf);
     

  1018.  
  1019. // BRAC_TransBuffer(m_iUserID[1],(LPBYTE)"bairuitech",10);
     
  1020. }
     

  1021.  

  1022.  
  1023. void CBRAnyChatSDKDemoDlg::OnCheckVad()
     
  1024. {
     
  1025. UpdateData(TRUE);
     
  1026. BRAC_SetSDKOption(BRAC_SO_AUDIO_VADCTRL,(PCHAR)&m_bEnableVAD,sizeof(m_bEnableVAD));
     
  1027. }
     

  1028.  
  1029. void CBRAnyChatSDKDemoDlg::OnCheckAgc()
     
  1030. {
     
  1031. UpdateData(TRUE);
     
  1032. BRAC_SetSDKOption(BRAC_SO_AUDIO_AGCCTRL,(PCHAR)&m_bEnableAGC,sizeof(m_bEnableAGC));
     
  1033. }
     

  1034.  
  1035. void CBRAnyChatSDKDemoDlg::OnCheckEcho()
     
  1036. {
     
  1037. UpdateData(TRUE);
     
  1038. BRAC_SetSDKOption(BRAC_SO_AUDIO_ECHOCTRL,(PCHAR)&m_bEnableEcho,sizeof(m_bEnableEcho));
     
  1039. }
     

  1040.  
  1041. void CBRAnyChatSDKDemoDlg::OnCheckNs()
     
  1042. {
     
  1043. UpdateData(TRUE);
     
  1044. BRAC_SetSDKOption(BRAC_SO_AUDIO_NSCTRL,(PCHAR)&m_bEnableNS,sizeof(m_bEnableNS));
     
  1045. }
     

  1046.  
  1047. void CBRAnyChatSDKDemoDlg::OnButtonVideoctrl0()
     
  1048. {
     
  1049. // 为了演示程序简单,这儿采用静态变量保存上一次的状态,可能不准确,因为可能在别的地方有打开,或是关闭的操作,下同
     
  1050. // 特别是当前用户离开房间,别的用户再进来时,初始状态将不准确
     
  1051. static BOOL bLastState = TRUE;
     
  1052. if(m_iUserID[0] != -1)
     
  1053. {
     
  1054. BRAC_UserCameraControl(m_iUserID[0],!bLastState);
     
  1055. bLastState = !bLastState;
     
  1056. }
     
  1057. }
     

  1058.  
  1059. void CBRAnyChatSDKDemoDlg::OnButtonVideoctrl1()
     
  1060. {
     
  1061. static BOOL bLastState = TRUE;
     
  1062. if(m_iUserID[1] != -1)
     
  1063. {
     
  1064. BRAC_UserCameraControl(m_iUserID[1],!bLastState);
     
  1065. bLastState = !bLastState;
     
  1066. }
     
  1067. }
     

  1068.  
  1069. void CBRAnyChatSDKDemoDlg::OnButtonVideoctrl2()
     
  1070. {
     
  1071. static BOOL bLastState = TRUE;
     
  1072. if(m_iUserID[2] != -1)
     
  1073. {
     
  1074. BRAC_UserCameraControl(m_iUserID[2],!bLastState);
     
  1075. bLastState = !bLastState;
     
  1076. }
     
  1077. }
     

  1078.  
  1079. void CBRAnyChatSDKDemoDlg::OnButtonVideoctrl3()
     
  1080. {
     
  1081. static BOOL bLastState = TRUE;
     
  1082. if(m_iUserID[3] != -1)
     
  1083. {
     
  1084. BRAC_UserCameraControl(m_iUserID[3],!bLastState);
     
  1085. bLastState = !bLastState;
     
  1086. }
     
  1087. }
     

  1088.  
  1089. void CBRAnyChatSDKDemoDlg::OnButtonAudioctrl0()
     
  1090. {
     
  1091. static BOOL bLastState = TRUE;
     
  1092. if(m_iUserID[0] != -1)
     
  1093. {
     
  1094. BRAC_UserSpeakControl(m_iUserID[0],!bLastState);
     
  1095. bLastState = !bLastState;
     
  1096. }
     
  1097. }
     

  1098.  
  1099. void CBRAnyChatSDKDemoDlg::OnButtonAudioctrl1()
     
  1100. {
     
  1101. static BOOL bLastState = TRUE;
     
  1102. if(m_iUserID[1] != -1)
     
  1103. {
     
  1104. BRAC_UserSpeakControl(m_iUserID[1],!bLastState);
     
  1105. bLastState = !bLastState;
     
  1106. }
     
  1107. }
     

  1108.  
  1109. void CBRAnyChatSDKDemoDlg::OnButtonAudioctrl2()
     
  1110. {
     
  1111. static BOOL bLastState = TRUE;
     
  1112. if(m_iUserID[2] != -1)
     
  1113. {
     
  1114. BRAC_UserSpeakControl(m_iUserID[2],!bLastState);
     
  1115. bLastState = !bLastState;
     
  1116. }
     
  1117. }
     

  1118.  
  1119. void CBRAnyChatSDKDemoDlg::OnButtonAudioctrl3()
     
  1120. {
     
  1121. static BOOL bLastState = TRUE;
     
  1122. if(m_iUserID[3] != -1)
     
  1123. {
     
  1124. BRAC_UserSpeakControl(m_iUserID[3],!bLastState);
     
  1125. bLastState = !bLastState;
     
  1126. }
     
  1127. }
     

  1128.  
  1129. void CBRAnyChatSDKDemoDlg::OnButtonRecordctrl0()
     
  1130. {
     
  1131. static BOOL bLastState = FALSE;
     
  1132. if(m_iUserID[0] != -1)
     
  1133. {
     
  1134. BRAC_StreamRecordCtrl(m_iUserID[0],!bLastState,0,0);
     
  1135. bLastState = !bLastState;
     
  1136. }
     
  1137. }
     

  1138.  
  1139. void CBRAnyChatSDKDemoDlg::OnButtonRecordctrl1()
     
  1140. {
     
  1141. static BOOL bLastState = FALSE;
     
  1142. if(m_iUserID[1] != -1)
     
  1143. {
     
  1144. BRAC_StreamRecordCtrl(m_iUserID[1],!bLastState,0,0);
     
  1145. bLastState = !bLastState;
     
  1146. }
     
  1147. }
     

  1148.  
  1149. void CBRAnyChatSDKDemoDlg::OnButtonRecordctrl2()
     
  1150. {
     
  1151. static BOOL bLastState = FALSE;
     
  1152. if(m_iUserID[2] != -1)
     
  1153. {
     
  1154. BRAC_StreamRecordCtrl(m_iUserID[2],!bLastState,0,0);
     
  1155. bLastState = !bLastState;
     
  1156. }
     
  1157. }
     

  1158.  
  1159. void CBRAnyChatSDKDemoDlg::OnButtonRecordctrl3()
     
  1160. {
     
  1161. static BOOL bLastState = FALSE;
     
  1162. if(m_iUserID[3] != -1)
     
  1163. {
     
  1164. BRAC_StreamRecordCtrl(m_iUserID[3],!bLastState,0,0);
     
  1165. bLastState = !bLastState;
     
  1166. }
     
  1167. }
     

  1168.  
  1169. void CBRAnyChatSDKDemoDlg::OnButtonSnapshotctrl0()
     
  1170. {
     
  1171. if(m_iUserID[0] != -1)
     
  1172. {
     
  1173. BRAC_SnapShot(m_iUserID[0],0,0);
     
  1174. }
     
  1175. }
     

  1176.  
  1177. void CBRAnyChatSDKDemoDlg::OnButtonSnapshotctrl1()
     
  1178. {
     
  1179. if(m_iUserID[1] != -1)
     
  1180. {
     
  1181. BRAC_SnapShot(m_iUserID[1],0,0);
     
  1182. }
     
  1183. }
     

  1184.  
  1185. void CBRAnyChatSDKDemoDlg::OnButtonSnapshotctrl2()
     
  1186. {
     
  1187. if(m_iUserID[2] != -1)
     
  1188. {
     
  1189. BRAC_SnapShot(m_iUserID[2],0,0);
     
  1190. }
     
  1191. }
     

  1192.  
  1193. void CBRAnyChatSDKDemoDlg::OnButtonSnapshotctrl3()
     
  1194. {
     
  1195. if(m_iUserID[3] != -1)
     
  1196. {
     
  1197. BRAC_SnapShot(m_iUserID[3],0,0);
     
  1198. }
     
  1199. }
复制代码
文字信息交流
点对点语音、视频通话
多方语音、视频交互
文件传输
拍照、录像
自定义缓冲区传输
…………
P2P+服务器转发,UPnP支持
音视频同步,多路混音
回音消除、噪音抑制、自动增益
网络自适应,3G网络优化
动态缓冲区控制
视频防马赛克处理
发言模式、放歌模式、卡拉OK模式,单声道、立体声自动切换