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

📄 u_vctalknow_main.pas

📁 Voice Commnucation Components for Delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:

{$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 + -