AlexfMixer.cpp
上传用户:egonliao
上传日期:2007-01-03
资源大小:3k
文件大小:5k
源码类别:

Audio

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // AlexfMixer.cpp: implementation of the CAlexfMixer class.
  3. // CAlexfMixer - simple mixer control wrapper
  4. // Copyright (C) Alexander Fedorov 1999
  5. // You may do whatever you want with this code, as long as you include this
  6. // copyright notice in your implementation files.
  7. // If you wish to add new classes to this collection, feel free to do so.
  8. // But please send me your code so that I can update the collection.
  9. // Comments and bug reports: lamer2000@usa.net
  10. //////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include "AlexfMixer.h"
  13. #ifdef _DEBUG
  14. #undef THIS_FILE
  15. static char THIS_FILE[]=__FILE__;
  16. #define new DEBUG_NEW
  17. #endif
  18. //////////////////////////////////////////////////////////////////////
  19. // Construction/Destruction
  20. //////////////////////////////////////////////////////////////////////
  21. void CAlexfMixer::ZeroAll()
  22. {
  23. m_HMixer = NULL;
  24. m_iMixerControlID = 0;
  25. mmr = MMSYSERR_NOERROR;
  26. m_dwChannels = 0;
  27. m_bSuccess = FALSE;
  28. }
  29. CAlexfMixer::CAlexfMixer(DWORD DstType, DWORD SrcType, DWORD ControlType)
  30. {
  31. ZeroAll();
  32. if(mixerGetNumDevs() < 1) return;
  33. mmr = mixerOpen(&m_HMixer, 0, 0, 0L, CALLBACK_NULL);
  34. if (mmr != MMSYSERR_NOERROR) return;
  35. // get dwLineID
  36. MIXERLINE mxl;
  37. mxl.cbStruct = sizeof(MIXERLINE);
  38. // DstType
  39. mxl.dwComponentType = DstType;
  40. if (mixerGetLineInfo((HMIXEROBJ)m_HMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)
  41. != MMSYSERR_NOERROR) return;
  42. // SrcType
  43. if( SrcType != NO_SOURCE )
  44. {
  45. UINT nconn = mxl.cConnections;
  46. DWORD DstIndex = mxl.dwDestination;
  47. for( UINT j = 0; j < nconn; j++ )
  48. {
  49. mxl.cbStruct = sizeof( MIXERLINE );
  50. mxl.dwSource = j;
  51. mxl.dwDestination = DstIndex;
  52. if(mixerGetLineInfo( ( HMIXEROBJ )m_HMixer,
  53. &mxl, MIXER_GETLINEINFOF_SOURCE ) != MMSYSERR_NOERROR) return;
  54. if( mxl.dwComponentType == SrcType ) break;
  55. }
  56. }
  57. // get dwControlID
  58. MIXERCONTROL mxc;
  59. MIXERLINECONTROLS mxlc;
  60. mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
  61. mxlc.dwLineID = mxl.dwLineID;
  62. mxlc.dwControlType = ControlType;
  63. mxlc.cControls = 1;
  64. mxlc.cbmxctrl = sizeof(MIXERCONTROL);
  65. mxlc.pamxctrl = &mxc;
  66. if (mixerGetLineControls((HMIXEROBJ)m_HMixer, &mxlc, MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR) return;
  67. m_iMixerControlID = mxc.dwControlID;
  68. m_dwChannels = mxl.cChannels;
  69. m_bSuccess = TRUE;
  70. }
  71. CAlexfMixer::CAlexfMixer(HWND hwnd, DWORD DstType, DWORD SrcType, DWORD ControlType)
  72. {
  73. ZeroAll();
  74. if(mixerGetNumDevs() < 1) return;
  75. mmr = mixerOpen(&m_HMixer, 0, (DWORD)hwnd, 0L, CALLBACK_WINDOW);
  76. if (mmr != MMSYSERR_NOERROR) return;
  77. // get dwLineID
  78. MIXERLINE mxl;
  79. mxl.cbStruct = sizeof(MIXERLINE);
  80. // DstType
  81. mxl.dwComponentType = DstType;
  82. if (mixerGetLineInfo((HMIXEROBJ)m_HMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)
  83. != MMSYSERR_NOERROR) return;
  84. // SrcType
  85. if( SrcType != NO_SOURCE )
  86. {
  87. UINT nconn = mxl.cConnections;
  88. DWORD DstIndex = mxl.dwDestination;
  89. for( UINT j = 0; j < nconn; j++ )
  90. {
  91. mxl.cbStruct = sizeof( MIXERLINE );
  92. mxl.dwSource = j;
  93. mxl.dwDestination = DstIndex;
  94. if(mixerGetLineInfo( ( HMIXEROBJ )m_HMixer,
  95. &mxl, MIXER_GETLINEINFOF_SOURCE ) != MMSYSERR_NOERROR) return;
  96. if( mxl.dwComponentType == SrcType ) break;
  97. }
  98. }
  99. // get dwControlID
  100. MIXERCONTROL mxc;
  101. MIXERLINECONTROLS mxlc;
  102. mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
  103. mxlc.dwLineID = mxl.dwLineID;
  104. mxlc.dwControlType = ControlType;
  105. mxlc.cControls = 1;
  106. mxlc.cbmxctrl = sizeof(MIXERCONTROL);
  107. mxlc.pamxctrl = &mxc;
  108. if (mixerGetLineControls((HMIXEROBJ)m_HMixer, &mxlc, MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR) return;
  109. m_iMixerControlID = mxc.dwControlID;
  110. m_bSuccess = TRUE;
  111. }
  112. CAlexfMixer::~CAlexfMixer()
  113. {
  114. if (m_HMixer) mixerClose(m_HMixer);
  115. }
  116. ////////////////////////////////////////
  117. DWORD CAlexfMixer::GetControlValue()
  118. {
  119. if (!m_bSuccess) return 0;
  120. m_bSuccess = FALSE;
  121. MIXERCONTROLDETAILS mxcd;
  122. MIXERCONTROLDETAILS_UNSIGNED mxcd_u;
  123. mxcd.cbStruct = sizeof(mxcd);
  124. mxcd.dwControlID = m_iMixerControlID;
  125. mxcd.cChannels = m_dwChannels;
  126. mxcd.cMultipleItems = 0;
  127. mxcd.cbDetails = sizeof(mxcd_u);
  128. mxcd.paDetails = &mxcd_u;
  129. mmr = mixerGetControlDetails((HMIXEROBJ)m_HMixer, &mxcd, 0L);
  130. if (MMSYSERR_NOERROR != mmr) return 0;
  131. m_bSuccess = TRUE;
  132. return mxcd_u.dwValue;
  133. }
  134. BOOL CAlexfMixer::SetControlValue(DWORD dw)
  135. {
  136. if (!m_bSuccess) return m_bSuccess;
  137. m_bSuccess = FALSE;
  138. MIXERCONTROLDETAILS mxcd;
  139. MIXERCONTROLDETAILS_UNSIGNED mxcd_u;
  140. mxcd.cbStruct = sizeof(mxcd);
  141. mxcd.dwControlID = m_iMixerControlID;
  142. mxcd.cChannels = m_dwChannels;
  143. mxcd.cMultipleItems = 0;
  144. mxcd.cbDetails = sizeof(mxcd_u);
  145. mxcd.paDetails = &mxcd_u;
  146. mmr = mixerGetControlDetails((HMIXEROBJ)m_HMixer, &mxcd, 0L);
  147. if (MMSYSERR_NOERROR != mmr) return m_bSuccess;
  148. mxcd_u.dwValue  = dw;
  149. mmr = mixerSetControlDetails((HMIXEROBJ)m_HMixer, &mxcd, 0L);
  150. if (MMSYSERR_NOERROR != mmr) return m_bSuccess;
  151. m_bSuccess = TRUE;
  152. return m_bSuccess;
  153. }
  154. BOOL CAlexfMixer::On()
  155. {
  156. return SetControlValue(0);
  157. }
  158. BOOL CAlexfMixer::Off()
  159. {
  160. return SetControlValue(1);
  161. }