{ 文件名:RealICQMicrophoneVolumeControl.pas 功 能:麦克风音量调整控件 建 立:尹进 历 史: 2006.04.10:创建文件(尹进) } unit RealICQMicrophoneVolumeControl; interface uses MMSystem, AMixer, Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, RealICQTrackBar; type TRealICQMicrophoneVolumeControl = class(TRealICQTrackBar) private FAudioMixer: TAudioMixer; FInDeviceID, FInChannelID, FConnectionID: Integer; FMute: Integer; function InitInDeviceID: Boolean; procedure GetMicrophoneValue; 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; end; procedure Register; implementation //------------------------------------------------------------------------------ function TRealICQMicrophoneVolumeControl.GetCopyRight: string; begin Result := '版权所有(C) 2002-2016 浙江万赛软件科技有限公司 保留所有权利。'; end; //------------------------------------------------------------------------------ function TRealICQMicrophoneVolumeControl.InitInDeviceID: Boolean; var iLoop: Integer; szName: string; begin FInDeviceID := -1; FInChannelID := -1; FConnectionID := -1; //查找录音设备的Mixer if FAudioMixer.Destinations = nil then begin Result := False; Exit; end; for iLoop := 0 to FAudioMixer.Destinations.Count - 1 do if FAudioMixer.Destinations[iLoop].Data.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN then begin FInDeviceID := iLoop; Break; end; if FInDeviceID > -1 then for iLoop := 0 to FAudioMixer.Destinations[FInDeviceID].Connections.Count - 1 do begin szName := FAudioMixer.Destinations[FInDeviceID].Connections.Connection[iLoop].Data.szName; if AnsiSameText(szName, '麦克风') or AnsiSameText(szName, 'MICROPHONE') then FConnectionID := iLoop; end; Result := True; end; //------------------------------------------------------------------------------ procedure TRealICQMicrophoneVolumeControl.ValueChange(Sender: TObject); begin try FAudioMixer.SetVolume(FInDeviceID, FConnectionID, Value, Value, FMute); except OnChanged := nil; Value := 0; OnChanged := ValueChange; end; end; //------------------------------------------------------------------------------ procedure TRealICQMicrophoneVolumeControl.MixerChange(Sender: TObject; MixerH: HMixer; ID: Integer); begin GetMicrophoneValue; end; //------------------------------------------------------------------------------ procedure TRealICQMicrophoneVolumeControl.GetMicrophoneValue; var L, R: Integer; Stereo: Boolean; IsSelect: Boolean; begin try if FInDeviceID = -1 then Exit; FAudioMixer.GetVolume(FInDeviceID, FConnectionID, L, R, FMute, Stereo, IsSelect); except OnChanged := nil; Value := 0; OnChanged := ValueChange; end; FAudioMixer.OnControlChange := MixerChange; OnChanged := nil; if L >= 0 then Value := L; if R >= 0 then Value := (Value + R) div 2; OnChanged := ValueChange; end; //------------------------------------------------------------------------------ constructor TRealICQMicrophoneVolumeControl.Create(AOwner: TComponent); begin inherited Create(AOwner); try FAudioMixer := TAudioMixer.Create(Self); InitInDeviceID; GetMicrophoneValue; except Enabled := False; end; end; //------------------------------------------------------------------------------ destructor TRealICQMicrophoneVolumeControl.Destroy; begin try FreeAndNil(FAudioMixer); except end; inherited Destroy; end; //------------------------------------------------------------------------------ procedure TRealICQMicrophoneVolumeControl.ChangeUIColor(AColor: TColor); begin inherited; end; procedure Register; begin RegisterComponents('RealICQ UI', [TRealICQMicrophoneVolumeControl]); end; end.