RealICQMasterVolumeControl.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. {
  2. 文件名:RealICQMasterVolumeControl.pas
  3. 功 能:主输出音量调整控件
  4. 建 立:尹进
  5. 历 史:
  6. 2006.04.10:创建文件(尹进)
  7. }
  8. unit RealICQMasterVolumeControl;
  9. interface
  10. uses
  11. MMSystem,
  12. AMixer,
  13. Windows,
  14. SysUtils, Forms, Classes, Controls, ExtCtrls, Graphics, RealICQTrackBar;
  15. type
  16. TRealICQMasterVolumeControl = class(TRealICQTrackBar)
  17. private
  18. FAudioMixer: TAudioMixer;
  19. procedure ValueChange(Sender:TObject);
  20. procedure MixerChange(Sender:TObject; MixerH: HMixer; ID: Integer);
  21. function GetCopyRight: String;
  22. protected
  23. { Protected declarations }
  24. public
  25. constructor Create(AOwner: TComponent); override;
  26. destructor Destroy; override;
  27. procedure ChangeUIColor(AColor: TColor); override;
  28. published
  29. property CopyRight: String read GetCopyRight;
  30. property Visible;
  31. end;
  32. procedure Register;
  33. implementation
  34. //获取音量
  35. function GetMasterVolumeValue: Word;
  36. var
  37. hMix: HMIXER;
  38. mxlc: MIXERLINECONTROLS;
  39. mxcd: TMIXERCONTROLDETAILS;
  40. vol: TMIXERCONTROLDETAILS_UNSIGNED;
  41. mxc: MIXERCONTROL;
  42. mxl: TMixerLine;
  43. intRet: Integer;
  44. nMixerDevs: Integer;
  45. begin
  46. Result := 0;
  47. // Check if Mixer is available
  48. nMixerDevs := mixerGetNumDevs();
  49. if (nMixerDevs < 1) then
  50. begin
  51. Result := 0;
  52. Exit;
  53. end;
  54. // open the mixer
  55. intRet := mixerOpen(@hMix, 0, 0, 0, 0);
  56. if intRet = MMSYSERR_NOERROR then
  57. begin
  58. mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  59. mxl.cbStruct := SizeOf(mxl);
  60. // get line info
  61. intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
  62. if intRet = MMSYSERR_NOERROR then
  63. begin
  64. FillChar(mxlc, SizeOf(mxlc),0);
  65. mxlc.cbStruct := SizeOf(mxlc);
  66. mxlc.dwLineID := mxl.dwLineID;
  67. mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
  68. mxlc.cControls := 1;
  69. mxlc.cbmxctrl := SizeOf(mxc);
  70. mxlc.pamxctrl := @mxc;
  71. intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
  72. if intRet = MMSYSERR_NOERROR then
  73. begin
  74. FillChar(mxcd, SizeOf(mxcd),0);
  75. mxcd.dwControlID := mxc.dwControlID;
  76. mxcd.cbStruct := SizeOf(mxcd);
  77. mxcd.cMultipleItems := 0;
  78. mxcd.cbDetails := SizeOf(Vol);
  79. mxcd.paDetails := @vol;
  80. mxcd.cChannels := 1;
  81. intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
  82. Result := vol.dwValue ;
  83. if intRet <> MMSYSERR_NOERROR then
  84. raise Exception.Create('GetControlDetails Error');
  85. end
  86. else
  87. raise Exception.Create('GetLineInfo Error');
  88. end;
  89. mixerClose(hMix);
  90. end;
  91. end;
  92. //设置音量
  93. procedure SetMasterVolumeValue(Value: Word);
  94. var
  95. hMix: HMIXER;
  96. mxlc: MIXERLINECONTROLS;
  97. mxcd: TMIXERCONTROLDETAILS;
  98. vol: TMIXERCONTROLDETAILS_UNSIGNED;
  99. mxc: MIXERCONTROL;
  100. mxl: TMixerLine;
  101. intRet: Integer;
  102. nMixerDevs: Integer;
  103. begin
  104. // Check if Mixer is available
  105. nMixerDevs := mixerGetNumDevs();
  106. if (nMixerDevs < 1) then
  107. begin
  108. Exit;
  109. end;
  110. // open the mixer
  111. intRet := mixerOpen(@hMix, 0, 0, 0, 0);
  112. if intRet = MMSYSERR_NOERROR then
  113. begin
  114. mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  115. mxl.cbStruct := SizeOf(mxl);
  116. // get line info
  117. intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
  118. if intRet = MMSYSERR_NOERROR then
  119. begin
  120. FillChar(mxlc, SizeOf(mxlc),0);
  121. mxlc.cbStruct := SizeOf(mxlc);
  122. mxlc.dwLineID := mxl.dwLineID;
  123. mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
  124. mxlc.cControls := 1;
  125. mxlc.cbmxctrl := SizeOf(mxc);
  126. mxlc.pamxctrl := @mxc;
  127. intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
  128. if intRet = MMSYSERR_NOERROR then
  129. begin
  130. FillChar(mxcd, SizeOf(mxcd),0);
  131. mxcd.dwControlID := mxc.dwControlID;
  132. mxcd.cbStruct := SizeOf(mxcd);
  133. mxcd.cMultipleItems := 0;
  134. mxcd.cbDetails := SizeOf(Vol);
  135. mxcd.paDetails := @vol;
  136. mxcd.cChannels := 1;
  137. vol.dwValue := Value;
  138. intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
  139. if intRet <> MMSYSERR_NOERROR then
  140. raise Exception.Create('SetControlDetails Error');
  141. end
  142. else
  143. raise Exception.Create('GetLineInfo Error');
  144. end;
  145. mixerClose(hMix);
  146. end;
  147. end;
  148. //------------------------------------------------------------------------------
  149. function TRealICQMasterVolumeControl.GetCopyRight: String;
  150. begin
  151. Result := '版权所有(C) 2002-2016 浙江万赛软件科技有限公司 保留所有权利。';
  152. end;
  153. //------------------------------------------------------------------------------
  154. procedure TRealICQMasterVolumeControl.ValueChange(Sender:TObject);
  155. begin
  156. try
  157. SetMasterVolumeValue(Value);
  158. except
  159. OnChanged := nil;
  160. Value := 0;
  161. OnChanged := ValueChange;
  162. end;
  163. end;
  164. //------------------------------------------------------------------------------
  165. procedure TRealICQMasterVolumeControl.MixerChange(Sender:TObject;MixerH:HMixer;ID:Integer);
  166. begin
  167. OnChanged := nil;
  168. try
  169. Value := GetMasterVolumeValue;
  170. finally
  171. OnChanged := ValueChange;
  172. end;
  173. end;
  174. //------------------------------------------------------------------------------
  175. constructor TRealICQMasterVolumeControl.Create(AOwner: TComponent);
  176. begin
  177. inherited Create(AOwner);
  178. try
  179. FAudioMixer := TAudioMixer.Create(Self);
  180. Value := GetMasterVolumeValue;
  181. OnChanged := ValueChange;
  182. FAudioMixer.OnControlChange := MixerChange;
  183. except
  184. Enabled := False;
  185. end;
  186. end;
  187. //------------------------------------------------------------------------------
  188. destructor TRealICQMasterVolumeControl.Destroy;
  189. begin
  190. try
  191. FreeAndNil(FAudioMixer);
  192. except
  193. end;
  194. inherited Destroy;
  195. end;
  196. //------------------------------------------------------------------------------
  197. procedure TRealICQMasterVolumeControl.ChangeUIColor(AColor: TColor);
  198. begin
  199. inherited;
  200. end;
  201. procedure Register;
  202. begin
  203. RegisterComponents('RealICQ UI', [TRealICQMasterVolumeControl]);
  204. end;
  205. end.