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

📄 u_vcmcendpoint_main.pas

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