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