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

📄 u_daf_main.pas

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