为什么80%的码农都做不了架构师?>>>   

{相关结构:}
TDSFXDistortion = packed recordfGain: Sinle;                  //-60 .. 0    : -18  (dB) //好像默认值不是 -18fEdge: Single;                  //  0 .. 100  : 15   (%)fPostEQCenterFrequency: Single; //100 .. 8000 : 2400 (Hz)fPostEQBandwidth: Single;       //100 .. 8000 : 2400 (Hz)fPreLowpassCutoff: Single;      //100 .. 8000 : 800  (Hz)
end;//该结构相关常量:
DSFXDISTORTION_GAIN_MIN                  = -60.0;
DSFXDISTORTION_GAIN_MAX                  = 0.0;DSFXDISTORTION_EDGE_MIN                  = 0.0;
DSFXDISTORTION_EDGE_MAX                  = 100.0;DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN = 100.0;
DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX = 8000.0;DSFXDISTORTION_POSTEQBANDWIDTH_MIN       = 100.0;
DSFXDISTORTION_POSTEQBANDWIDTH_MAX       = 8000.0;DSFXDISTORTION_PRELOWPASSCUTOFF_MIN      = 100.0;
DSFXDISTORTION_PRELOWPASSCUTOFF_MAX      = 8000.0;


测试代码:


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;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure LabeledEdit1Change(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound, ReadWave2; //ReadWave2 是前面(9)自定义的单元varmyDSound: IDirectSound8;buf8: IDirectSoundBuffer8;fxDistortion: IDirectSoundFXDistortion8; //IDirectSoundFXDistortion8 效果器procedure TForm1.FormCreate(Sender: TObject);
beginSystem.ReportMemoryLeaksOnShutdown := True;DirectSoundCreate8(nil, myDSound, nil);myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);Button1.Caption := '打开并播放';Button2.Caption := '停止播放';LabeledEdit1.EditLabel.Caption := 'fGain: -60 - 0';LabeledEdit1.Text := '-18.0';LabeledEdit1.Tag := 1;LabeledEdit2.EditLabel.Caption := 'fEdge: 0 - 100';LabeledEdit2.Text := '15.0';LabeledEdit2.Tag := 2;LabeledEdit3.EditLabel.Caption := 'fPostEQCenterFrequency: 100 - 8000';LabeledEdit3.Text := '2400.0';LabeledEdit3.Tag := 3;LabeledEdit4.EditLabel.Caption := 'fPostEQBandwidth: 100 - 8000';LabeledEdit4.Text := '2400.0';LabeledEdit4.Tag := 4;LabeledEdit5.EditLabel.Caption := 'fPreLowpassCutoff: 100 - 8000';LabeledEdit5.Text := '800.0';LabeledEdit5.Tag := 5;LabeledEdit2.OnChange := LabeledEdit1.OnChange;LabeledEdit3.OnChange := LabeledEdit1.OnChange;LabeledEdit4.OnChange := LabeledEdit1.OnChange;LabeledEdit5.OnChange := LabeledEdit1.OnChange;
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_DISTORTION;buf8.SetFX(1, @rEffect, nil);buf8.GetObjectInPath(GUID_DSFX_STANDARD_DISTORTION, 0, IID_IDirectSoundFXDistortion8, fxDistortion);buf8.Play(0, 0, DSBPLAY_LOOPING);
end;procedure TForm1.Button2Click(Sender: TObject);
beginif Assigned(buf8) then buf8.Stop;
end;procedure TForm1.LabeledEdit1Change(Sender: TObject);
varrDistortion: TDSFXDistortion;f: Single;obj: TLabeledEdit;
beginobj := Sender as TLabeledEdit;if obj.Text = '-' then Exit;f := StrToFloatDef(obj.Text, MaxInt);case obj.Tag of1: if (f < -60)  or (f > 0)   then obj.Text := '-18.0';2: if (f < 0) or (f > 100)  then obj.Text := '15.0';3: if (f < 100) then Exit else if (f > 8000) then obj.Text := '2400.0';4: if (f < 100) then Exit else if (f > 8000) then obj.Text := '2400.0';5: if (f < 100) then Exit else if (f > 8000) then obj.Text := '800.0';end;if buf8 = nil then Exit;rDistortion.fGain                  := StrToFloat(LabeledEdit1.Text);rDistortion.fEdge                  := StrToFloat(LabeledEdit2.Text);rDistortion.fPostEQCenterFrequency := StrToFloat(LabeledEdit3.Text);rDistortion.fPostEQBandwidth       := StrToFloat(LabeledEdit4.Text);rDistortion.fPreLowpassCutoff      := StrToFloat(LabeledEdit5.Text);fxDistortion.SetAllParameters(rDistortion);
end;procedure TForm1.FormDestroy(Sender: TObject);
beginbuf8 := nil;myDSound := nil;
end;end.


窗体设计:


object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 253ClientWidth = 363Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 32Top = 28Width = 75Height = 25Caption = 'Button1'TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 32Top = 75Width = 75Height = 25Caption = 'Button2'TabOrder = 1OnClick = Button2Clickendobject LabeledEdit1: TLabeledEditLeft = 144Top = 30Width = 193Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit1'TabOrder = 2OnChange = LabeledEdit1Changeendobject LabeledEdit2: TLabeledEditLeft = 144Top = 77Width = 193Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit2'TabOrder = 3endobject LabeledEdit3: TLabeledEditLeft = 144Top = 125Width = 193Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit3'TabOrder = 4endobject LabeledEdit4: TLabeledEditLeft = 144Top = 173Width = 193Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit4'TabOrder = 5endobject LabeledEdit5: TLabeledEditLeft = 144Top = 221Width = 193Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit5'TabOrder = 6end
end


运行效果图:


转载于:https://my.oschina.net/hermer/blog/320336

在 Delphi 下使用 DirectSound (12): 测试失真效果器 IDirectSoundFXDistortion8相关推荐

  1. 在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8

    {相关结构:} TDSFXFlanger = packed recordfWetDryMix: Single; // 0 .. 100 : 50 (%)fDepth: Single; // 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. 阿里巴巴为什么让初始化集合时必须指定大小?
  2. mysql表文件被删_mysql表物理文件被误删的解决方法
  3. FPGA之道(1)HDL代码风格
  4. 解决RecycleView 嵌套 RecycleView 显示不全的问题
  5. 看图轻松理解数据结构与算法系列(合并排序)
  6. SAP Marketing Cloud里获取Contact Interaction的postman请求
  7. ABAP xml handling via SAX - 在ABAP里另一种处理xml的机制介绍
  8. python3解释器执行long(10)的结果为_Python3解释器执行'AB2C3D'.lower().title()的结果是( )。...
  9. sqoop从HDFS导出数据到Mysql,卡在Running job: job_1571036741208_0010不动了,或者map 100% reduce 0%不动了
  10. LeetCode 444. 序列重建(拓扑排序)
  11. JavaScript 真值和假值
  12. 2021年8月Python小屋编程比赛获奖名单
  13. fcn+caffe+siftflow实验记录
  14. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  15. Word转PDF方法(jacob插件)
  16. CS229 Lecture 12
  17. 制作基于WiFi局域网的自动开门装置2.0(Arduino+微信小程序)
  18. 虚拟机调整C盘分区大小的取巧方法
  19. java实现office转pdf文件
  20. 初次使用Chloe(本人小白)

热门文章

  1. 极索(Gsuo)推出新版地图采用Gmap设计思路
  2. python中字符串的rstrip()方法
  3. Django模型Model的定义
  4. 普通PC安装ESXI6.0无法识别网卡驱动问题
  5. 对PostgreSQL缺省表空间的理解
  6. 简书非官方大数据(一)
  7. MySQL单机多实例部署详解之------利用mysqld_multi配置实现
  8. CISCO CME:配置基于硬件的电话会议
  9. linux 条件判断
  10. mybatis的缓存简说