{相关结构:}
TDSFXFlanger = packed recordfWetDryMix: Single; //  0 .. 100  : 50  (%)fDepth: Single;     //  0 .. 100  : 100 (%)fFeedback: Single;  //-99 .. 99   : -50 (%)fFrequency: Single; //  0 .. 10   : 0.25lWaveform: Longint; //  0 .. 1    : 1fDelay: Single;     //  0 .. 4    : 2   (ms)lPhase: Longint;    //  0 .. 4    : 2
end;//该结构相关常量:
DSFXFLANGER_WETDRYMIX_MIN = 0.0;
DSFXFLANGER_WETDRYMIX_MAX = 100.0;DSFXFLANGER_DEPTH_MIN     = 0.0;
DSFXFLANGER_DEPTH_MAX     = 100.0;DSFXFLANGER_FEEDBACK_MIN  = -99.0;
DSFXFLANGER_FEEDBACK_MAX  = 99.0;DSFXFLANGER_FREQUENCY_MIN = 0.0;
DSFXFLANGER_FREQUENCY_MAX = 10.0;DSFXFLANGER_WAVE_TRIANGLE = 0;
DSFXFLANGER_WAVE_SIN      = 1;DSFXFLANGER_PHASE_MIN     = 0;
DSFXFLANGER_PHASE_MAX     = 4;DSFXFLANGER_DELAY_MIN     = 0.0;
DSFXFLANGER_DELAY_MAX     = 4.0;DSFXFLANGER_PHASE_NEG_180 = 0;
DSFXFLANGER_PHASE_NEG_90  = 1;
DSFXFLANGER_PHASE_ZERO    = 2;
DSFXFLANGER_PHASE_90      = 3;
DSFXFLANGER_PHASE_180     = 4;


