📄 u_voicerec_main.pas
字号:
(*
----------------------------------------------
u_voiceRec_main.pas - voiceRecDemo main form source
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, 01 Jun 2002
modified by:
Lake, Jun-Dec 2002
Lake, Feb-Apr 2003
Lake, Oct 2005
Lake, Mar 2007
----------------------------------------------
*)
{$I unaDef.inc}
unit u_voiceRec_main;
interface
uses
Windows, unaTypes, unaClasses,
Forms, ExtCtrls, Classes, ActnList, StdCtrls, Controls,
unavcIDE, ComCtrls, Dialogs;
type
Tc_form_voiceRecMain = class(TForm)
waveIn: TunavclWaveInDevice;
wavWrite: TunavclWaveRiff;
c_edit_fileName: TEdit;
Label1: TLabel;
c_button_start: TButton;
c_button_stop: TButton;
c_ac_main: TActionList;
a_start: TAction;
a_stop: TAction;
c_timer_update: TTimer;
c_trackBar_minVolume: TTrackBar;
c_statusBar_main: TStatusBar;
c_label_min: TLabel;
c_progressBar_level: TProgressBar;
c_button_browse: TButton;
c_saveDialog_fileName: TSaveDialog;
waveOut: TunavclWaveOutDevice;
c_checkBox_loop: TCheckBox;
c_button_playback: TButton;
a_play: TAction;
c_label_status: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
c_label_vol: TLabel;
wavRead: TunavclWaveRiff;
c_button_ac: TButton;
c_staticText_formatSrc: TStaticText;
c_staticText_statRaw: TStaticText;
c_staticText_statWave: TStaticText;
codecFormat: TunavclWaveCodecDevice;
c_staticText_formatDst: TStaticText;
Label2: TLabel;
Label3: TLabel;
c_cb_newLDmethod: TCheckBox;
c_panel_dspParams: TPanel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
c_l_LD_attack: TLabel;
c_l_LD_release: TLabel;
c_l_ND_HP: TLabel;
c_l_ND_LP: TLabel;
c_l_ND_threshold: TLabel;
c_l_ND_smoothing: TLabel;
c_tb_LD_attack: TTrackBar;
c_tb_LD_release: TTrackBar;
c_rb_LD_RMS: TRadioButton;
c_rb_LD_PEAK: TRadioButton;
c_tb_ND_HP: TTrackBar;
c_tb_ND_LP: TTrackBar;
c_tb_ND_threshold: TTrackBar;
c_tb_ND_smoothing: TTrackBar;
//
procedure formCreate(sender: tObject);
procedure formDestroy(sender: tObject);
procedure formShow(sender: tObject);
procedure formCloseQuery(sender: TObject; var canClose: boolean);
//
procedure a_startExecute(Sender: TObject);
procedure a_stopExecute(Sender: TObject);
procedure a_playExecute(Sender: TObject);
//
procedure c_trackBar_minVolumeChange(sender: tObject);
procedure c_button_browseClick(sender: tObject);
procedure c_checkBox_loopClick(sender: tObject);
procedure c_edit_fileNameChange(sender: tObject);
procedure c_timer_updateTimer(sender: tObject);
procedure c_button_acClick(sender: tObject);
//
procedure waveInDataAvailable(sender: unavclInOutPipe; data: pointer; len: cardinal);
procedure c_cb_newLDmethodClick(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_smoothingChange(sender: tObject);
procedure c_tb_ND_thresholdChange(sender: tObject);
procedure ld_type_change(sender: tObject);
private
{ Private declarations }
f_sampleSize: unsigned;
f_config: unaIniFile;
f_doLoop: bool;
//
procedure displayFormat();
public
{ Public declarations }
end;
var
c_form_voiceRecMain: Tc_form_voiceRecMain;
implementation
{$R *.dfm}
uses
unaUtils, unaVCLUtils, sysUtils,
unaDspLibH, unaMsAcmClasses,
MMSystem, unaMsAcmApi, unaVcIDEutils, u_common_audioConfig;
// -- --
procedure Tc_form_voiceRecMain.formCreate(sender: tObject);
begin
f_config := unaIniFile.create();
//
c_trackBar_minVolumeChange(nil);
waveIn.waveInDevice.minActiveTime := f_config.get('gui.wave.in.minActiveTime', int(500));
c_trackBar_minVolume.position := f_config.get('gui.wave.in.minVolume', c_trackBar_minVolume.position);
c_checkBox_loop.checked := f_config.get('gui.wave.in.loop', false);
//
c_tb_LD_attack.position := f_config.get('ld.attack', int(44)); // assuming 44100 sampling rate by default
c_tb_LD_release.position := f_config.get('ld.release', int(88)); // assuming 44100 sampling rate by default
//
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_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)); //
//
c_cb_newLDmethod.checked := f_config.get('dspld.enabled', true); //
//
c_cb_newLDmethodClick(sender);
//
// update labels and values
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);
//
c_trackBar_minVolumeChange(sender);
//
c_edit_fileName.text := f_config.get('gui.file.name', extractFilePath(paramStr(0)) + 'testRecording.wav');
end;
// -- --
procedure Tc_form_voiceRecMain.formDestroy(sender: tObject);
begin
end;
// -- --
procedure Tc_form_voiceRecMain.formShow(sender: tObject);
begin
loadControlPosition(self, f_config);
//
c_form_common_audioConfig.setupUI(true, true, false);
c_form_common_audioConfig.doLoadConfig(waveIn, waveOut, codecFormat, nil, f_config);
wavWrite.formatTag := codecFormat.formatTag;
f_sampleSize := (waveIn.pcm_bitsPerSample shr 3 * waveIn.pcm_numChannels);
//
displayFormat();
//
c_edit_fileNameChange(sender);
//
c_timer_update.enabled := true;
end;
// -- --
procedure Tc_form_voiceRecMain.formCloseQuery(sender: tObject; var canClose: boolean);
begin
c_timer_update.enabled := false;
//
f_config.setValue('gui.wave.in.minActiveTime', waveIn.waveInDevice.minActiveTime);
f_config.setValue('gui.wave.in.minVolume', c_trackBar_minVolume.position);
f_config.setValue('gui.wave.in.loop', c_checkBox_loop.checked);
//
f_config.setValue('gui.file.name', c_edit_fileName.text);
//
f_config.setValue('ld.attack', c_tb_LD_attack.position); // assuming 44100 sampling rate by default
f_config.setValue('ld.release', c_tb_LD_release.position); // assuming 44100 sampling rate by default
//
f_config.setValue('ld.type.isRMS', c_rb_LD_RMS.checked); // RMS by default
//
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); // * 0.1
f_config.setValue('nd.smoothing', c_tb_ND_smoothing.position); //
//
f_config.setValue('dspld.enabled', c_cb_newLDmethod.checked); //
//
saveControlPosition(self, f_config);
//
a_stop.execute();
end;
// -- --
procedure Tc_form_voiceRecMain.a_startExecute(Sender: TObject);
begin
wavWrite.fileName := c_edit_fileName.Text;
//
waveIn.open();
if (waveIn.active) then begin
//
waveOut.pcmFormat := waveIn.pcmFormat;
waveOut.open();
//
a_start.enabled := false;
a_stop.enabled := true;
a_play.enabled := false;
//
c_button_ac.enabled := false;
end
else
raise exception.create('Unable to open waveIn device, error text: '#13#10 + waveIn.waveErrorAsString);
end;
// -- --
procedure Tc_form_voiceRecMain.a_stopExecute(Sender: TObject);
begin
waveIn.close();
wavRead.close();
waveOut.close();
//
a_start.enabled := true;
a_stop.enabled := false;
a_play.enabled := true;
//
c_button_ac.enabled := true;
c_checkBox_loop.enabled := true;
//
c_edit_fileNameChange(sender);
end;
// -- --
procedure Tc_form_voiceRecMain.c_timer_updateTimer(Sender: TObject);
var
stat: string;
begin
if not (csDestroying in ComponentState) then begin
//
if (waveIn.active) then begin
//
if (waveIn.waveInDevice.isSilence) then
stat := 'paused'
else
stat := 'recording';
end
else begin
//
if (waveOut.active) then
//
if (wavRead.active and not wavRead.waveStream.streamIsDone) then
stat := 'playing back'
else
stat := 'finished playback'
else
stat := 'stopped';
//
end;
//
c_label_status.caption := 'Status: ' + stat;
//
c_progressBar_level.position := waveIn.waveInDevice.getVolume() div 100;
//
c_label_min.caption := int2Str(waveIn.minVolumeLevel);
c_label_vol.caption := int2Str(waveIn.waveInDevice.getVolume());
//
c_statusBar_main.panels[0].text := int2Str(ams() shr 10, 10, 3) + ' KB';
c_staticText_statRaw.caption := 'Raw input: ' + int2Str(waveIn.outBytes div f_sampleSize, 10, 3) + ' samples';
c_staticText_statWave.caption := 'Wave file: ' + int2str(wavWrite.waveStream.streamSize, 10, 3) + ' bytes';
end;
end;
// -- --
procedure Tc_form_voiceRecMain.c_trackBar_minVolumeChange(Sender: TObject);
begin
with (c_trackBar_minVolume) do
waveIn.minVolumeLevel := (max - position) * 100;
end;
// -- --
procedure Tc_form_voiceRecMain.c_button_browseClick(Sender: TObject);
begin
if (c_saveDialog_fileName.execute) then
c_edit_fileName.text := c_saveDialog_fileName.fileName;
end;
// -- --
procedure Tc_form_voiceRecMain.c_checkBox_loopClick(Sender: TObject);
begin
f_doLoop := c_checkBox_loop.checked;
end;
// -- --
procedure Tc_form_voiceRecMain.c_edit_fileNameChange(Sender: TObject);
var
ok: bool;
begin
ok := ('' <> trim(c_edit_fileName.text));
//
a_start.enabled := (not waveIn.active and ok);
a_play.enabled := (not waveOut.active and ok);
end;
// -- --
procedure Tc_form_voiceRecMain.waveInDataAvailable(sender: unavclInOutPipe; data: Pointer; len: Cardinal);
begin
if (f_doLoop) then
waveOut.write(data, len);
end;
// -- --
procedure Tc_form_voiceRecMain.a_playExecute(Sender: TObject);
begin
a_play.enabled := false;
a_start.enabled := false;
a_stop.enabled := true;
//
c_button_ac.enabled := false;
c_checkBox_loop.enabled := false;
//
wavRead.fileName := c_edit_fileName.text;
wavRead.open();
end;
// -- --
procedure Tc_form_voiceRecMain.c_button_acClick(Sender: TObject);
begin
c_form_common_audioConfig.doConfig(waveIn, waveOut, codecFormat, nil, f_config);
wavWrite.formatTag := codecFormat.formatTag;
f_sampleSize := (waveIn.pcm_bitsPerSample shr 3 * waveIn.pcm_numChannels);
//
displayFormat();
//
c_cb_newLDmethod.checked := (waveIn.silenceDetectionMode = unasdm_DSP);
c_cb_newLDmethodClick(sender);
end;
// -- --
procedure Tc_form_voiceRecMain.displayFormat();
begin
c_staticText_formatSrc.caption := codecFormat.codec.srcFormatInfo;
c_staticText_formatDst.caption := codecFormat.codec.dstFormatInfo;
end;
// -- --
procedure Tc_form_voiceRecMain.c_cb_newLDmethodClick(sender: tObject);
begin
if (c_cb_newLDmethod.checked) then
waveIn.silenceDetectionMode := unasdm_DSP
else
waveIn.silenceDetectionMode := unasdm_VC;
//
waveIn.calcVolume := true; // must remain true, may be set to false when SD mode is changed
//
c_panel_dspParams.visible := c_cb_newLDmethod.checked;
c_trackBar_minVolume.visible := not c_cb_newLDmethod.checked;
c_label_min.visible := c_trackBar_minVolume.visible;
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_LD_attackChange(Sender: TObject);
begin
c_l_LD_attack.caption := int2str(c_tb_LD_attack.position);
//
waveIn.device.setDspProperty(true, DSPL_PID or DSPL_P_ATTACK, c_tb_LD_attack.position);
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_LD_releaseChange(Sender: TObject);
begin
c_l_LD_release.caption := int2str(c_tb_LD_release.position);
//
waveIn.device.setDspProperty(true, DSPL_PID or DSPL_P_RELEASE, c_tb_LD_release.position);
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_ND_HPChange(Sender: TObject);
begin
c_l_ND_HP.caption := int2str(c_tb_ND_HP.position);
//
waveIn.device.setDspProperty(false, DSPL_PID or DSPL_P_NFRQ or DSPL_ND_BAND_HP, c_tb_ND_HP.position);
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_ND_LPChange(Sender: TObject);
begin
c_l_ND_LP.caption := int2str(c_tb_ND_LP.position);
//
waveIn.device.setDspProperty(false, DSPL_PID or DSPL_P_NFRQ or DSPL_ND_BAND_LP, c_tb_ND_LP.position);
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_ND_smoothingChange(Sender: TObject);
begin
c_l_ND_threshold.caption := '0.' + int2str(c_tb_ND_threshold.position);
//
waveIn.device.setDspProperty(false, DSPL_PID or DSPL_P_THRESHOLD, c_tb_ND_threshold.position * 0.1);
end;
// -- --
procedure Tc_form_voiceRecMain.c_tb_ND_thresholdChange(Sender: TObject);
begin
c_l_ND_smoothing.caption := int2str(c_tb_ND_smoothing.position);
//
waveIn.device.setDspProperty(false, DSPL_PID or DSPL_P_OTHER, c_tb_ND_smoothing.position);
end;
// -- --
procedure Tc_form_voiceRecMain.ld_type_change(Sender: TObject);
begin
waveIn.device.setDspProperty(true, DSPL_PID or DSPL_P_TYPE, choice(c_rb_LD_RMS.checked, DSPL_LD_RMS, int(DSPL_LD_PEAK)));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -