📄 u_daf_main.pas
字号:
(*
----------------------------------------------
u_daf_main.pas
Voice Communicator components version 2.5
Audio Feedabck demo - main form
----------------------------------------------
This source code cannot be used without
proper permission granted to you as a private
person or an entity by the Lake of Soft, Ltd
Visit http://lakeofsoft.com/ for details.
Copyright (c) 2001, 2007 Lake of Soft, Ltd
All rights reserved
----------------------------------------------
created by:
Lake, 11 Aug 2005
modified by:
Lake, Aug 2005
----------------------------------------------
*)
{$I unaDef.inc }
unit u_daf_main;
interface
uses
Windows, unaTypes, unaClasses, unaAudioFeedback,
Forms, StdCtrls, Controls, Classes, ComCtrls, ExtCtrls, unaDspControls,
unaVCIDE;
type
Tc_form_main = class(TForm)
c_tb_delay: TTrackBar;
c_cb_waveIn: TComboBox;
c_cb_waveOut: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
c_button_start: TButton;
c_button_stop: TButton;
c_statusBar_main: TStatusBar;
c_timer_update: TTimer;
c_label_delayInfo: TLabel;
c_fftControl_main: TunadspFFTControl;
unavclWaveCodecDevice1: TunavclWaveCodecDevice;
//
procedure formCreate(sender: tObject);
procedure formCloseQuery(sender: tObject; var canClose: boolean);
procedure formDestroy(sender: tObject);
procedure formShow(sender: tObject);
//
procedure c_button_startClick(Sender: TObject);
procedure c_button_stopClick(Sender: TObject);
procedure c_timer_updateTimer(Sender: TObject);
procedure c_tb_delayChange(sender: tObject);
private
{ Private declarations }
f_config: unaIniFile;
f_feedback: unaAudioFeedbackClass;
f_delayStep: int;
//
procedure dafControl(cmd: int);
procedure myOnDA(sender: tObject; data: pointer; len: unsigned);
public
{ Public declarations }
end;
var
c_form_main: Tc_form_main;
implementation
uses
unaUtils,
{$IFDEF __SYSUTILS_H_ }
Math,
{$ENDIF }
unaVCLUtils, unaVCIDEUtils, unaMsAcmClasses;
{$R *.dfm}
{ tForm1 }
// -- --
procedure Tc_form_main.formCreate(sender: tObject);
begin
// setup VC classes constants
c_defChunksPerSecond := 50; // 20 ms chunks
c_defPlaybackChunksAheadNumber := 0; // no delay
//
f_delayStep := 1000 div c_defChunksPerSecond;
//
f_config := unaIniFile.create();
f_feedback := unaAudioFeedbackClass.create(false, THREAD_PRIORITY_ABOVE_NORMAL);
//
f_feedback.onDataAvailable := myOnDA;
end;
// -- --
procedure Tc_form_main.formCloseQuery(sender: tObject; var canClose: boolean);
begin
c_timer_update.enabled := false;
//
f_feedback.stop();
//
f_config.setValue('waveIn.deviceIndex', c_cb_waveIn.itemIndex);
f_config.setValue('waveOut.deviceIndex', c_cb_waveOut.itemIndex);
f_config.setValue('wave.delayPos', c_tb_delay.position);
//
saveControlPosition(self, f_config, 'position');
end;
// -- --
procedure Tc_form_main.formDestroy(sender: tObject);
begin
freeAndNil(f_feedback);
freeAndNil(f_config);
end;
// -- --
procedure Tc_form_main.formShow(sender: tObject);
begin
loadControlPosition(self, f_config, 'position', true, false);
//
c_tb_delay.min := 1;
c_tb_delay.max := 100; // 20 ms * 100 = 2000 ms (max is 256)
c_tb_delay.position := max(1, min(100, f_config.get('wave.delayPos', int(2)))); // default to 40 ms
//
enumWaveDevices(c_cb_waveIn, true, true);
enumWaveDevices(c_cb_waveOut, false, true);
//
c_cb_waveIn.itemIndex := f_config.get('waveIn.deviceIndex', int(0)); // mapper by default
c_cb_waveOut.itemIndex := f_config.get('waveOut.deviceIndex', int(0)); // mapper by default
//
c_timer_update.enabled := true;
end;
// -- --
procedure Tc_form_main.c_button_startClick(Sender: TObject);
begin
c_button_start.enabled := false;
//
f_feedback.setup(c_tb_delay.position * f_delayStep, index2deviceId(c_cb_waveIn), index2deviceId(c_cb_waveOut), nil);
//
// start DAF
dafControl(1);
end;
// -- --
procedure Tc_form_main.c_button_stopClick(Sender: TObject);
begin
c_button_stop.enabled := false;
//
// stop DAF
dafControl(0);
end;
// -- --
procedure Tc_form_main.dafControl(cmd: int);
begin
case (cmd) of
0: begin
//
f_feedback.stop();
//
c_fftControl_main.active := false;
end;
1: begin
//
c_fftControl_main.fft.fft.setFormat(f_feedback.waveIn.dstFormat.wBitsPerSample, f_feedback.waveIn.dstFormat.nChannels);
c_fftControl_main.active := true;
//
f_feedback.start();
end;
end;
end;
// -- --
function status2str(status, errorCode: int): string;
begin
case (status) of
c_stat_afStopped:
result := ' process is stopped';
c_stat_afActive:
result := ' process is running';
c_stat_afErrorIn:
result := ' recording device error - ' + unaWaveInDevice.getErrorText(errorCode);
c_stat_afErrorOut:
result := ' playback device error - ' + unaWaveOutDevice.getErrorText(errorCode);
else
result := 'uknown status (' + int2str(status) + ')';
end;
end;
// -- --
procedure Tc_form_main.c_timer_updateTimer(Sender: TObject);
var
isRunning: bool;
begin
c_statusBar_main.simpleText := 'Feedback status: ' + status2str(f_feedback.status, f_feedback.errorCode);
//
isRunning := (c_stat_afActive = f_feedback.status);
//
c_button_start.enabled := not isRunning;
c_button_stop.enabled := isRunning;
c_cb_waveIn.enabled := not isRunning;
c_cb_waveOut.enabled := not isRunning;
//
c_label_delayInfo.caption := int2str(c_tb_delay.position * f_delayStep) + ' ms';
end;
// -- --
procedure Tc_form_main.c_tb_delayChange(sender: tObject);
begin
// adjust the delay
f_feedback.delay := c_tb_delay.position * f_delayStep;
end;
// -- --
procedure Tc_form_main.myOnDA(sender: tObject; data: pointer; len: unsigned);
begin
c_fftControl_main.fft.write(data, len);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -