博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 Delphi 下使用 DirectSound (12): 测试失真效果器 IDirectSoundFXDistortion8
阅读量:6970 次
发布时间:2019-06-27

本文共 6641 字,大约阅读时间需要 22 分钟。

  hot3.png

{相关结构:}TDSFXDistortion = packed record  fGain: Sinle;                  //-60 .. 0    : -18  (dB) //好像默认值不是 -18  fEdge: 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;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls;type  TForm1 = 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;var  Form1: TForm1;implementation{$R *.dfm}uses DirectSound, ReadWave2; //ReadWave2 是前面(9)自定义的单元var  myDSound: IDirectSound8;  buf8: IDirectSoundBuffer8;  fxDistortion: IDirectSoundFXDistortion8; //IDirectSoundFXDistortion8 效果器procedure TForm1.FormCreate(Sender: TObject);begin  System.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);var  buf: IDirectSoundBuffer;  bufDesc: TDSBufferDesc;  rEffect: TDSEffectDesc;  wav: TReadWave;  p1: Pointer;  n1: DWORD;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_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);begin  if Assigned(buf8) then buf8.Stop;end;procedure TForm1.LabeledEdit1Change(Sender: TObject);var  rDistortion: TDSFXDistortion;  f: Single;  obj: TLabeledEdit;begin  obj := Sender as TLabeledEdit;  if obj.Text = '-' then Exit;  f := StrToFloatDef(obj.Text, MaxInt);  case obj.Tag of    1: 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);begin  buf8 := nil;  myDSound := nil;end;end.

窗体设计:

object Form1: TForm1  Left = 0  Top = 0  Caption = 'Form1'  ClientHeight = 253  ClientWidth = 363  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 = 75    Width = 75    Height = 25    Caption = 'Button2'    TabOrder = 1    OnClick = Button2Click  end  object LabeledEdit1: TLabeledEdit    Left = 144    Top = 30    Width = 193    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit1'    TabOrder = 2    OnChange = LabeledEdit1Change  end  object LabeledEdit2: TLabeledEdit    Left = 144    Top = 77    Width = 193    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit2'    TabOrder = 3  end  object LabeledEdit3: TLabeledEdit    Left = 144    Top = 125    Width = 193    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit3'    TabOrder = 4  end  object LabeledEdit4: TLabeledEdit    Left = 144    Top = 173    Width = 193    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit4'    TabOrder = 5  end  object LabeledEdit5: TLabeledEdit    Left = 144    Top = 221    Width = 193    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit5'    TabOrder = 6  endend

运行效果图:
26153642_ja56.png

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

你可能感兴趣的文章
python 截取汉字拼音首字母
查看>>
[zz]LIS
查看>>
附加作业:源自刘乾老师的问题
查看>>
硬件篇之MMU
查看>>
如何打包成jar包自己看呢?
查看>>
不可变数组和可变数组
查看>>
Poj(2253),Dijkstra松弛条件的变形
查看>>
Poj(2195),最小费用流,SPFA
查看>>
shell编程系列4--有类型变量:字符串、只读类型、整数、数组
查看>>
WP开发笔记——去除 HTML 标签
查看>>
Json数据序列化对象,及对象序列化为Json格式
查看>>
vue.js的事件绑定与监听
查看>>
ipad%E5%A3%81%E7%BA%B81-1000x288.jpg
查看>>
浏览器兼容之旅的第一站:如何创建条件样式
查看>>
docker swarm英文文档学习-5-在swarm模式中运行Docker引擎
查看>>
利用NX Open在NX中创建点并获取点的坐标信息在listing_windows中输出
查看>>
【Erlang新手成长日记】JSON编码与解码
查看>>
Linux下安装tomcat和jdk
查看>>
实验四+065+方绎杰
查看>>
js中函数作用域,作用域链,变量提升
查看>>