📄 u_dspdet_main.pas
字号:
(*
----------------------------------------------
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 + -