{相关结构:} TDSFXParamEq = packed record fCenter: Single; // 80 .. 16000 : 8000.0 (Hz) fBandwidth: 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 := 'fBandwidth:'; 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
运行效果图:

分类:
Delphi 与 DirectX
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2009-01-24 Delphi 与 DirectX 之 DelphiX(92): TDIB.Draw3x3Matrix();
2009-01-24 Delphi 与 DirectX 之 DelphiX(91): TDIB.DrawMono();
2009-01-24 Delphi 与 DirectX 之 DelphiX(90): TDIB.DrawMorphed();
2008-01-24 初学 Delphi 嵌入汇编[11] - 用汇编重写一个 Delphi 函数
2008-01-24 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器
2008-01-24 初学 Delphi 嵌入汇编[9] - asm 可以代替 begin
2008-01-24 初学 Delphi 嵌入汇编[8] - 8 位寄存器、16 位寄存器与 32 位寄存器