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

📄 u_voicerec_main.pas

📁 Voice Commnucation Components for Delphi
💻 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 + -