📄 u_vcmcsource_main.pas
字号:
(*
----------------------------------------------
u_vcMCsource_main.pas
vcMulticast Source 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_vcMCsource_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_mcsTTL: TLabel;
c_label_mcsPort: TLabel;
c_label_mcsBindTo: TLabel;
c_edit_mcsHost: TEdit;
c_cb_mcsTTL: TComboBox;
c_edit_mcsPort: TEdit;
c_button_mcsStart: TButton;
c_button_mcsStop: TButton;
c_checkBox_mcsEnableLoopback: TCheckBox;
c_checkBox_mcsExBind: TCheckBox;
c_cb_mcsBindTo: TComboBox;
waveIn: TunavclWaveInDevice;
codecIn: TunavclWaveCodecDevice;
c_timer_update: TTimer;
c_fft_main: TunadspFFTControl;
c_label_status: TLabel;
//
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_mcsStartClick(Sender: TObject);
procedure c_button_mcsStopClick(Sender: TObject);
//
procedure codecInDataAvailable(sender: unavclInOutPipe; data: pointer; len: cardinal);
private
{ Private declarations }
f_config: unaIniFile;
f_source: unaMulticastSocket;
f_sent: int64;
f_socketErr: int;
public
{ Public declarations }
end;
var
c_form_main: Tc_form_main;
implementation
{$R *.dfm}
uses
unaUtils, unaVCLUtils, unaVCIDEUtils;
{ 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_source := unaMulticastSocket.create();
//
waveIn.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_mcsHost.text := f_config.get('mc', 'groupIP', '224.0.1.2');
c_edit_mcsPort.text := f_config.get('mc', 'port', '18000');
c_cb_mcsTTL.text := f_config.get('mc', 'ttl', '0');
c_checkBox_mcsEnableLoopback.checked := f_config.get('mc', 'enableLoopback', false);
c_checkBox_mcsExBind.checked := f_config.get('mc', 'exBind', false);
//
c_cb_mcsBindTo.clear();
c_cb_mcsBindTo.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_mcsBindTo.items.add(get(i));
//
end;
//
c_cb_mcsBindTo.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;
//
waveIn.close();
f_source.close();
//
f_config.setValue('mc', 'groupIP', c_edit_mcsHost.text);
f_config.setValue('mc', 'port', c_edit_mcsPort.text);
f_config.setValue('mc', 'ttl', c_cb_mcsTTL.text);
f_config.setValue('mc', 'enableLoopback', c_checkBox_mcsEnableLoopback.checked);
f_config.setValue('mc', 'exBind', c_checkBox_mcsExBind.checked);
//
f_config.setValue('mc', 'bindToIndex', c_cb_mcsBindTo.itemIndex);
//
saveControlPosition(self, f_config);
end;
// -- --
procedure Tc_form_main.formDestroy(sender: tObject);
begin
freeAndNil(f_source);
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_mcsStart.enabled := not f_source.isReady(true);
c_button_mcsStop.enabled := f_source.isReady(true);
//
c_label_status.caption := 'Status: ' + choice(f_source.isReady(true), 'sent ' + int2str(f_sent shr 10, 10, 3) + ' KB',
choice(0 = f_socketErr, ' inactive.', 'socket error = ' + int2str(f_socketErr)));
end;
end;
// -- --
procedure Tc_form_main.c_button_mcsStartClick(Sender: TObject);
begin
// start streaming
f_sent := 0;
f_source.setHost(c_edit_mcsHost.text);
f_source.setPort(c_edit_mcsPort.text);
f_source.bindToIP := c_cb_mcsBindTo.text;
//
f_socketErr := f_source.senderCreate(str2intInt(c_cb_mcsTTL.text, 1), choice(c_checkBox_mcsEnableLoopback.checked, IP_DEFAULT_MULTICAST_LOOP, int(0)), not c_checkBox_mcsExBind.checked);
//
if (0 = f_socketErr) then
waveIn.open();
end;
// -- --
procedure Tc_form_main.c_button_mcsStopClick(Sender: TObject);
begin
// stop streaming
waveIn.close();
f_source.close();
end;
// -- --
procedure Tc_form_main.codecInDataAvailable(sender: unavclInOutPipe; data: pointer; len: cardinal);
begin
if (f_source.isReady()) then begin
//
if (0 = f_source.senderSend(data, len)) then
inc(f_sent, len);
//
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -