📄 u_vcmcendpoint_main.pas
字号:
(*
----------------------------------------------
u_vcMCendPoint_main.pas
vcMulticast End Point 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) 2005-2007 Lake of Soft, Ltd
All rights reserved
----------------------------------------------
created by:
Lake, 01 Oct 2005
modified by:
Lake, Oct 2005
----------------------------------------------
*)
{$I unaDef.inc }
unit
u_vcMCendPoint_main;
interface
uses
Windows, unaTypes, unaClasses, unaSockets,
Forms, Classes, Controls, ComCtrls, ExtCtrls, unaVCIDE, StdCtrls,
unaDspControls;
type
Tc_form_main = class(TForm)
c_statusBar_main: TStatusBar;
c_label_mcsHost: TLabel;
c_label_mcsPort: TLabel;
c_label_mcsBindTo: TLabel;
c_edit_mcepGroup: TEdit;
c_edit_mcepPort: TEdit;
c_button_mcepStart: TButton;
c_button_mcepStop: TButton;
c_cb_mcepBindTo: TComboBox;
codecOut: TunavclWaveCodecDevice;
c_timer_update: TTimer;
c_fft_main: TunadspFFTControl;
Label1: TLabel;
c_label_status: TLabel;
waveOut: TunavclWaveOutDevice;
//
procedure formCreate(sender: tObject);
procedure formShow(sender: tObject);
procedure formCloseQuery(sender: tObject; var canClose: boolean);
procedure formDestroy(sender: tObject);
//
procedure c_timer_updateTimer(sender: tObject);
procedure c_button_mcepStartClick(Sender: TObject);
procedure c_button_mcepStopClick(Sender: TObject);
private
{ Private declarations }
f_config: unaIniFile;
f_endPoint: unaMulticastSocket;
f_recThread: unaThread;
//
f_received: int64;
f_socketErr: int;
public
{ Public declarations }
end;
var
c_form_main: Tc_form_main;
implementation
{$R *.dfm}
uses
unaUtils, unaVCLUtils, unaVCIDEUtils,
WinSock;
type
//
// -- internal receiver thread --
//
receiverThread = class(unaThread)
private
f_socket: unaMulticastSocket;
f_codec: TunavclWaveCodecDevice;
f_cnt: pInt64;
protected
function execute(id: unsigned): int; override;
public
constructor create(socket: unaMulticastSocket; codec: TunavclWaveCodecDevice; cnt: pInt64);
end;
{ receiverThread }
// -- --
constructor receiverThread.create(socket: unaMulticastSocket; codec: TunavclWaveCodecDevice; cnt: pInt64);
begin
f_socket := socket;
f_codec := codec;
f_cnt := cnt;
//
inherited create();
end;
// -- --
function receiverThread.execute(id: unsigned): int;
var
addr: sockaddr_in;
buf: pointer;
sz: int;
begin
buf := malloc(f_socket.getMTU());
//
try
while (not shouldStop) do begin
//
sz := f_socket.recvfrom(addr, buf, false, 0, 1);
if (0 < sz) then begin
//
f_codec.write(buf, sz);
//
inc(f_cnt^, sz);
end
else
sleep(30);
end;
//
finally
mrealloc(buf);
end;
//
result := 0;
end;
{ Tc_form_main }
// -- --
procedure Tc_form_main.formCreate(sender: tObject);
begin
unaSockets.startup(); // since we are not using unaSocks class here,
// we need to startup and shutdown the sockets explicitly
//
f_config := unaIniFile.create();
f_endPoint := unaMulticastSocket.create();
//
codecOut.addConsumer(c_fft_main.fft);
end;
// -- --
procedure Tc_form_main.formShow(sender: tObject);
var
i: int;
ip: string;
begin
loadControlPosition(self, f_config);
//
c_edit_mcepGroup.text := f_config.get('mc', 'groupIP', '224.0.1.2');
c_edit_mcepPort.text := f_config.get('mc', 'port', '18000');
//
c_cb_mcepBindTo.clear();
c_cb_mcepBindTo.items.add('0.0.0.0');
//
with (unaStringList.create()) do try
//
lookupHost('', ip, (_this as unaStringList));
//
if (0 < count) then begin
//
for i := 0 to count - 1 do
c_cb_mcepBindTo.items.add(get(i));
//
end;
//
c_cb_mcepBindTo.itemIndex := f_config.get('mc', 'bindToIndex', int(0));
finally
free();
end;
//
c_timer_update.enabled := true;
end;
// -- --
procedure Tc_form_main.formCloseQuery(sender: tObject; var canClose: boolean);
begin
c_timer_update.enabled := false;
//
freeAndNil(f_recThread);
f_endPoint.close();
codecOut.close();
//
f_config.setValue('mc', 'groupIP', c_edit_mcepGroup.text);
f_config.setValue('mc', 'port', c_edit_mcepPort.text);
//
f_config.setValue('mc', 'bindToIndex', c_cb_mcepBindTo.itemIndex);
//
saveControlPosition(self, f_config);
end;
// -- --
procedure Tc_form_main.formDestroy(sender: tObject);
begin
freeAndNil(f_endPoint);
freeAndNil(f_config);
//
unaSockets.shutdown();
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 }
//
c_button_mcepStart.enabled := not f_endPoint.isReady(false);
c_button_mcepStop.enabled := f_endPoint.isReady(false);
//
c_label_status.caption := 'Status: ' + choice(f_endPoint.isReady(false), 'received ' + int2str(f_received shr 10, 10, 3) + ' KB',
choice(0 = f_socketErr, ' inactive.', 'socket error = ' + int2str(f_socketErr)));
//
end;
end;
// -- --
procedure Tc_form_main.c_button_mcepStartClick(Sender: TObject);
begin
// start receiving
f_received := 0;
//
f_endPoint.setPort(c_edit_mcepPort.text);
f_endPoint.bindToIP := c_cb_mcepBindTo.text;
//
f_socketErr := f_endPoint.recGroupJoin(c_edit_mcepGroup.text);
//
if (0 = f_socketErr) then begin
//
codecOut.open();
//
f_recThread := receiverThread.create(f_endPoint, codecOut, @f_received);
f_recThread.start();
end;
end;
// -- --
procedure Tc_form_main.c_button_mcepStopClick(Sender: TObject);
begin
// stop receiving
freeAndNil(f_recThread);
f_endPoint.close();
codecOut.close();
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -