{相关结构:} TDSFXParamEq = packed record fCenter: Single; // 80 .. 16000 : 8000.0 (Hz) fBand Single; // 1 .. 36 : 12.0 fGain: Single; //-15 .. 15 : 0.0 end; //该结构相关常量: DSFXPARAMEQ_CENTER_MIN = 80.0; DSFXPARAMEQ_CENTER_MAX = 16000.0; DSFXPARAMEQ_BANDWIDTH_MIN = 1.0; DSFXPARAMEQ_BANDWIDTH_MAX = 36.0; DSFXPARAMEQ_GAIN_MIN = -15.0; DSFXPARAMEQ_GAIN_MAX = 15.0;
测试代码:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; LabeledEdit1: TLabeledEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure LabeledEdit1Change(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses DirectSound, ReadWave2; //ReadWave2 是前面(9)自定义的单元 var myDSound: IDirectSound8; buf8: IDirectSoundBuffer8; fxParamEqs: array[0..5] of IDirectSoundFXParamEq8; //IDirectSoundFXParamEq8 效果器数组 arrTrack: array[0..5] of TTrackBar; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin System.ReportMemoryLeaksOnShutdown := True; DirectSoundCreate8(nil, myDSound, nil); myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL); Button1.Caption := '打开并播放'; Button2.Caption := '停止播放'; for i := 5 downto 0 do begin arrTrack[i] := TTrackBar.Create(Self); arrTrack[i].Parent := Self; arrTrack[i].Orientation := trVertical; arrTrack[i].ShowSelRange := False; arrTrack[i].TickStyle := tsNone; arrTrack[i].Width := 32; arrTrack[i].Align := alRight; arrTrack[i].Tag := i; arrTrack[i].Min := -15; arrTrack[i].Max := 15; arrTrack[i].Position := 0; arrTrack[i].OnChange := LabeledEdit1.OnChange; end; LabeledEdit1.EditLabel.Caption := 'fBand'; LabeledEdit1.Text := '12.0'; end; procedure TForm1.Button1Click(Sender: TObject); var buf: IDirectSoundBuffer; bufDesc: TDSBufferDesc; rEffect: TDSEffectDesc; wav: TReadWave; p1: Pointer; n1: DWORD; i: Integer; begin wav := TReadWave.Create; if not wav.OpenDialog then begin wav.Free; Exit; end; ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc)); bufDesc.dwSize := SizeOf(TDSBufferDesc); bufDesc.dwFlags := DSBCAPS_CTRLFX; bufDesc.dwBufferBytes := wav.Size; bufDesc.lpwfxFormat := @wav.Format; myDSound.CreateSoundBuffer(bufDesc, buf, nil); buf.QueryInterface(IID_IDirectSoundBuffer8, buf8); buf8.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER); wav.Read(p1, n1); wav.Free; buf8.Unlock(p1, n1, nil, 0); ZeroMemory(@rEffect, SizeOf(TDSEffectDesc)); rEffect.dwSize := SizeOf(TDSEffectDesc); rEffect.dwFlags := 0; rEffect.guidDSFXClass := GUID_DSFX_STANDARD_PARAMEQ; for i := 0 to 5 do begin buf8.SetFX(1, @rEffect, nil); buf8.GetObjectInPath(GUID_DSFX_STANDARD_PARAMEQ, 0, IID_IDirectSoundFXParamEq8, fxParamEqs[i]); end; buf8.Play(0, 0, DSBPLAY_LOOPING); end; procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(buf8) then buf8.Stop; end; procedure TForm1.LabeledEdit1Change(Sender: TObject); var rParamEqs: TDSFXParamEq; i: Integer; f: Single; begin if buf8 = nil then Exit; if Sender.ClassNameIs('TLabeledEdit') then begin f := StrToFloatDef(LabeledEdit1.Text, MaxInt); if (f < 1) or (f > 36) then LabeledEdit1.Text := '12.0'; for i := 0 to 5 do arrTrack[i].OnChange(arrTrack[i]); end; rParamEqs.fBandwidth := StrToFloat(LabeledEdit1.Text); i := TTrackBar(Sender).Tag; case i of 0: rParamEqs.fCenter := 100; 1: rParamEqs.fCenter := 2000; 2: rParamEqs.fCenter := 4000; 3: rParamEqs.fCenter := 8000; 4: rParamEqs.fCenter := 10000; 5: rParamEqs.fCenter := 12000; end; rParamEqs.fGain := - TTrackBar(Sender).Position; fxParamEqs[i].SetAllParameters(rParamEqs); end; procedure TForm1.FormDestroy(Sender: TObject); begin buf8 := nil; myDSound := nil; end; end.
窗体设计:
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 205 ClientWidth = 343 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 32 Top = 28 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 32 Top = 67 Width = 75 Height = 25 Caption = 'Button2' TabOrder = 1 OnClick = Button2Click end object LabeledEdit1: TLabeledEdit Left = 32 Top = 144 Width = 89 Height = 21 EditLabel.Width = 61 EditLabel.Height = 13 EditLabel.Caption = 'LabeledEdit1' TabOrder = 2 OnChange = LabeledEdit1Change end end
运行效果图: