| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- {
- 文件名:RealICQMasterVolumeControl.pas
- 功 能:主输出音量调整控件
- 建 立:尹进
- 历 史:
- 2006.04.10:创建文件(尹进)
- }
- unit RealICQMasterVolumeControl;
- interface
- uses
- MMSystem,
- AMixer,
- Windows,
- SysUtils, Forms, Classes, Controls, ExtCtrls, Graphics, RealICQTrackBar;
- type
- TRealICQMasterVolumeControl = class(TRealICQTrackBar)
- private
- FAudioMixer: TAudioMixer;
- procedure ValueChange(Sender:TObject);
- procedure MixerChange(Sender:TObject; MixerH: HMixer; ID: Integer);
-
- function GetCopyRight: String;
- protected
- { Protected declarations }
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure ChangeUIColor(AColor: TColor); override;
- published
- property CopyRight: String read GetCopyRight;
- property Visible;
- end;
- procedure Register;
- implementation
- //获取音量
- function GetMasterVolumeValue: Word;
- var
- hMix: HMIXER;
- mxlc: MIXERLINECONTROLS;
- mxcd: TMIXERCONTROLDETAILS;
- vol: TMIXERCONTROLDETAILS_UNSIGNED;
- mxc: MIXERCONTROL;
- mxl: TMixerLine;
- intRet: Integer;
- nMixerDevs: Integer;
- begin
- Result := 0;
- // Check if Mixer is available
- nMixerDevs := mixerGetNumDevs();
- if (nMixerDevs < 1) then
- begin
- Result := 0;
- Exit;
- end;
- // open the mixer
- intRet := mixerOpen(@hMix, 0, 0, 0, 0);
- if intRet = MMSYSERR_NOERROR then
- begin
- mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
- mxl.cbStruct := SizeOf(mxl);
- // get line info
- intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
- if intRet = MMSYSERR_NOERROR then
- begin
- FillChar(mxlc, SizeOf(mxlc),0);
- mxlc.cbStruct := SizeOf(mxlc);
- mxlc.dwLineID := mxl.dwLineID;
- mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
- mxlc.cControls := 1;
- mxlc.cbmxctrl := SizeOf(mxc);
- mxlc.pamxctrl := @mxc;
- intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
- if intRet = MMSYSERR_NOERROR then
- begin
- FillChar(mxcd, SizeOf(mxcd),0);
- mxcd.dwControlID := mxc.dwControlID;
- mxcd.cbStruct := SizeOf(mxcd);
- mxcd.cMultipleItems := 0;
- mxcd.cbDetails := SizeOf(Vol);
- mxcd.paDetails := @vol;
- mxcd.cChannels := 1;
- intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
- Result := vol.dwValue ;
- if intRet <> MMSYSERR_NOERROR then
- raise Exception.Create('GetControlDetails Error');
- end
- else
- raise Exception.Create('GetLineInfo Error');
- end;
- mixerClose(hMix);
- end;
- end;
- //设置音量
- procedure SetMasterVolumeValue(Value: Word);
- var
- hMix: HMIXER;
- mxlc: MIXERLINECONTROLS;
- mxcd: TMIXERCONTROLDETAILS;
- vol: TMIXERCONTROLDETAILS_UNSIGNED;
- mxc: MIXERCONTROL;
- mxl: TMixerLine;
- intRet: Integer;
- nMixerDevs: Integer;
- begin
- // Check if Mixer is available
- nMixerDevs := mixerGetNumDevs();
- if (nMixerDevs < 1) then
- begin
- Exit;
- end;
- // open the mixer
- intRet := mixerOpen(@hMix, 0, 0, 0, 0);
- if intRet = MMSYSERR_NOERROR then
- begin
- mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
- mxl.cbStruct := SizeOf(mxl);
- // get line info
- intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
- if intRet = MMSYSERR_NOERROR then
- begin
- FillChar(mxlc, SizeOf(mxlc),0);
- mxlc.cbStruct := SizeOf(mxlc);
- mxlc.dwLineID := mxl.dwLineID;
- mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
- mxlc.cControls := 1;
- mxlc.cbmxctrl := SizeOf(mxc);
- mxlc.pamxctrl := @mxc;
- intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
- if intRet = MMSYSERR_NOERROR then
- begin
- FillChar(mxcd, SizeOf(mxcd),0);
- mxcd.dwControlID := mxc.dwControlID;
- mxcd.cbStruct := SizeOf(mxcd);
- mxcd.cMultipleItems := 0;
- mxcd.cbDetails := SizeOf(Vol);
- mxcd.paDetails := @vol;
- mxcd.cChannels := 1;
- vol.dwValue := Value;
- intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
- if intRet <> MMSYSERR_NOERROR then
- raise Exception.Create('SetControlDetails Error');
- end
- else
- raise Exception.Create('GetLineInfo Error');
- end;
- mixerClose(hMix);
- end;
- end;
- //------------------------------------------------------------------------------
- function TRealICQMasterVolumeControl.GetCopyRight: String;
- begin
- Result := '版权所有(C) 2002-2016 浙江万赛软件科技有限公司 保留所有权利。';
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQMasterVolumeControl.ValueChange(Sender:TObject);
- begin
- try
- SetMasterVolumeValue(Value);
- except
- OnChanged := nil;
- Value := 0;
- OnChanged := ValueChange;
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQMasterVolumeControl.MixerChange(Sender:TObject;MixerH:HMixer;ID:Integer);
- begin
- OnChanged := nil;
- try
- Value := GetMasterVolumeValue;
- finally
- OnChanged := ValueChange;
- end;
- end;
- //------------------------------------------------------------------------------
- constructor TRealICQMasterVolumeControl.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
-
- try
- FAudioMixer := TAudioMixer.Create(Self);
- Value := GetMasterVolumeValue;
- OnChanged := ValueChange;
- FAudioMixer.OnControlChange := MixerChange;
- except
- Enabled := False;
- end;
- end;
- //------------------------------------------------------------------------------
- destructor TRealICQMasterVolumeControl.Destroy;
- begin
- try
- FreeAndNil(FAudioMixer);
- except
- end;
- inherited Destroy;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQMasterVolumeControl.ChangeUIColor(AColor: TColor);
- begin
- inherited;
- end;
- procedure Register;
- begin
- RegisterComponents('RealICQ UI', [TRealICQMasterVolumeControl]);
- end;
- end.
|