⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_dspdet_main.pas

📁 Voice Commnucation Components for Delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:

(*
	----------------------------------------------

	  u_dspDet_main.pas - DSP Leven and Noise detectors main form
	  Voice Communicator components version 2.5 Pro

	----------------------------------------------
	  This source code cannot be used without
	  proper license granted to you as a private
	  person or an entity by the Lake of Soft, Ltd

	  Visit http://lakeofsoft.com/ for more information.

	  Copyright (c) 2001, 2007 Lake of Soft, Ltd
		     All rights reserved
	----------------------------------------------

	  created by:
		Lake, 06 Mar 2007

	  modified by:
		Lake, Mar 2007

	----------------------------------------------
*)

{$I unaDef.inc}

unit
  u_dspDet_main;

interface

uses
  Windows, unaTypes, unaClasses,
  unaDspLibH, unaDSPDLib, unaDspLibAutomation,
  Forms, unaVCIDE, ComCtrls, StdCtrls, Controls, Classes, ExtCtrls, Dialogs;

type
  //
  tSignalData 		= array[0..9] of pdspl_float;
  tSignalDataSize 	= array[0..9] of uint;

  //
  Tc_form_main = class(TForm)
    //
    c_cb_source: TComboBox;
    c_cb_dest: TComboBox;
    c_button_start: TButton;
    c_button_stop: TButton;
    c_pb_file: TProgressBar;
    c_cb_loop: TCheckBox;
    c_od_file: TOpenDialog;
    //
    waveIn: TunavclWaveInDevice;
    waveOut: TunavclWaveOutDevice;
    waveRiff: TunavclWaveRiff;
    //
    Bevel1: TBevel;
    Bevel2: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    c_label_fileName: TLabel;
    //
    c_tb_LD_attack: TTrackBar;
    c_tb_LD_release: TTrackBar;
    c_rb_LD_RMS: TRadioButton;
    c_rb_LD_PEAK: TRadioButton;
    c_pb_LD: TPaintBox;
    c_l_LD_attack: TLabel;
    c_l_LD_release: TLabel;
    //
    c_pb_ND_main: TPaintBox;
    c_pb_ND_level: TPaintBox;
    c_tb_ND_HP: TTrackBar;
    c_tb_ND_LP: TTrackBar;
    c_tb_ND_threshold: TTrackBar;
    c_tb_ND_smoothing: TTrackBar;
    c_l_ND_HP: TLabel;
    c_l_ND_LP: TLabel;
    c_l_ND_threshold: TLabel;
    c_l_ND_smoothing: TLabel;
    //
    c_sb_main: TStatusBar;
    c_timer_update: TTimer;
    c_cb_LD_enable: TCheckBox;
    c_cb_ND_enable: TCheckBox;
    c_cb_onlySignal: TCheckBox;
    //
    procedure formCreate(sender: tObject);
    procedure formCloseQuery(sender: tObject; var canClose: boolean);
    procedure formDestroy(sender: tObject);
    //
    procedure c_tb_LD_attackChange(Sender: TObject);
    procedure c_tb_LD_releaseChange(Sender: TObject);
    procedure c_tb_ND_HPChange(Sender: TObject);
    procedure c_tb_ND_LPChange(Sender: TObject);
    procedure c_tb_ND_thresholdChange(Sender: TObject);
    procedure c_tb_ND_smoothingChange(Sender: TObject);
    //
    procedure c_rb_LD_typeChange(Sender: TObject);
    procedure c_cb_sourceChange(Sender: TObject);
    procedure c_cb_loopClick(Sender: TObject);
    //
    procedure c_button_startClick(Sender: TObject);
    procedure c_button_stopClick(Sender: TObject);
    //
    procedure c_timer_updateTimer(Sender: TObject);
    //
    procedure waveRiffStreamIsDone(sender: TObject);
    procedure dataAvail(sender: unavclInOutPipe; data: Pointer; len: Cardinal);
  private
    { Private declarations }
    f_config: unaIniFile;
    //
    f_dspl: unaDspDLibRoot;
    f_dsplAutoLD: unaDSPLibAutomat;
    f_dsplAutoND: unaDSPLibAutomat;
    f_dsplObjLD: dspl_handle;
    f_dsplObjND: dspl_handle;
    //
    f_ld_enabled: bool;
    f_nd_enabled: bool;
    f_passSignalOnly: bool;
    f_passSignalOnlyOld: bool;
    //
    f_solidBG: hBrush;
    f_penGreen: hPen;
    f_penBlue: hPen;
    f_penRed: hPen;
    //
    f_dsplOutBufLD: tSignalData;	// up to 10 channels
    f_dsplOutBufND: tSignalData;	// up to 10 channels
    f_dsplOutBufLDSize: tSignalDataSize;	// up to 10 channels
    f_dsplOutBufNDSize: tSignalDataSize;	// up to 10 channels
    f_outBufValidLD: bool;
    f_outBufValidND: bool;
    f_chNum: int;
    //
    f_totalBytes: int64;
    f_streamDone: bool;
    //
    procedure plotArray(box: tPaintBox; channel: int; data: pdspl_float; len: uint);
    procedure plotResult(box: tPaintBox; const channel: int; data: pdspl_float; ND: dspl_float; len: uint; out signalOverNoise: bool);
  public
    { Public declarations }
  end;

var
  c_form_main: Tc_form_main;


implementation


uses
  unaUtils, unaVCIDEUtils;


{$R *.dfm}

// --  --
procedure Tc_form_main.formCreate(sender: tObject);
var
  inputIsFile: bool;
begin
  f_config := unaIniFile.create();
  //
  f_dspl := unaDspDLibRoot.create();
  f_dsplAutoLD := unaDSPLibAutomat.create(f_dspl);
  f_dsplAutoND := unaDSPLibAutomat.create(f_dspl);
  //
  f_dsplObjLD := f_dsplAutoLD.dspl_objNew(DSPL_OID or DSPL_LD);
  f_dsplObjND := f_dsplAutoND.dspl_objNew(DSPL_OID or DSPL_ND);
  //
  c_tb_LD_attack.position := f_config.get('ld.attack', int(44));	// assuming 44100 sampling rate
  c_tb_LD_release.position := f_config.get('ld.release', int(88));	// assuming 44100 sampling rate
  //
  c_rb_LD_RMS.checked := f_config.get('ld.type.isRMS', true);	// RMS by default
  c_rb_LD_PEAK.checked := not c_rb_LD_RMS.checked;	//
  //
  c_cb_LD_enable.checked := f_config.get('ld.enabled', true);	//
  c_cb_ND_enable.checked := f_config.get('nd.enabled', true);	//
  c_cb_onlySignal.checked := f_config.get('output.signalOnly', false);	//
  //
  c_tb_ND_HP.position := f_config.get('nd.HP', int(300));	//
  c_tb_ND_LP.position := f_config.get('nd.LP', int(3000));	//
  c_tb_ND_threshold.position := f_config.get('nd.threshold', int(7));	// * 0.1
  c_tb_ND_smoothing.position := f_config.get('nd.smoothing', int(1));	//
  //
  // update labels
  c_tb_LD_attackChange(self);
  c_tb_LD_releaseChange(self);
  c_tb_ND_HPChange(self);
  c_tb_ND_LPChange(self);
  c_tb_ND_thresholdChange(self);
  c_tb_ND_smoothingChange(self);
  //
  enumWaveDevices(c_cb_source, true, false);
  enumWaveDevices(c_cb_dest, false, false);
  //
  c_cb_source.items.addObject('Load audio from a *.WAV file...', pointer($666));
  c_cb_source.itemIndex := f_config.get('input.index', int(0));
  c_cb_dest.itemIndex := f_config.get('output.index', int(0));
  //
  inputIsFile := ((0 <= c_cb_source.itemIndex) and (pointer($666) = c_cb_source.items.objects[c_cb_source.itemIndex]));
  c_label_fileName.caption := f_config.get('input.fileName', '');
  c_cb_loop.checked := f_config.get('input.file.loop', false);
  //
  c_pb_file.visible := inputIsFile and fileExists(c_label_fileName.caption);
  c_label_fileName.visible := inputIsFile;
  c_cb_loop.visible := inputIsFile;
  //
  f_solidBG := GetSysColorBrush(COLOR_BTNFACE);
  f_penGreen := CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
  f_penBlue  := CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
  f_penRed   := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
  //
end;

// --  --
procedure Tc_form_main.formDestroy(sender: tObject);
begin
  deleteObject(f_penGreen);
  deleteObject(f_penBlue);
  deleteObject(f_penRed);
  //
  freeAndNil(f_dsplAutoLD);
  freeAndNil(f_dsplAutoND);
  freeAndNil(f_dspl);
  freeAndNil(f_config);
end;

// --  --
procedure Tc_form_main.formCloseQuery(sender: tObject; var canClose: boolean);
begin
  c_timer_update.enabled := false;
  waveRiff.close();
  waveIn.close();
  //
  f_config.setValue('input.index', c_cb_source.itemIndex);
  f_config.setValue('output.index', c_cb_dest.itemIndex);
  //
  f_config.setValue('input.fileName', c_label_fileName.caption);
  f_config.setValue('input.file.loop', c_cb_loop.checked);
  //
  f_config.setValue('ld.attack', c_tb_LD_attack.position);
  f_config.setValue('ld.release', c_tb_LD_release.position);
  //
  f_config.setValue('ld.type.isRMS', c_rb_LD_RMS.checked);
  f_config.setValue('ld.enabled', c_cb_LD_enable.checked);		//
  f_config.setValue('nd.enabled', c_cb_ND_enable.checked);		//
  f_config.setValue('output.signalOnly', c_cb_onlySignal.checked);	//
  //
  f_config.setValue('nd.HP', c_tb_ND_HP.position);
  f_config.setValue('nd.LP', c_tb_ND_LP.position);
  f_config.setValue('nd.threshold', c_tb_ND_threshold.position);
  f_config.setValue('nd.smoothing', c_tb_ND_smoothing.position);
end;

// --  --
procedure Tc_form_main.c_rb_LD_typeChange(Sender: TObject);
begin
  f_dsplAutoLD.dspl_obj_seti(f_dsplObjLD, DSPL_PID or DSPL_P_TYPE, choice(c_rb_LD_RMS.checked, DSPL_LD_RMS, int(DSPL_LD_PEAK)));
end;

// --  --
procedure Tc_form_main.c_tb_LD_attackChange(Sender: TObject);
begin
  c_l_LD_attack.caption := int2str(c_tb_LD_attack.position);
  //
  f_dsplAutoLD.dspl_obj_setf(f_dsplObjLD, DSPL_PID or DSPL_P_ATTACK, c_tb_LD_attack.position);
end;

// --  --
procedure Tc_form_main.c_tb_LD_releaseChange(Sender: TObject);
begin
  c_l_LD_release.caption := int2str(c_tb_LD_release.position);
  //
  f_dsplAutoLD.dspl_obj_setf(f_dsplObjLD, DSPL_PID or DSPL_P_RELEASE, c_tb_LD_release.position);
end;

// --  --
procedure Tc_form_main.c_tb_ND_HPChange(Sender: TObject);
begin
  c_l_ND_HP.caption := int2str(c_tb_ND_HP.position);
  //
  f_dsplAutoND.dspl_obj_setf(f_dsplObjND, DSPL_PID or DSPL_P_NFRQ or DSPL_ND_BAND_HP, c_tb_ND_HP.position);
end;

// --  --
procedure Tc_form_main.c_tb_ND_LPChange(Sender: TObject);
begin
  c_l_ND_LP.caption := int2str(c_tb_ND_LP.position);
  //
  f_dsplAutoND.dspl_obj_setf(f_dsplObjND, DSPL_PID or DSPL_P_NFRQ or DSPL_ND_BAND_LP, c_tb_ND_LP.position);
end;

// --  --
procedure Tc_form_main.c_tb_ND_thresholdChange(Sender: TObject);
begin
  c_l_ND_threshold.caption := '0.' + int2str(c_tb_ND_threshold.position);
  //
  f_dsplAutoND.dspl_obj_setf(f_dsplObjND, DSPL_PID or DSPL_P_THRESHOLD, c_tb_ND_threshold.position * 0.1);
end;

// --  --
procedure Tc_form_main.c_tb_ND_smoothingChange(Sender: TObject);
begin
  c_l_ND_smoothing.caption := int2str(c_tb_ND_smoothing.position);
  //
  f_dsplAutoND.dspl_obj_setf(f_dsplObjND, DSPL_PID or DSPL_P_OTHER, c_tb_ND_smoothing.position);
end;

// --  --
procedure Tc_form_main.c_button_startClick(Sender: TObject);
var
  i: int;
begin
  c_button_start.enabled := false;
  c_button_stop.enabled := true;
  //
  waveIn.close();	// just in case
  waveRiff.close();
  //
  waveIn.consumer := waveOut;  	// restore provider/conusmer link, so waveOut will be assigned a proper PCM format
  waveRiff.consumer := waveOut;
  //
  waveOut.deviceId := index2deviceId(c_cb_dest);
  //
  f_totalBytes := 0;
  f_streamDone := false;
  f_outBufValidLD := false;
  f_outBufValidND := false;
  //
  f_ld_enabled := c_cb_LD_enable.checked;
  f_nd_enabled := c_cb_ND_enable.checked;
  f_passSignalOnly := c_cb_onlySignal.checked;
  f_passSignalOnlyOld := not f_passSignalOnly;
  //
  i := c_cb_source.itemIndex;
  if ((0 <= i) and (pointer($666) = c_cb_source.items.objects[i])) then begin
    //
    // source is a file
    //
    waveRiff.fileName := c_label_fileName.caption;
    waveRiff.loop := c_cb_loop.checked;
    //
    if (nil <> waveRiff.waveStream.dstFormat) then begin
      //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -