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

📄 u_vc_main.pas

📁 Voice Commnucation Components for Delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:

(*
	----------------------------------------------

	  u_vc_main.pas
	  vcVoiceChat demo application - main form source

	----------------------------------------------
	  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) 2002-2007 Lake of Soft, Ltd
		     All rights reserved
	----------------------------------------------

	  created by:
		Lake, 25 Jan 2003

	  modified by:
		Lake, Jan 2003
		Lake, Oct 2005
		Lake, Jan-Apr 2007

	----------------------------------------------
*)

{$I unaDef.inc}

unit u_vc_main;

interface

uses
  Windows, unaTypes, unaClasses, unaSockets, unaVcIDE,
  Forms, Messages, StdActns, Classes, ActnList, Menus, Controls,
  StdCtrls, ComCtrls, ExtCtrls, CheckLst;

const
  WM_ADDOUTTEXT	= WM_USER + 1;

type
  Tc_form_main = class(TForm)
    c_memo_remote: TMemo;
    c_mainMenu: TMainMenu;
    c_actionList_main: TActionList;
    a_chat_beClient: TAction;
    a_chat_beServer: TAction;
    mi_file: TMenuItem;
    mi_chat_goClient: TMenuItem;
    mi_chat_goServer: TMenuItem;
    mi_file_exit: TMenuItem;
    c_splitter_main: TSplitter;
    c_memo_client: TMemo;
    c_statusBar_main: TStatusBar;
    c_timer_update: TTimer;
    waveIn: TunavclWaveInDevice;
    codecIn: TunavclWaveCodecDevice;
    ipClient: TunavclIPOutStream;
    ipServer: TunavclIPInStream;
    codecOut: TunavclWaveCodecDevice;
    waveOut: TunavclWaveOutDevice;
    a_chat_stop: TAction;
    mi_chat_stop: TMenuItem;
    c_file_exit: TAction;
    mi_edit: TMenuItem;
    mi_edit_audio: TMenuItem;
    mi_edit_clearRemote: TMenuItem;
    mi_editAudio_1: TMenuItem;
    mi_editAudio_2: TMenuItem;
    mi_editAudio_3: TMenuItem;
    mi_options_esd: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    mi_sockets_udp: TMenuItem;
    mi_sockets_tcp: TMenuItem;
    mi_options_auth: TMenuItem;
    c_panel_info: TPanel;
    c_label_info: TLabel;
    Splitter1: TSplitter;
    mi_options_card: TMenuItem;
    c_clb_debug: TCheckListBox;
    mi_editAudio_4: TMenuItem;
    //
    procedure formDestroy(sender: tObject);
    procedure formCreate(sender: tObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    //
    procedure c_timer_updateTimer(sender: tObject);
    //
    procedure a_chat_beServerExecute(sender: tObject);
    procedure a_chat_beClientExecute(sender: tObject);
    procedure a_chat_stopExecute(sender: tObject);
    //
    procedure ipServerServerNewClient(sender: tObject; connectionId: cardinal; connected: longBool);
    procedure ipServerTextData(sender: tObject; connectionId: Cardinal; const data: string);
    procedure ipServerSocketEvent(sender: TObject; connectionId: Cardinal; event: unaSocketEvent; data: Pointer; len: Cardinal);
    procedure ipServerAcceptClient(sender: TObject; connectionId: Cardinal; var accept: LongBool);
    procedure ipServerServerClientDisconnect(sender: TObject; connectionId: Cardinal; connected: LongBool);
    procedure ipServerDataSent(sender: TObject; connectionId: Cardinal; data: Pointer; len: Cardinal);
    //
    procedure ipClientClientConnect(sender: tObject; connectionId: cardinal; connected: longBool);
    procedure ipClientTextData(sender: tObject; connectionId: Cardinal; const data: string);
    procedure ipClientClientDisconnect(sender: TObject; connectionId: Cardinal; connected: LongBool);
    //
    procedure c_memo_clientKeyPress(sender: tObject; var key: char);
    procedure c_file_exitExecute(sender: tObject);
    //
    procedure mi_edit_clearRemoteClick(sender: tObject);
    procedure mi_editAudio_click(sender: tObject);
    procedure mi_options_esdClick(sender: tObject);
    procedure mi_sockets_udpClick(Sender: TObject);
    procedure mi_sockets_tcpClick(Sender: TObject);
    procedure mi_options_authClick(Sender: TObject);
  private
    { Private declarations }
    f_host: string;
    f_config: unaIniFile;
    //
    f_needEnableClientMemo: bool;
    f_needDisableClientMemo: bool;
    //
    f_delayedStrings: tStringList;
    f_socketProto: tunavclProtoType;
    f_authPass: string;
    f_remotePass: string;
    f_authTakeCare: bool;
    f_authTM: int64;
    //
    procedure loadConfig();
    //
    procedure serverAction(doStart: bool);
    procedure clientAction(doStart: bool);
    procedure silenceDetectionChanged(isEnabled: bool);
    //
    procedure checkServerClientOptions();
    //
    procedure onWMAddOutText(var msg: TMessage); message WM_ADDOUTTEXT;
  public
    { Public declarations }
  end;

var
  c_form_main: Tc_form_main;


implementation


{$R *.dfm}

uses
  unaUtils, unaVclUtils, unaMsAcmClasses,
  Dialogs, Graphics;

var
  // must be global vars!
  msg1: string;
  msg2: string;
  msg3: string;
  msg4: string;
  msg5: string;


const
  pw_prefix = '$PW$:';

// --  --
procedure Tc_form_main.formDestroy(sender: TObject);
begin
  f_config.setValue('ip.client.remoteServer', f_host);
  f_config.setValue('ip.connection.proto', ord(f_socketProto));
  //
  saveControlPosition(self, f_config);
  freeAndnil(f_config);
  freeAndnil(f_delayedStrings);
end;

// --  --
procedure Tc_form_main.loadConfig();
begin
  loadControlPosition(self, f_config);
  //
  f_host := f_config.get('ip.client.remoteServer', '192.168.0.1');
  //
  f_needEnableClientMemo := false;
  f_needDisableClientMemo := true;
  //
  f_socketProto := tunavclProtoType(f_config.get('ip.connection.proto', ord(unapt_UDP)));
  if (unapt_UDP = f_socketProto) then
    mi_sockets_udp.checked := true
  else
    mi_sockets_tcp.checked := true;
  //
  waveIn.pcm_samplesPerSec := f_config.get('wave.samplesPerSec', unsigned(22050));
  case (waveIn.pcm_samplesPerSec) of

    8000:
      mi_editAudio_1.checked := true;

    11025:
      mi_editAudio_2.checked := true;

    else
      mi_editAudio_3.checked := true;

  end;
  //
  mi_options_esd.checked := f_config.get('wave.silenceDetectionEnabled', true);
  silenceDetectionChanged(mi_options_esd.checked);
  //
  f_authPass := f_config.get('auth.pw', '');
end;

// --  --
procedure Tc_form_main.formCreate(sender: TObject);
//var
  //i: int;
begin
  f_config := unaIniFile.create();
  f_delayedStrings := tStringList.create();
  //
  //for i := 0 to unaMsAcmClasses.
  //
  loadConfig();
  //
  c_clb_debug.visible := {$IFDEF DEBUG}true{$ELSE}false{$ENDIF};   
end;

// --  --
procedure Tc_form_main.c_file_exitExecute(Sender: TObject);
begin
  close();
end;

// --  --
procedure Tc_form_main.c_timer_updateTimer(Sender: TObject);
begin
  if (not (csDestroying in componentState)) then begin
    //
    {$IFDEF DEBUG }
    c_statusBar_main.panels[0].text := int2str(ams() shr 10, 10, 3) + ' KB';
    {$ENDIF }
    //
    a_chat_beServer.enabled := not ipServer.active;
    a_chat_beClient.enabled := not ipClient.active;
    //
    if (not a_chat_beServer.enabled and a_chat_beClient.enabled) then begin
      //
      c_statusBar_main.panels[1].text := 'Mode: Server';
      a_chat_stop.enabled := true;
      mi_edit_audio.enabled := false;
    end
    else
      if (a_chat_beServer.enabled and not a_chat_beClient.enabled) then begin
	//
	c_statusBar_main.panels[1].text := 'Mode: Client';
	a_chat_stop.enabled := true;
	mi_edit_audio.enabled := false;
      end
      else begin
	//
	c_statusBar_main.panels[1].text := 'Mode: none';
	a_chat_stop.enabled := false;
	mi_edit_audio.enabled := true;
	//
	waveIn.close();
      end;
    //
    {$IFDEF DEBUG }
    if (c_clb_debug.visible) then begin
      //
      c_clb_debug.checked[0] := waveIn.active;
      c_clb_debug.checked[1] := codecIn.active;
      c_clb_debug.checked[2] := ipClient.active;
      //
      c_clb_debug.checked[4] := ipServer.active;
      c_clb_debug.checked[5] := codecOut.active;
      c_clb_debug.checked[6] := waveOut.active;
    end;
    {$ENDIF }
    //
    c_label_info.caption :=
      'Client sent: '     + int2str(ipClient.inBytes,  10, 3) + ' bytes ' + #13#10 +
      'Client received: ' + int2str(ipClient.outBytes, 10, 3) + ' bytes ' + #13#10 +
      'Server sent: '     + int2str(ipServer.inBytes,  10, 3) + ' bytes ' + #13#10 +
      'Server received: ' + int2str(ipServer.outBytes, 10, 3) + ' bytes ' + #13#10 +
      ''
    ;
    //
    if (f_needDisableClientMemo) then begin
      //
      f_needDisableClientMemo := false;
      //
      c_memo_client.enabled := false;
      c_memo_client.color := clBtnFace;
    end;
    //
    if (f_needEnableClientMemo) then begin
      //
      f_needEnableClientMemo := false;
      //
      c_memo_client.enabled := true;
      c_memo_client.color := clWindow;
      //
      if (showing) then
	windows.setFocus(c_memo_client.handle);
      //
    end;
    //
    while (0 < f_delayedStrings.count) do begin
      //
      try
	if (f_authTakeCare) then
	  c_memo_remote.lines.add(#13#10 + 'Unauthorized (' + int2str( (10000 - timeElapsed64(f_authTM)) div 1000) + ' seconds left) ' + f_delayedStrings[0])
	else
	  c_memo_remote.lines.add(#13#10 + f_delayedStrings[0]);
	//
      finally
      end;
      //
      f_delayedStrings.delete(0);
    end;
    //
    if (f_authTakeCare) then begin
      //
      if (f_authPass = f_remotePass) then begin
	//
	f_authTakeCare := false;
	//
	ipServer.setClientOptions(0{hack, assuming we have only one client)}, c_unaIPServer_co_default{enable in/out data flow});
      end
      else begin
	//
	if (10000 < timeElapsed32(f_authTM)) then
	  ipServer.sendPacket(ipServer.getClientConnId(0{hack, assuming we have only one client)}), cmd_inOutIPPacket_bye); // disconnect client
      end;
      //	  
    end;
  end;
end;

// --  --
procedure Tc_form_main.a_chat_beServerExecute(Sender: TObject);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -