📄 u_vctalknow_main.pas
字号:
(*
----------------------------------------------
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 + -