Mixer.cpp
上传用户:panstart
上传日期:2022-04-12
资源大小:199k
文件大小:4k
源码类别:

IP电话/视频会议

开发平台:

C++ Builder

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. //    Project     : VideoNet version 1.1.
  5. //    Description : Peer to Peer Video Conferencing over the LAN.
  6. //   Author      : Nagareshwar Y Talekar ( nsry2002@yahoo.co.in)
  7. //    Date        : 15-6-2004.
  8. //
  9. //
  10. //    File description : 
  11. //    Name    : Mixer.cpp
  12. //    Details : Mixer functions for controling volume
  13. //
  14. //
  15. /////////////////////////////////////////////////////////////////////////////
  16. #include "stdafx.h"
  17. #include "VideoNet.h"
  18. #include "Mixer.h"
  19. #include <mmsystem.h>
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char THIS_FILE[]=__FILE__;
  23. #define new DEBUG_NEW
  24. #endif
  25. //////////////////////////////////////////////////////////////////////
  26. // Construction/Destruction
  27. //////////////////////////////////////////////////////////////////////
  28. CMixer::CMixer(DWORD ComponentType, DestKind dkKind,int & min,int & max)
  29. {
  30. HMIXER hMixer;
  31. HRESULT hr;
  32. hr = mixerOpen(&hMixer, 0, 0, 0, 0);
  33. if (hr!= MMSYSERR_NOERROR) 
  34. return;
  35.  m_dwControlID=-1;
  36.  m_bOK=FALSE;
  37.  m_dwChannels=1;
  38.  
  39. MIXERLINE mxl;
  40. MIXERCONTROL mxc;
  41. MIXERLINECONTROLS mxlc;
  42. DWORD kind, count;
  43. if (dkKind == Play)
  44. kind = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  45. else 
  46. kind = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
  47. mxl.cbStruct = sizeof(mxl);
  48. mxl.dwComponentType = kind;
  49.     hr = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE |MIXER_OBJECTF_HMIXER);
  50. if (hr!= MMSYSERR_NOERROR)
  51. {
  52. mixerClose(hMixer);
  53. return;
  54. }
  55. count = mxl.dwSource;
  56. /*
  57. if(count==-1)
  58. {
  59. AfxMessageBox("There are no source lines for this destination line");
  60. return;
  61. }
  62. */
  63. // get dwControlID
  64. if(dkKind == Play)
  65. {
  66. mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
  67. mxlc.dwLineID = mxl.dwLineID;
  68. mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
  69. mxlc.cControls = 1;
  70. mxlc.cbmxctrl = sizeof(MIXERCONTROL);
  71. mxlc.pamxctrl = &mxc;
  72. if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(hMixer),
  73.    &mxlc,
  74.    MIXER_OBJECTF_HMIXER |
  75.    MIXER_GETLINECONTROLSF_ONEBYTYPE)
  76. != MMSYSERR_NOERROR)
  77. {
  78. return ;
  79. }
  80.     m_dwChannels = 1;
  81. m_dwControlID = mxc.dwControlID;
  82. min=mxc.Bounds.dwMinimum;
  83. max=mxc.Bounds.dwMaximum;
  84. }
  85. else
  86. {
  87. for(UINT i = 0; i < count; i++)
  88. {
  89. mxl.dwSource = i;
  90. mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_SOURCE | MIXER_OBJECTF_HMIXER);
  91. if (mxl.dwComponentType == ComponentType)
  92. {
  93. m_dwChannels = mxl.cChannels;
  94. mxc.cbStruct = sizeof(mxc);
  95. mxlc.cbStruct = sizeof(mxlc);
  96. mxlc.dwLineID = mxl.dwLineID;
  97. mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
  98. mxlc.cControls = 1;
  99. mxlc.cbmxctrl = sizeof(MIXERCONTROL);
  100. mxlc.pamxctrl = &mxc;
  101. hr = mixerGetLineControls((HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER);
  102. m_dwControlID = mxc.dwControlID;
  103. min=mxc.Bounds.dwMinimum;
  104. max=mxc.Bounds.dwMaximum;
  105. break;
  106. };
  107. }
  108. }
  109. m_bOK=TRUE;
  110. mixerClose(hMixer);
  111. }
  112. void CMixer::SetVolume(DWORD dwVol)
  113. {
  114. if (!m_bOK) return;
  115. HMIXER hMixer;
  116. HRESULT hr;
  117. hr = mixerOpen(&hMixer, 0, 0, 0, 0);
  118. if (hr!= MMSYSERR_NOERROR)
  119. return;
  120. MIXERCONTROLDETAILS mxcd;
  121. MIXERCONTROLDETAILS_UNSIGNED mxdu;
  122. mxdu.dwValue = dwVol;
  123. mxcd.cMultipleItems = 0;       /********Modified code ******/
  124. mxcd.cChannels = m_dwChannels;
  125. mxcd.cbStruct = sizeof(mxcd);
  126. mxcd.dwControlID = m_dwControlID;
  127. mxcd.cbDetails = sizeof(mxdu);
  128. mxcd.paDetails = &mxdu;
  129. hr = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);
  130. mixerClose(hMixer);
  131. }
  132. DWORD CMixer::GetVolume()
  133. {
  134. if (!m_bOK) return 0;
  135. HMIXER hMixer;
  136. HRESULT hr;
  137. hr = mixerOpen(&hMixer, 0, 0, 0, 0);
  138. if (FAILED(hr)) return 0;
  139. MIXERCONTROLDETAILS mxcd;
  140. MIXERCONTROLDETAILS_UNSIGNED mxdu;
  141. mxcd.cMultipleItems = 0;  
  142. mxcd.cChannels = m_dwChannels;
  143. mxcd.cbStruct = sizeof(mxcd);
  144. mxcd.dwControlID = m_dwControlID;
  145. mxcd.cbDetails = sizeof(mxdu);
  146. mxcd.paDetails = &mxdu;
  147. hr = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);
  148. mixerClose(hMixer);
  149. return mxdu.dwValue;
  150. }