⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_vcmcsource_main.pas

📁 Voice Commnucation Components for Delphi
💻 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 + -