测试代码:


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;LabeledEdit1: TLabeledEdit;LabeledEdit2: TLabeledEdit;LabeledEdit3: TLabeledEdit;LabeledEdit4: TLabeledEdit;LabeledEdit5: TLabeledEdit;RadioGroup1: TRadioGroup;RadioGroup2: TRadioGroup;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure RadioGroup1Click(Sender: TObject);procedure LabeledEdit1Change(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound, ReadWave2;varmyDSound: IDirectSound8;buf8: IDirectSoundBuffer8;fxFlanger: IDirectSoundFXFlanger8; //IDirectSoundFXFlanger8 效果器procedure TForm1.FormCreate(Sender: TObject);
beginSystem.ReportMemoryLeaksOnShutdown := True;DirectSoundCreate8(nil, myDSound, nil);myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);Button1.Caption := '打开并播放';Button2.Caption := '停止播放';LabeledEdit1.EditLabel.Caption := 'fWetDryMix: 0.0 - 100.0';LabeledEdit1.Text := '50.0';LabeledEdit1.Tag := 1;LabeledEdit2.EditLabel.Caption := 'fDepth: 0.0 - 100.0';LabeledEdit2.Text := '100.0';LabeledEdit2.Tag := 2;LabeledEdit3.EditLabel.Caption := 'fFeedback: -99.0 - 99.0';LabeledEdit3.Text := '-50.0';LabeledEdit3.Tag := 3;LabeledEdit4.EditLabel.Caption := 'fFrequency: 0.0 - 10.0';LabeledEdit4.Text := '1.0';LabeledEdit4.Tag := 4;LabeledEdit5.EditLabel.Caption := 'ffDelay: 0.0 - 4.0';LabeledEdit5.Text := '2.0';LabeledEdit5.Tag := 5;RadioGroup1.Caption := 'lWaveform:';RadioGroup1.Items.CommaText := 'WAVE_TRIANGLE, WAVE_SIN';RadioGroup1.ItemIndex := 1;RadioGroup2.Caption := 'lPhase:';RadioGroup2.Items.CommaText := '-180,-90,0,90,180';RadioGroup2.ItemIndex := 2;LabeledEdit2.OnChange := LabeledEdit1.OnChange;LabeledEdit3.OnChange := LabeledEdit1.OnChange;LabeledEdit4.OnChange := LabeledEdit1.OnChange;LabeledEdit5.OnChange := LabeledEdit1.OnChange;RadioGroup2.OnClick := RadioGroup1.OnClick;
end;procedure TForm1.Button1Click(Sender: TObject);
varbuf: IDirectSoundBuffer;bufDesc: TDSBufferDesc;rEffect: TDSEffectDesc;wav: TReadWave;p1: Pointer;n1: DWORD;
beginwav := 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_FLANGER;buf8.SetFX(1, @rEffect, nil);buf8.GetObjectInPath(GUID_DSFX_STANDARD_FLANGER, 0, IID_IDirectSoundFXFlanger8, fxFlanger);buf8.Play(0, 0, DSBPLAY_LOOPING);
end;procedure TForm1.Button2Click(Sender: TObject);
beginif Assigned(buf8) then buf8.Stop;
end;procedure TForm1.RadioGroup1Click(Sender: TObject);
varrFlanger: TDSFXFlanger;
beginif buf8 = nil then Exit;rFlanger.fWetDryMix := StrToFloat(LabeledEdit1.Text);rFlanger.fDepth     := StrToFloat(LabeledEdit2.Text);rFlanger.fFeedback  := StrToFloat(LabeledEdit3.Text);rFlanger.fFrequency := StrToFloat(LabeledEdit4.Text);rFlanger.lWaveform  := RadioGroup1.ItemIndex;rFlanger.fDelay     := StrToFloat(LabeledEdit5.Text);rFlanger.lPhase     := RadioGroup2.ItemIndex;fxFlanger.SetAllParameters(rFlanger);
end;procedure TForm1.LabeledEdit1Change(Sender: TObject);
varf: Single;obj: TLabeledEdit;
beginobj := Sender as TLabeledEdit;if obj.Text = '-' then Exit;f := StrToFloatDef(obj.Text, MaxInt);case obj.Tag of1: if (f < 0)   or (f > 100) then obj.Text := '50.0';2: if (f < 0)   or (f > 100) then obj.Text := '100.0';3: if (f < -99) or (f > 99)  then obj.Text := '-50.0';4: if (f < 0)   or (f > 10)  then obj.Text := '0.25';5: if (f < 0)   or (f > 20)  then obj.Text := '2';end;RadioGroup1.OnClick(nil);
end;procedure TForm1.FormDestroy(Sender: TObject);
beginbuf8 := nil;myDSound := nil;
end;end.


窗体设计:


object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 287ClientWidth = 314Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 24Top = 18Width = 75Height = 25Caption = 'Button1'TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 120Top = 18Width = 75Height = 25Caption = 'Button2'TabOrder = 1OnClick = Button2Clickendobject LabeledEdit1: TLabeledEditLeft = 24Top = 72Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit1'TabOrder = 2OnChange = LabeledEdit1Changeendobject LabeledEdit2: TLabeledEditLeft = 24Top = 115Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit2'TabOrder = 3endobject LabeledEdit3: TLabeledEditLeft = 24Top = 160Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit3'TabOrder = 4endobject LabeledEdit4: TLabeledEditLeft = 24Top = 208Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit4'TabOrder = 5endobject LabeledEdit5: TLabeledEditLeft = 24Top = 253Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit5'TabOrder = 6endobject RadioGroup1: TRadioGroupLeft = 177Top = 56Width = 129Height = 64Caption = 'RadioGroup1'TabOrder = 7OnClick = RadioGroup1Clickendobject RadioGroup2: TRadioGroupLeft = 176Top = 136Width = 129Height = 138Caption = 'RadioGroup2'TabOrder = 8end
end


运行效果图:


转载于:https://www.cnblogs.com/del/archive/2011/01/23/1942732.html

