博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 Delphi 下使用 DirectSound (17): 频率均衡效果器 IDirectSoundFXParamEq8
阅读量:7234 次
发布时间:2019-06-29

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

  hot3.png

{相关结构:}TDSFXParamEq = packed record  fCenter: Single;    // 80 .. 16000 : 8000.0 (Hz)  fBandwidth: Single; //  1 .. 36    : 12.0  fGain: Single;      //-15 .. 15    : 0.0end;//该结构相关常量: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;interfaceuses  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  endend

运行效果图:
26153648_mqlV.png

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

你可能感兴趣的文章
《推荐系统实践》序言、样章欢迎阅读!
查看>>
微软针对Access提供了免费的SQL Server移植工具——SSMA
查看>>
别了,我的执着
查看>>
WMI技术介绍和应用——查询硬件信息
查看>>
Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一(转载)
查看>>
初学者学Java设计模式(一)------单例设计模式
查看>>
Git相关
查看>>
Largest product in a series
查看>>
算法教程(1)zz
查看>>
线程池以及计数器的使用简单示例
查看>>
Spring-JDBC实现Contact的CRUD
查看>>
Java实现BASE64编解码
查看>>
简单制作验证码和绘制图片
查看>>
在jsp页面上打印错误堆栈
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
SpringMVC 全注解实现 (1) servlet3.0以上的容器支持
查看>>
1012. 数字分类 (20)
查看>>
[算法]有趣算法合辑[31-40]
查看>>
July收集荷兰国旗问题之三路partition
查看>>
搭建前端私有npm杂记
查看>>