📄 u_vctalknow_main.pas
字号:
{$ENDIF }
var
serverIsOn: bool;
clientIsOn: bool;
begin
if (not (csDestroying in componentState)) then begin
//
serverIsOn := ipServer.active;
//
a_server_start.enabled := not serverIsOn;
a_server_stop.enabled := serverIsOn;
//
c_comboBox_socketTypeServer.enabled := not serverIsOn;
c_edit_serverPort.enabled := not serverIsOn;
c_cb_serverBindTo.enabled := not serverIsOn;
c_button_configAudioSrv.enabled := not serverIsOn;
//
clientIsOn := ipClient.active;
//
a_client_start.enabled := not clientIsOn;
a_client_stop.enabled := clientIsOn and ipClient.isConnected;
//
c_comboBox_socketTypeClient.enabled := not clientIsOn;
c_edit_clientPort.enabled := not clientIsOn;
c_edit_clientHost.enabled := not clientIsOn;
c_button_configAudioCln.enabled := not clientIsOn;
//
c_cln_bindToIP.enabled := not clientIsOn;
c_cln_bindToPort.enabled := not clientIsOn;
//
mi_options_LLN.enabled := not serverIsOn and not clientIsOn;
mi_options_maxClients.enabled := not serverIsOn;
//
c_label_serverStat.caption := ' Server [in/out: ' + int2str(ipServer.bytesReceived shr 10, 10, 3) + '/' + int2str(ipServer.bytesSent shr 10, 10, 3) + ' KB] [Num. of Clients: ' + int2Str(ipServer.clientCount) + '/' + int2str(ipServer.maxClients) + ']';
c_label_clientStat.caption := ' Client [in/out: ' + int2str(ipClient.bytesReceived shr 10, 10, 3) + '/' + int2str(ipClient.bytesSent shr 10, 10, 3) + ' KB] [Lost: ' + int2Str(ipClient.inPacketsOutOfSeq) + ' packets]';
//
c_statusBar_main.panels[0].text := 'Mem: ' + int2Str(ams() shr 10, 10, 3) + ' KB';
//
{$IFDEF DEBUG }
c_clb_server.visible := true;
c_clb_client.visible := true;
c_label_srCodecInfo.visible := true;
c_label_clCodecInfo.visible := true;
//
c_clb_server.checked[0] := waveIn_server.active;
c_clb_server.checked[1] := codecIn_server.active;
c_clb_server.checked[2] := ipServer.active;
c_clb_server.checked[3] := codecOut_server.active;
c_clb_server.checked[4] := waveOut_server.active;
//
c_clb_server.items[0] := 'waveIn - In/Out: ' + int2str(waveIn_server.inBytes) + '/' + int2str(waveIn_server.outBytes);
c_clb_server.items[1] := 'codecIn - In/Out: ' + int2str(codecIn_server.inBytes) + '/' + int2str(codecIn_server.outBytes);
c_clb_server.items[2] := 'ipServer - In/Out: ' + int2str(ipServer.inBytes) + '/' + int2str(ipServer.outBytes);
c_clb_server.items[3] := 'codecOut - In/Out: ' + int2str(codecOut_server.inBytes) + '/' + int2str(codecOut_server.outBytes);
c_clb_server.items[4] := 'waveOut - In/Out: ' + int2str(waveOut_server.inBytes) + '/' + int2str(waveOut_server.outBytes);
//
case (c_clb_server.itemIndex) of
0: c_label_srCodecInfo.caption := deviceInfo(waveIn_server);
1: c_label_srCodecInfo.caption := codecInfo(codecIn_server);
3: c_label_srCodecInfo.caption := codecInfo(codecOut_server);
4: c_label_srCodecInfo.caption := deviceInfo(waveOut_server);
else
c_label_srCodecInfo.caption := '';
end;
//
//
c_clb_client.checked[0] := waveIn_client.active;
c_clb_client.checked[1] := codecIn_client.active;
c_clb_client.checked[2] := ipClient.active;
c_clb_client.checked[3] := codecOut_client.active;
c_clb_client.checked[4] := waveOut_client.active;
//
c_clb_client.items[0] := 'waveIn - In/Out: ' + int2str(waveIn_client.inBytes) + '/' + int2str(waveIn_client.outBytes);
c_clb_client.items[1] := 'codecIn - In/Out: ' + int2str(codecIn_client.inBytes) + '/' + int2str(codecIn_client.outBytes);
c_clb_client.items[2] := 'ipClient - In/Out: ' + int2str(ipClient.inBytes) + '/' + int2str(ipClient.outBytes);
c_clb_client.items[3] := 'codecOut - In/Out: ' + int2str(codecOut_client.inBytes) + '/' + int2str(codecOut_client.outBytes);
c_clb_client.items[4] := 'waveOut - In/Out: ' + int2str(waveOut_client.inBytes) + '/' + int2str(waveOut_client.outBytes);
//
case (c_clb_client.itemIndex) of
0: c_label_clCodecInfo.caption := deviceInfo(waveIn_client);
1: c_label_clCodecInfo.caption := codecInfo(codecIn_client);
3: c_label_clCodecInfo.caption := codecInfo(codecOut_client);
4: c_label_clCodecInfo.caption := deviceInfo(waveOut_client);
else
c_label_clCodecInfo.caption := '';
end;
{$ELSE}
{$ENDIF}
end;
end;
// -- --
procedure Tc_form_main.a_server_startExecute(Sender: TObject);
begin
a_server_start.enabled := false;
//
ipServer.port := c_edit_serverPort.text;
ipServer.bindTo := c_cb_serverBindTo.text;
//
// activate server
waveIn_server.open();
//
if (not waveIn_server.active) then begin
//
waveIn_server.close();
raise exception.create('Unable to open waveIn device, error text: '#13#10 + waveIn_server.waveErrorAsString);
end;
end;
// -- --
procedure Tc_form_main.a_server_stopExecute(Sender: TObject);
begin
a_server_stop.enabled := false;
// stop server
waveIn_server.close();
end;
// -- --
procedure Tc_form_main.a_client_startExecute(Sender: TObject);
begin
a_client_start.enabled := false;
f_waveIn_clientShouldBeClosed := false;
//
ipClient.port := c_edit_clientPort.Text;
ipClient.host := c_edit_clientHost.Text;
ipClient.bindTo := c_cln_bindToIP.text;
ipClient.bindToPort := c_cln_bindToPort.text;
// activate wave components
waveIn_client.open();
//
if (not waveIn_client.active) then begin
//
waveIn_client.close();
//
raise exception.create('Unable to open waveIn device, error text: '#13#10 + waveIn_client.waveErrorAsString);
end;
end;
// -- --
procedure Tc_form_main.a_client_stopExecute(Sender: TObject);
begin
a_client_stop.enabled := false;
// stop client
waveIn_client.close();
end;
// -- --
procedure Tc_form_main.ipClientClientDisconnect(sender: tObject; connectionId: cardinal; connected: longBool);
begin
// since client may be disconnected explicitly, we need to care about closing other devices
if (c_timer_update.enabled) then begin
//
// this may not work, because it may happen _before_ waveIn get active = true
//
//waveIn_client.close(100); // do not hammer client components with long timeouts..
//
f_waveIn_clientShouldBeClosed := true;
end;
end;
// -- --
procedure Tc_form_main.c_timer_updateTimer(Sender: TObject);
begin
if (not (csDestroying in componentState)) then begin
//
updateStatus();
//
c_pb_clientIn.position := waveGetLogVolume(waveIn_client.device.getVolume());
c_pb_clientOut.position := waveGetLogVolume(waveOut_client.device.getVolume());
//
c_pb_serverIn.position := waveGetLogVolume(waveIn_server.device.getVolume());
c_pb_serverOut.position := waveGetLogVolume(waveOut_server.device.getVolume());
//
if (f_waveIn_clientShouldBeClosed) then begin
//
waveIn_client.close();
f_waveIn_clientShouldBeClosed := false;
end;
end;
end;
// -- --
procedure Tc_form_main.c_comboBox_socketTypeServerChange(Sender: TObject);
begin
if (0 = c_comboBox_socketTypeServer.itemIndex) then
ipServer.proto := unapt_UDP
else
ipServer.proto := unapt_TCP;
end;
// -- --
procedure Tc_form_main.c_comboBox_socketTypeClientChange(Sender: TObject);
begin
if (0 = c_comboBox_socketTypeClient.itemIndex) then
ipClient.proto := unapt_UDP
else
ipClient.proto := unapt_TCP;
end;
// -- --
procedure Tc_form_main.ipServerPacketEvent(sender: TObject; connectionId: cardinal; const packet: unavclInOutIPPacket);
begin
case (packet.r_command) of
//
cmd_inOutIPPacket_audio:
f_monitorServer.setValue(0, packet.r_dataSize);
end;
end;
// -- --
procedure Tc_form_main.ipClientPacketEvent(sender: TObject; connectionId: cardinal; const packet: unavclInOutIPPacket);
begin
case (packet.r_command) of
//
cmd_inOutIPPacket_audio:
f_monitorClient.setValue(0, packet.r_dataSize);
cmd_inOutIPPacket_outOfSeats: begin
//
if (c_timer_update.enabled) then begin
//
// server is out of seats for us :(
guiMessageBox(handle, 'Server is out of seats.', 'Unable to connect', MB_OK);
end;
end;
end;
end;
// -- --
procedure Tc_form_main.c_button_configAudioSrvClick(sender: tObject);
begin
c_form_common_audioConfig.doConfig(waveIn_server, waveOut_server, codecIn_server, nil, f_config, 'waveConfig.server');
end;
// -- --
procedure Tc_form_main.c_button_configAudioClnClick(Sender: TObject);
begin
c_form_common_audioConfig.doConfig(waveIn_client, waveOut_client, codecIn_client, nil, f_config, 'waveConfig.client');
end;
// -- --
procedure Tc_form_main.mi_help_aboutClick(sender: tObject);
begin
c_form_about.showAbout();
end;
// -- --
procedure Tc_form_main.mi_options_autoActivateSrvClick(Sender: TObject);
begin
mi_options_autoActivateSrv.checked := not mi_options_autoActivateSrv.checked;
end;
// -- --
procedure Tc_form_main.mi_options_LLNClick(Sender: TObject);
begin
mi_options_LLN.checked := not mi_options_LLN.checked;
//
adjustReceiveBuffers(mi_options_LLN.checked);
end;
// -- --
procedure Tc_form_main.adjustReceiveBuffers(enabled: bool);
var
size: unsigned;
begin
size := choice(enabled, 40, unsigned(5));
//
if (enabled) then begin
// adjust size of receive buffers
codecOut_server.overNum := size;
waveOut_server.overNum := size;
codecIn_server.overNum := size;
waveIn_server.overNum := size;
end;
end;
// -- --
procedure Tc_form_main.mi_file_exitClick(Sender: TObject);
begin
close();
end;
// -- --
procedure Tc_form_main.numClientsClick(Sender: TObject);
begin
if (sender is tMenuItem) then begin
//
adjustNumClients((sender as tMenuItem).tag);
//
(sender as tMenuItem).checked := true;
end;
end;
// -- --
procedure Tc_form_main.adjustNumClients(maxNum: int);
begin
// make sure server is stopped
a_server_stop.execute();
//
if (1 <> maxNum) then
ipServer.consumer := nil // no sence to feed output with more than one client
else
ipServer.consumer := codecOut_server; // feed output with one client
//
ipServer.maxClients := maxNum;
end;
// -- --
procedure Tc_form_main.ipServerSocketEvent(sender: TObject; connectionId: Cardinal; event: unaSocketEvent; data: Pointer; len: Cardinal);
begin
case (event) of
unaseThreadStartupError: begin
//
if (c_timer_update.enabled) then begin
//
guiMessageBox(handle, 'Server cannot startup.'#13#10'Check if server port is not used by other applications, and address to bind to is correct.', 'Server Soket Error', MB_OK);
waveIn_server.close();
end;
end;
end;
end;
// -- --
procedure Tc_form_main.ipClientSocketEvent(sender: TObject; connectionId: Cardinal; event: unaSocketEvent; data: Pointer; len: Cardinal);
begin
case (event) of
unaseThreadStartupError: begin
//
if (c_timer_update.enabled) then begin
//
guiMessageBox(handle, 'Client cannot connect.'#13#10'Check if server is up and running and both server address and port are correct.', 'Client Soket Error', MB_OK);
waveIn_client.close();
end;
end;
end;
end;
// -- --
procedure Tc_form_main.ipClientDataSent(sender: TObject; connectionId: Cardinal; data: Pointer; len: Cardinal);
begin
f_monitorClient.setValue(1, len);
end;
// -- --
procedure Tc_form_main.ipServerDataSent(sender: TObject; connectionId: Cardinal; data: Pointer; len: Cardinal);
begin
f_monitorServer.setValue(1, len);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -