• 在 Delphi 下使用 DirectSound (17): 频率均衡效果器 IDirectSoundFXParamEq8



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


    运行效果图:


  • 相关阅读:
    闭包问题
    二级联动多选器
    一个和与后台数据连接的模板get post put 以及延伸的query
    鼠标经过图片的小动画
    UITableViewCell中cell重用机制导致内容重复的方法
    iOS Button在ios6的系统上无法实现点击,在更高版本的系统上可以
    iOS 使用Reachability实时检测网络连接状况
    iOS Uibutton防止多按钮同时按下
    iOS plist文件的添加
    iOS Xcode cannot run using the selected device.
  • 原文地址:https://www.cnblogs.com/del/p/1943505.html
Copyright © 2020-2023  润新知