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

📄 u_vctalknow_main.pas

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

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

	  u_vcTalkNow_main.pas
	  vcTalkNow 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) 2001, 2007 Lake of Soft, Ltd
		     All rights reserved
	----------------------------------------------

	  created by:
		Lake, ?? Jun 2002

	  modified by:
		Lake, Jun-Dec 2002
		Lake, Jan-Nov 2003
		Lake, Jan-Dec 2004
		Lake, Aug 2005
		Lake, Apr 2007

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

{$I unaDef.inc}

unit
  u_vcTalkNow_main;

interface

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

type
  Tc_form_main = class(TForm)
    //
    waveIn_client: TunavclWaveInDevice;
    waveIn_server: TunavclWaveInDevice;
    codecIn_client: TunavclWaveCodecDevice;
    codecOut_client: TunavclWaveCodecDevice;
    codecIn_server: TunavclWaveCodecDevice;
    codecOut_server: TunavclWaveCodecDevice;
    ipClient: TunavclIPOutStream;
    ipServer: TunavclIPInStream;
    waveOut_client: TunavclWaveOutDevice;
    waveOut_server: TunavclWaveOutDevice;
    //
    c_actionList_main: TActionList;
    a_server_start: TAction;
    a_server_stop: TAction;
    a_client_start: TAction;
    a_client_stop: TAction;
    //
    c_statusBar_main: TStatusBar;
    c_timer_update: TTimer;
    c_splitter_main: TSplitter;
    //
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    //
    MainMenu1: TMainMenu;
    mi_file_root: TMenuItem;
    mi_help_root: TMenuItem;
    mi_help_about: TMenuItem;
    mi_file_listen: TMenuItem;
    mi_file_stop: TMenuItem;
    N1: TMenuItem;
    mi_file_connect: TMenuItem;
    mi_file_disconnect: TMenuItem;
    N2: TMenuItem;
    mi_file_exit: TMenuItem;
    mi_options_root: TMenuItem;
    mi_options_autoActivateSrv: TMenuItem;
    mi_options_LLN: TMenuItem;
    N3: TMenuItem;
    mi_options_maxClients: TMenuItem;
    mi_options_maxClients_1: TMenuItem;
    mi_options_maxClients_2: TMenuItem;
    mi_options_maxClients_10: TMenuItem;
    N4: TMenuItem;
    mi_options_maxClients_unlimited: TMenuItem;
    //
    // server
    c_panel_server: TPanel;
    c_comboBox_socketTypeServer: TComboBox;
    c_edit_serverPort: TEdit;
    c_pb_serverIn: TProgressBar;
    c_button_serverStop: TButton;
    c_button_serverStart: TButton;
    c_label_serverStat: TLabel;
    c_button_configAudioSrv: TButton;
    c_clb_server: TCheckListBox;
    c_pb_serverOut: TProgressBar;
    c_panel_serverGraph: TPanel;
    c_cb_serverBindTo: TComboBox;
    c_label_srCodecInfo: TLabel;
    //
    // client
    c_panel_client: TPanel;
    c_pb_clientIn: TProgressBar;
    c_pb_clientOut: TProgressBar;
    c_button_clientStart: TButton;
    c_button_clientStop: TButton;
    c_button_configAudioCln: TButton;
    c_edit_clientHost: TEdit;
    c_edit_clientPort: TEdit;
    c_comboBox_socketTypeClient: TComboBox;
    c_clb_client: TCheckListBox;
    c_label_clientStat: TLabel;
    c_panel_clientGraph: TPanel;
    c_label_clCodecInfo: TLabel;
    c_cln_bindToIP: TComboBox;
    c_cln_bindToPort: TEdit;
    //
    procedure formCreate(sender: tObject);
    procedure formDestroy(sender: tObject);
    procedure formShow(sender: tObject);
    procedure formCloseQuery(sender: tObject; var canClose: boolean);
    //
    procedure a_server_startExecute(Sender: TObject);
    procedure a_server_stopExecute(Sender: TObject);
    procedure a_client_startExecute(Sender: TObject);
    procedure a_client_stopExecute(Sender: TObject);
    //
    procedure c_timer_updateTimer(Sender: TObject);
    procedure c_comboBox_socketTypeServerChange(Sender: TObject);
    procedure c_comboBox_socketTypeClientChange(Sender: TObject);
    procedure c_button_configAudioSrvClick(sender: tObject);
    procedure c_button_configAudioClnClick(sender: tObject);
    //
    procedure ipServerPacketEvent(sender: TObject; connectionId: cardinal; const packet: unavclInOutIPPacket);
    procedure ipServerSocketEvent(sender: TObject; connectionId: Cardinal; event: unaSocketEvent; data: Pointer; len: Cardinal);
    //
    procedure ipClientClientDisconnect(sender: TObject; connectionId: Cardinal; connected: LongBool);
    procedure ipClientPacketEvent(sender: TObject; connectionId: cardinal; const packet: unavclInOutIPPacket);
    procedure ipClientSocketEvent(sender: TObject; connectionId: Cardinal; event: unaSocketEvent; data: Pointer; len: Cardinal);
    //
    procedure mi_help_aboutClick(Sender: TObject);
    procedure mi_options_autoActivateSrvClick(Sender: TObject);
    procedure mi_options_LLNClick(Sender: TObject);
    procedure mi_file_exitClick(Sender: TObject);
    //
    procedure numClientsClick(Sender: TObject);
    procedure ipClientDataSent(sender: TObject; connectionId: Cardinal; data: Pointer; len: Cardinal);
    procedure ipServerDataSent(sender: TObject; connectionId: Cardinal; data: Pointer; len: Cardinal);
  private
    { Private declarations }
    f_config: unaIniFile;
    f_monitorServer: TunaGridMonitor;
    f_monitorClient: TunaGridMonitor;
    //
    f_waveIn_clientShouldBeClosed: bool;
    //
    procedure updateStatus();
    procedure adjustReceiveBuffers(enabled: bool);
    procedure adjustNumClients(maxNum: int);
  public
    { Public declarations }
  end;

