AVDlg.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:11k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "rtccore.h"
  3. #include "AVDConf.h"
  4. #include "AVDlg.h"
  5. #include "defines.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAVDlg dialog
  13. CAVDlg::CAVDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CAVDlg::IDD, pParent)
  15. {
  16. m_pParentClient = NULL;
  17. //{{AFX_DATA_INIT(CAVDlg)
  18. //}}AFX_DATA_INIT
  19. }
  20.    
  21. void CAVDlg::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CAVDlg)
  25. DDX_Control(pDX, IDC_SPEAKERMUTE, m_cSpeakerMute);
  26. DDX_Control(pDX, IDC_SPEAKER_BAR, m_cSpeakerLevel);
  27. DDX_Control(pDX, IDC_MIC_BAR, m_cMicLevel);
  28. DDX_Control(pDX, IDC_SPEAKER_SLIDER, m_cSpeakerSlider);
  29. DDX_Control(pDX, IDC_MICMUTE, m_cMicMute);
  30. DDX_Control(pDX, IDC_SPEAKER_TEXT, m_cSpeakerText);
  31. DDX_Control(pDX, IDC_MIC_TEXT, m_cMicText);
  32. DDX_Control(pDX, IDC_MIC_SLIDER, m_cMicSlider);
  33. //}}AFX_DATA_MAP
  34. }
  35. BEGIN_MESSAGE_MAP(CAVDlg, CDialog)
  36. //{{AFX_MSG_MAP(CAVDlg)
  37. ON_NOTIFY(NM_OUTOFMEMORY, IDC_SPEAKER_SLIDER, OnSpeakerSlider)
  38. ON_NOTIFY(NM_OUTOFMEMORY, IDC_MIC_SLIDER, OnMicSlider)
  39. ON_BN_CLICKED(IDC_SPEAKERMUTE, OnSpeakermute)
  40. ON_BN_CLICKED(IDC_MICMUTE, OnMicmute)
  41. //}}AFX_MSG_MAP
  42. END_MESSAGE_MAP()
  43. void CAVDlg::OnOK() 
  44. {
  45. if (m_pSession)
  46. {
  47. HRESULT hr = m_pSession->Terminate(RTCTR_NORMAL);
  48. }
  49. CDialog::OnOK();
  50. }
  51. void CAVDlg::OnCancel ()
  52. {
  53. return;
  54. }
  55. void CAVDlg::OnSpeakerSlider(NMHDR* pNMHDR, LRESULT* pResult) 
  56. {
  57. long lPos = m_cSpeakerSlider.GetPos ();
  58. DoVolume (RTCAD_SPEAKER, lPos);
  59. *pResult = 0;
  60. }
  61. void CAVDlg::OnMicSlider(NMHDR* pNMHDR, LRESULT* pResult) 
  62. {
  63. long lPos = m_cMicSlider.GetPos ();
  64. DoVolume (RTCAD_MICROPHONE, lPos);
  65. *pResult = 0;
  66. }
  67. void CAVDlg::OnMicmute() 
  68. {
  69. if (m_cMicMute.IsDlgButtonChecked (IDC_MICMUTE) != 0)
  70. m_cMicSlider.EnableWindow (FALSE);
  71. else
  72. m_cMicSlider.EnableWindow (TRUE);
  73. DoMute (RTCAD_MICROPHONE);
  74. }
  75. void CAVDlg::OnSpeakermute() 
  76. {
  77. if (IsDlgButtonChecked (IDC_SPEAKERMUTE) != 0)
  78. m_cSpeakerSlider.EnableWindow (FALSE);
  79. else
  80. m_cSpeakerSlider.EnableWindow (TRUE);
  81. DoMute (RTCAD_SPEAKER);
  82. }
  83. HRESULT CAVDlg::SetParentClient(IRTCClient *pClient)
  84. {
  85. m_pParentClient = pClient;
  86. ShowAudio();
  87. return S_OK;
  88. }
  89. HRESULT CAVDlg::DoMute(RTC_AUDIO_DEVICE enDevice)
  90. {
  91.     IRTCClient * pClient = NULL;
  92.     BOOL fMute = FALSE;   
  93.     HWND hWnd = NULL;
  94.     HRESULT hr;
  95. if (m_pParentClient == NULL)
  96. return -1;
  97. fMute = IsDlgButtonChecked ( (enDevice == RTCAD_SPEAKER) ? IDC_SPEAKERMUTE : IDC_MICMUTE);
  98.     hr = m_pParentClient->put_AudioMuted(enDevice, fMute ? VARIANT_TRUE : VARIANT_FALSE);
  99.     if (FAILED(hr))
  100.     {
  101.         return hr;
  102.     }
  103.     return S_OK;
  104. }
  105. HRESULT CAVDlg::DoVolume(RTC_AUDIO_DEVICE enDevice, long lVolume)
  106. {
  107.     HRESULT hr;
  108. if (m_pParentClient == NULL)
  109. return -1;
  110.     hr = m_pParentClient->put_Volume(enDevice, lVolume);
  111.     if (FAILED(hr))
  112.     {
  113.         return hr;
  114.     }
  115. return S_OK;
  116. }
  117. HRESULT CAVDlg::ShowAudio()
  118. {
  119.     VARIANT_BOOL fMute = FALSE;
  120.     long lVolume = 0;
  121.     long lMediaCaps = 0;
  122.     HRESULT hr;
  123.     if (m_pParentClient == NULL)
  124. return -1;
  125.     hr = m_pParentClient->get_MediaCapabilities(&lMediaCaps);
  126.     if (FAILED(hr))
  127.     {
  128.         return hr;
  129.     }
  130.     if (lMediaCaps & RTCMT_AUDIO_RECEIVE)
  131.     {
  132.         hr = m_pParentClient->get_AudioMuted(RTCAD_SPEAKER, &fMute);
  133.         if (FAILED(hr))
  134.         {
  135.             return hr;
  136.         }
  137.         m_cSpeakerMute.SetCheck ( fMute ? BST_CHECKED : BST_UNCHECKED);
  138.         hr = m_pParentClient->get_Volume(RTCAD_SPEAKER, &lVolume);
  139.         if (FAILED(hr))
  140.         {
  141.             return hr;
  142.         }
  143. m_cSpeakerSlider.SetPos (lVolume);
  144.     }
  145.     if (lMediaCaps & RTCMT_AUDIO_SEND)
  146.     {
  147.   
  148.         hr = m_pParentClient->get_AudioMuted(RTCAD_MICROPHONE, &fMute);
  149.         if (FAILED(hr))
  150.         {
  151.             return hr;
  152.         }
  153.         m_cMicMute.SetCheck ( fMute ? BST_CHECKED : BST_UNCHECKED );
  154.    
  155.         hr = m_pParentClient->get_Volume(RTCAD_MICROPHONE, &lVolume);
  156.         if (FAILED(hr))
  157.         {
  158.             return hr;
  159.         }
  160. m_cSpeakerSlider.SetPos (lVolume);
  161.     }
  162.     return S_OK;
  163. }
  164. HRESULT CAVDlg::ShowVideo(RTC_VIDEO_DEVICE enDevice, BOOL fShow)
  165. {
  166.     IVideoWindow * pVid = NULL;
  167.     long lMediaCaps = 0;
  168.     HWND hWnd = NULL;
  169.     HRESULT hr;
  170.     if (m_pParentClient == NULL)
  171. {
  172. return -1;
  173. }
  174.     hr = m_pParentClient->get_MediaCapabilities(&lMediaCaps);
  175.     if (FAILED(hr))
  176.     {
  177.         return hr;
  178.     }
  179. hr = m_pParentClient->get_IVideoWindow(enDevice, &pVid);
  180.     if (FAILED(hr))
  181.     {
  182.         return hr;
  183.     }
  184. if (enDevice == RTCVD_PREVIEW)
  185.     {          
  186.         fShow = fShow && (lMediaCaps & RTCMT_VIDEO_SEND);
  187.         m_fShowPrev = fShow;
  188.         hWnd = m_hPrevVideoParent;
  189.         ::ShowWindow(m_hPrevVideoParent, fShow ? SW_SHOW : SW_HIDE);
  190.         HRGN hRegion;
  191.         if (fShow)
  192.         {
  193.             POINT rgPoints[6] =
  194.                     { 0, 0,
  195.                       0, m_lRecvHeight,
  196.                       m_lRecvWidth - m_lPrevWidth, m_lRecvHeight,
  197.                       m_lRecvWidth - m_lPrevWidth, m_lRecvHeight - m_lPrevHeight,
  198.                       m_lRecvWidth, m_lRecvHeight - m_lPrevHeight,
  199.                       m_lRecvWidth, 0
  200.                     };
  201.             hRegion = CreatePolygonRgn(rgPoints, 6, ALTERNATE);
  202.         }
  203.         else
  204.         {
  205.             hRegion = CreateRectRgn(0, 0, m_lRecvWidth, m_lRecvHeight);
  206.         }
  207.         ::SetWindowRgn(m_hRecvVideoParent, hRegion, TRUE);
  208.     }
  209.     else
  210.     {
  211.         fShow = fShow && (lMediaCaps & RTCMT_VIDEO_RECEIVE);
  212.         m_fShowRecv = fShow;
  213.         hWnd = m_hRecvVideoParent;
  214.         ::ShowWindow(m_hRecvVideoParent, SW_SHOW);
  215.     }
  216.     if ( fShow == TRUE )
  217.     {
  218.         pVid->put_WindowStyle( WS_CHILD |
  219.                                WS_CLIPCHILDREN |
  220.                                WS_CLIPSIBLINGS );
  221.         
  222.         pVid->put_Owner( (OAHWND)hWnd );
  223.         RECT rc;
  224.         ::GetClientRect(hWnd, &rc );  
  225.         
  226.         pVid->SetWindowPosition(
  227.             rc.left,
  228.             rc.top,
  229.             rc.right,
  230.             rc.bottom
  231.             );
  232.         pVid->put_Visible(-1);        
  233.     }       
  234.     SAFE_RELEASE(pVid);    
  235.     return S_OK;
  236. }
  237. HRESULT CAVDlg::DeliverMedia(long lMediaType, RTC_MEDIA_EVENT_TYPE enType, 
  238.  RTC_MEDIA_EVENT_REASON enReason)
  239. {
  240.     RTC_VIDEO_DEVICE enVideo;
  241.     BOOL fShow;
  242.     HRESULT hr = S_OK;
  243.     
  244.     switch (lMediaType)
  245.     {
  246.     case RTCMT_VIDEO_SEND:
  247.         enVideo = RTCVD_PREVIEW;
  248.         break;
  249.     case RTCMT_VIDEO_RECEIVE:
  250.         enVideo = RTCVD_RECEIVE;
  251.         break;
  252.     case RTCMT_T120_SENDRECV:
  253. break;
  254. default:
  255.         return S_OK;
  256.     }
  257.     switch (enType) 
  258.     {
  259.     case RTCMET_STARTED:
  260.         fShow = TRUE;
  261.         break;
  262.     case RTCMET_STOPPED:
  263. ::ShowWindow(m_hRecvVideoParent, SW_HIDE);
  264. ::SetParent(m_hRecvVideoParent, NULL);
  265. ::ShowWindow(m_hPrevVideoParent, SW_HIDE);
  266. ::SetParent(m_hPrevVideoParent, NULL);
  267. SetState (RTCSS_IDLE);
  268. SAFE_RELEASE(m_pSession);
  269. DestroyWindow();
  270. return S_OK;
  271.     case RTCMET_FAILED:
  272.         fShow = FALSE;
  273.         break;
  274.     default:
  275.         return S_OK;
  276.     }
  277.     hr = ShowVideo(enVideo, fShow);
  278.     return hr;
  279. }
  280. HRESULT CAVDlg::DeliverIntensity(RTC_AUDIO_DEVICE enDevice, long lLevel)
  281. {
  282.     switch(enDevice)
  283.     {
  284.     case RTCAD_SPEAKER:
  285. m_cSpeakerLevel.SetPos (lLevel);
  286.         break;
  287.     case RTCAD_MICROPHONE:
  288. m_cMicLevel.SetPos (lLevel);
  289.         break;
  290.     }
  291.     return S_OK;
  292. }
  293. HRESULT CAVDlg::DeliverClient(RTC_CLIENT_EVENT_TYPE enEventType)
  294. {
  295.     switch(enEventType)
  296.     {
  297.     case RTCCET_VOLUME_CHANGE:
  298.         
  299.         ShowAudio();
  300.         break;
  301.     case RTCCET_DEVICE_CHANGE:
  302.       
  303.         ShowAudio();
  304.         ShowVideo(RTCVD_PREVIEW, m_fShowPrev);
  305.         ShowVideo(RTCVD_RECEIVE, m_fShowRecv);
  306.         break;
  307.     }
  308.     return S_OK;
  309. }
  310. BOOL CAVDlg::OnInitDialog() 
  311. {
  312. CDialog::OnInitDialog();
  313. int OFFSETX = 10;
  314. int OFFSETY = 50;
  315.     RECT rcWnd;
  316.     const int SIZE_EDGE = 5;
  317.     const int TEXT_HEIGHT = 16;
  318.     const int LEVEL_HEIGHT = 10;
  319.     const int VOL_HEIGHT = 20;   
  320.     ::GetClientRect(m_hWnd, &rcWnd);    
  321. m_pParentClient = NULL;
  322.     
  323.     float fAspectRatio = (float)QCIF_CY_SIZE/(float)QCIF_CX_SIZE;
  324.     m_lRecvWidth = rcWnd.right - rcWnd.left - 2*SIZE_EDGE;
  325.     m_lRecvHeight = (long)(fAspectRatio * (float)m_lRecvWidth);
  326.     m_lPrevWidth = QQCIF_CX_SIZE;
  327.     m_lPrevHeight = QQCIF_CY_SIZE;
  328.     RECT rcRecvVid;
  329.     rcRecvVid.left = rcWnd.left + SIZE_EDGE; 
  330.     rcRecvVid.right = rcWnd.left + m_lRecvWidth + SIZE_EDGE;
  331.     rcRecvVid.top = rcWnd.top + SIZE_EDGE;
  332.     rcRecvVid.bottom = rcWnd.top + m_lRecvHeight + SIZE_EDGE;
  333.     
  334.     RECT rcPrevVid;
  335.     rcPrevVid.left = rcRecvVid.right - m_lPrevWidth; 
  336.     rcPrevVid.right = rcRecvVid.right;
  337.     rcPrevVid.top = rcRecvVid.bottom - m_lPrevHeight;
  338.     rcPrevVid.bottom = rcRecvVid.bottom;         
  339. m_hRecvVideoParent = NULL;
  340. m_hPrevVideoParent = NULL;
  341. m_cSpeakerSlider.SetRangeMax (0xffff);
  342. m_cMicSlider.SetRangeMax (0xffff);
  343.     if (m_hRecvVideoParent == NULL)
  344.     {
  345.         m_hRecvVideoParent = CreateWindowExW(
  346.             WS_EX_CLIENTEDGE,
  347.             L"STATIC",
  348.             NULL,
  349.             WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  350. rcRecvVid.left, rcRecvVid.top,
  351. m_lRecvWidth, m_lRecvHeight,
  352.             m_hWnd,
  353.             NULL,
  354.             GetModuleHandle(NULL),
  355.             NULL);
  356.     
  357.         if ( !m_hRecvVideoParent )
  358.         {
  359.             return -1;
  360.         }
  361.     }
  362.     else
  363.     {
  364.         if (!::SetParent(m_hRecvVideoParent, m_hWnd))
  365.         {
  366.             // SetParent failed
  367.             return -1;
  368.         }
  369.     }
  370. if (m_hPrevVideoParent == NULL)
  371.     {
  372.         m_hPrevVideoParent = CreateWindowExW(
  373.             WS_EX_CLIENTEDGE,
  374.             L"STATIC",
  375.             NULL,
  376.             WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  377. rcPrevVid.left, rcPrevVid.top,
  378. m_lPrevWidth, m_lPrevHeight,
  379.             m_hWnd,
  380.             NULL,
  381.             GetModuleHandle(NULL),
  382.             NULL);
  383.     
  384.         if ( !m_hPrevVideoParent )
  385.         {
  386.             return -1;
  387.         }
  388.     }
  389.     else
  390.     {
  391.         if (!::SetParent(m_hPrevVideoParent, m_hWnd))
  392.         {
  393.             return -1;
  394.         }
  395.     }
  396. return TRUE;  
  397. }
  398. void CAVDlg::SetSession(IRTCSession *pSession)
  399. {
  400. m_pSession = pSession;
  401. }
  402. void CAVDlg::SetState(RTC_SESSION_STATE enState)
  403. {
  404. m_rtcState = enState;
  405. }
  406. RTC_SESSION_STATE CAVDlg::GetState()
  407. {
  408. return m_rtcState;
  409. }