在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8相关推荐

  1. 在 Delphi 下使用 DirectSound (12): 测试失真效果器 IDirectSoundFXDistortion8

    为什么80%的码农都做不了架构师?>>>    {相关结构:} TDSFXDistortion = packed recordfGain: Sinle; //-60 .. 0 : - ...

  2. 在 Delphi 下使用 DirectSound (9): 效果器初步及 IDirectSoundFXGargle8 效果器

    只有使用 IDirectSoundBuffer8 的次缓冲区才能设置"特效", 主缓冲区主要负责的是混音和处理 3D 效果. IDirectSoundBuffer8(非 IDire ...

  3. 在 Delphi 下使用 DirectSound (5): 获取或设置缓冲区的格式:

    次缓冲区(或叫辅助缓冲区)尽管使用了波形文件自己的 TWaveFormatEx, 但最终播放的却只是 22050HZ 的 8 位立体声. 因为次缓冲区最终要混入主缓冲区才播放, 可主缓冲区的缺省格式是 ...

  4. 在 Delphi 下使用 DirectSound (4): 设置音量、相位、播放频率和播放位置

    通过 IDirectSoundBuffer 的 SetVolume.SetPan.SetFrequency.SetCurrentPosition 方法可以简单进行这些设置. 同时 IDirectSou ...

  5. 在 Delphi 下使用 DirectSound (6): 按文件自己的格式(TWaveFormatEx)播放

    这必须手动建立主缓冲区. unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  6. 在 Delphi 下使用 DirectSound (2): 查看设备性能

    使用 DirectSound 前应先建立 IDirectSound8 对象(之前的版本是 IDirectSound): function DirectSoundCreate8(pcGuidDevice ...

  7. Delphi下利用WinIo模拟鼠标键盘详解

    本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现Se ...

  8. Delphi下使用指针的简单总结

    由于最近公司太忙,好久没有更新我的BLOG了.原来想着写写关于HOOK驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用DELPHI来开发网 ...

  9. Delphi下的COM编程

    Delphi通过向导可以非常迅速和方便的直接建立实现COM对象的代码,但是整个COM实现的过程被完全的封装,甚至没有VCL那么结构清晰可见. 一个没有C++下COM开发经验甚至没有接触过COM开发的D ...

最新文章

  1. PHP PDO 连接SQLSErver,PHP 使用 PDO 方式连接 sqlserver ,拼接 的 sql 命令总是报错
  2. 华为2288H V5串口重定向修改为iBMC
  3. 基于FFmpeg-4.0 SDK的PCM编码成AAC
  4. Paper:《Spatial Transformer Networks》的翻译与解读
  5. Android空间WebView和ViedeoView的使用
  6. CSS3 选择器——属性选择器
  7. ovirt官方安装文档 第三章
  8. 本地 Windows 如何将 Web 工程部署到远程 Windows 主机上
  9. 在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?
  10. web-软件架构模式-mvc与mtv
  11. 执行了rm-f,除了跑路,如何恢复?
  12. 乐华娱乐前训练生黄智博卖口罩诈骗案宣判:获刑三年三个月
  13. 用于对Compound协议进行无Gas投票和委托的社区工具发布
  14. 调用feign接口时,如何往header中添加参数
  15. 中图杯获奖作品计算机组,地理奥赛网-首页
  16. java 任意 符号_哪种符号表示表面可用任意方法获得?()
  17. C7:如何使用JEPG Simulation进行ColorTuning?
  18. Distributional RL with Quantile Regression论文翻译
  19. python seek函数whence_file.seek(offset[, whence])
  20. node下载(使用nvm的方式)

热门文章

  1. 如果你的电脑是通过代理上网的.就要用端口映射
  2. 2.6 multimap
  3. 新手学MVC----MVC3.0错误 HTTP 404
  4. 【转】基于XML-RPC的BloggerAPI学习
  5. Enterprise Library 2.0 Hands On Lab 翻译(3):数据访问程序块(三)
  6. 数据库设计方法、规范与技巧
  7. 安装了一次Linux,哈哈
  8. 1743. 从相邻元素对还原数组
  9. 初探Golang(3)-数据类型
  10. leetcode459. 重复的子字符串