var
  c_form_main: Tc_form_main;


implementation


{$R *.dfm}

uses
  unaUtils, unaVCLUtils, unaWave, unaMsAcmClasses, SysUtils,
  Math, u_common_audioConfig, u_vcTalkNow_about;

// --  --
procedure Tc_form_main.formCreate(Sender: TObject);
var
  list: unaStringList;
begin
  f_config := unaIniFile.create();
  loadControlPosition(self, f_config);
  //
  f_monitorClient := TunaGridMonitor.create(self);
  f_monitorClient.parent := c_panel_clientGraph;
  f_monitorClient.top := 1;
  f_monitorClient.align := alClient;
  //
  f_monitorClient.graphCount := 2;
  f_monitorClient.setGraphColor(0, clRed);
  f_monitorClient.setGraphColor(1, clBlue);
  //
  f_monitorClient.hint := 'Red = bytes received'#13#10'Blue = bytes sent';
  f_monitorClient.showHint := true;
  //
  f_monitorServer := TunaGridMonitor.create(self);
  f_monitorServer.parent := c_panel_serverGraph;
  f_monitorServer.top := 1;
  f_monitorServer.align := alClient;
  //
  f_monitorServer.graphCount := 2;
  f_monitorServer.setGraphColor(0, clRed);
  f_monitorServer.setGraphColor(1, clBlue);
  //
  f_monitorServer.hint := 'Red = bytes received'#13#10'Blue = bytes sent';
  f_monitorServer.showHint := true;
  //
  list := unaStringList.create();
  try
    listAddresses('', list);
    c_cb_serverBindTo.items.clear();
    c_cb_serverBindTo.items.add('0.0.0.0');
    //
    while (c_cb_serverBindTo.items.count <= int(list.count)) do
      c_cb_serverBindTo.items.add(list.get(c_cb_serverBindTo.items.count - 1));
    //
    c_cln_bindToIP.items.assign(c_cb_serverBindTo.items);
    //
  finally
    freeAndNil(list);
  end;
  //
  with (f_config) do begin
    //
    c_comboBox_socketTypeServer.itemIndex := get('server.socket.type', int(0));
    c_comboBox_socketTypeClient.itemIndex := get('client.socket.type', int(0));
    //
    c_edit_serverPort.text := get('server.socket.port', '17820');
    c_cb_serverBindTo.itemIndex := get('server.socket.bindToIndex', int(0));
    if (0 > c_cb_serverBindTo.itemIndex) then
      c_cb_serverBindTo.itemIndex := 0;
    //
    c_cln_bindToIP.itemIndex := get('client.socket.bindToIndex', int(0));
    if (0 > c_cln_bindToIP.itemIndex) then
      c_cln_bindToIP.itemIndex := 0;
    //
    c_edit_clientPort.text := get('client.socket.port', '17820');
    c_edit_clientHost.Text := get('client.socket.host', '192.168.1.1');
    adjustNumClients(get('server.maxClients', int(1)));
    //
    c_cln_bindToPort.text := get('client.socket.bindToPort', '0');
    //
    case (ipServer.maxClients) of

       1: mi_options_maxClients_1.checked := true;
       2: mi_options_maxClients_2.checked := true;
      10: mi_options_maxClients_10.checked := true;

      else
	  mi_options_maxClients_unlimited.checked := true;
    end;
    //
    mi_options_autoActivateSrv.checked := get('server.config.autoStart', true);
    mi_options_LLN.checked := get('network.longLatency', false);
    //
    c_comboBox_socketTypeServerChange(sender);
    c_comboBox_socketTypeClientChange(sender);
  end;
  //
{$IFDEF DEBUG }
{$ELSE }
  c_clb_server.visible := false;
  c_clb_client.visible := false;
  c_label_srCodecInfo.visible := false;
  c_label_clCodecInfo.visible := false;
{$ENDIF }
end;

// --  --
procedure Tc_form_main.formDestroy(sender: tObject);
begin
  freeAndNil(f_config);
end;

// --  --
procedure Tc_form_main.formShow(sender: tObject);
begin
  c_form_common_audioConfig.setupUI(true);
  c_form_common_audioConfig.doLoadConfig(waveIn_server, waveOut_server, codecIn_server, nil, f_config, 'waveConfig.server');
  c_form_common_audioConfig.doLoadConfig(waveIn_client, waveOut_client, codecIn_client, nil, f_config, 'waveConfig.client');
  //
  adjustReceiveBuffers(mi_options_LLN.checked);
  //
  if (mi_options_autoActivateSrv.checked) then
    a_server_start.execute();
  //
  f_monitorClient.updateInterval := c_timer_update.interval;
  f_monitorServer.updateInterval := c_timer_update.interval;
  //
  f_monitorClient.active := true;
  f_monitorServer.active := true;
end;

// --  --
procedure Tc_form_main.formCloseQuery(sender: tObject; var canClose: boolean);
begin
  c_timer_update.enabled := false;
  //
  f_monitorClient.active := false;
  f_monitorServer.active := false;
  //
  //a_server_stop.execute();
  //a_client_stop.execute();
  //
  with (f_config) do begin
    //
    setValue('server.socket.type', c_comboBox_socketTypeServer.ItemIndex);
    setValue('server.socket.port', c_edit_serverPort.Text);
    setValue('server.socket.bindToIndex', c_cb_serverBindTo.itemIndex);
    setValue('server.maxClients', ipServer.maxClients);
    //
    setValue('client.socket.type', c_comboBox_socketTypeClient.ItemIndex);
    setValue('client.socket.port', c_edit_clientPort.Text);
    setValue('client.socket.host', c_edit_clientHost.Text);
    setValue('client.socket.bindToIndex', c_cln_bindToIP.itemIndex);
    setValue('client.socket.bindToPort', c_cln_bindToPort.text);
    //
    setValue('server.config.autoStart', mi_options_autoActivateSrv.checked);
    setValue('network.longLatency', mi_options_LLN.checked);
  end;
  //
  saveControlPosition(self, f_config);
end;

// --  --
procedure Tc_form_main.updateStatus();

{$IFDEF DEBUG }

  // --  --
  function deviceInfo(device: unavclInOutWavePipe): string;
  begin
    result := 'Src=' + device.device.srcFormatInfo + ';  Dst=' + device.device.dstFormatInfo;
  end;

  // --  --
  function codecInfo(device: TunavclWaveCodecDevice): string;
  begin
    case (device.driverMode) of

      unacdm_acm: begin
	//
	result := 'ACM:  Src=' + device.codec.srcFormatInfo + '; Dst= ' + device.codec.dstFormatInfo;
      end;

      unacdm_openH323plugin: begin
	//
	result := 'H323P: ' + device.driverLibrary + ',  formatIndex=' + int2str(device.formatTag);
      end;

    end;
  end;

⌨️ 快捷键说明

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