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

📄 uservermain.~pas

📁 采用ACM与Skype4Com并且采用分布式UDP来进行语音的拨号、分传。
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:

   //接收挂机命令
   if (gcf_GetStrPosStr(sInfo,2)='FINISH')then
   begin
      fctrvwMain.Items.BeginUpdate;
      if fctrvwMain.Items.FindNode(ABinding.PeerIP,False)<>nil then
      fctrvwMain.Items.Delete(fctrvwMain.Items.FindNode(ABinding.PeerIP,False));
      fctrvwMain.Items.EndUpdate;

      //判断是否当前挂断的为拨打的用户。 -=SKYPE1=-
      if (aSkype[1].csCurrentUserIP=ABinding.PeerIP) and (aSkype[1].Status<>clsFinished) and (aSkype[1].csCurrentCallNumber=gcf_GetStrPosStr(sInfo,1)) then
      begin
           ctlMain.Items[0].Enabled:=False;
         //关闭输出流
         WaveOutStream1.close;
         //关闭输入流
         WaveInStream1.close;
         WaveOut1.close();
         WaveIn1.close();

         strngrdAll.Cells[0,1]:=idpsrvrMain.Binding.PeerIP;
         strngrdAll.Cells[1,1]:=gcf_GetStrPosStr(sInfo,1);
         strngrdAll.Cells[2,1]:=gcf_GetStrPosStr(sInfo,3);
         strngrdAll.Cells[3,1]:=DateTimeToStr(Now);
         strngrdAll.Cells[4,1]:='空闲';

         aSkype[1].csCurrentCallNumber:='';
         aSkype[1].csCurrentUserIP:='';
         aSkype[1].csCurrentSessionID:='';
         aSkype[1].csCurrentComputerName:='';
         aSkype[1].csCurrentStatus:='空闲';

          //设置客户端端口
         idpclntMain.Active:=False;
         idpclntMain.Port:=StrToIntDef(gsRemoteWordPort,0);
         idpclntMain.Host:=idpsrvrMain.Binding.PeerIP;
         idpclntMain.Active:=True;
         idpclntMain.Send(DEF_BSEPCHAR + gsRateType +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsStreamType  +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsTransType +  DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      '服务1-CLOSE' +  DEF_ESEPCHAR + DEF_LINKCHAR +
                      DEF_BSEPCHAR + gsStreamModel + DEF_ESEPCHAR);

         idpclntLst.Active:=False;
         idpclntLst.Host:=gsServerListHost;
         idpclntLst.Port:=StrToIntDef(gsServerListPort,0);
         idpclntLst.Active:=True;
         idpclntLst.Send(DEF_BSEPCHAR + gComputerAddr +
                           DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                           gComputerName  +
                           DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                           '空闲' +  DEF_ESEPCHAR  + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsLocalWordPort + DEF_ESEPCHAR);
         try
            aSkype[1].CtrlStatus.Finish;
         except
         end;
      end;
   end;


   
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Hand:Integer;
begin
   //如果没有运行
   //最小化启动
   //skypMain.Client.Shutdown;
    WaveIn1.close();
    WaveOut1.Close();
    WaveInStream1.close();
    WaveOutStream1.close();

    
   try
    {
       //创建第一个用户
    WinExec('net user sutmpSkype1  /del',SW_HIDE);
    //创建第二个用户
    WinExec('net user sutmpSkype2  /del',SW_HIDE);
    //创建第三个用户
    WinExec('net user sutmpSkype3  /del',SW_HIDE);
    //创建第四个用户
    WinExec('net user sutmpSkype4  /del',SW_HIDE);
    

    Hand:=FindWindow(nil,'c:\winnt\system32\cmd.exe');//找CMD句柄
    if Hand<>0 then//如果找到句
    begin
    SendMessage(Hand,WM_CLOSE,0,0);//关闭隐藏的CMD窗口
    end else begin
      Hand:=FindWindow(nil,'c:\windows\system32\cmd.exe');//找CMD句柄
      if Hand<>0 then
      begin
        SendMessage(Hand,WM_CLOSE,0,0);//关闭隐藏的CMD窗口
      end;
    end;
    }

    //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALWORDPORT',edtLocalWordPort.Text);
   //远端文字监听端
   gcf_SetINIValue('SERVERNETWORK','REMOTEWORDPORT',edtRemoteWordPort.Text);


   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT1',edtLocPort1.Text);
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT1',edtRmtPort1.Text);
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT2',edtLocPort2.Text);
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT2',edtRmtPort2.Text);
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT3',edtLocPort3.Text);
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT3',edtRmtPort3.Text);
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT4',edtLocPort4.Text);
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT4',edtRmtPort4.Text);


   //语音样式设置
   gcf_SetINIValue('SERVERWAVEFORMAT','wFormatTag','1');
   gcf_SetINIValue('SERVERWAVEFORMAT','nChannels','1');
   gcf_SetINIValue('SERVERWAVEFORMAT','nSamplesPerSec','8000');
   gcf_SetINIValue('SERVERWAVEFORMAT','nAvgBytesPerSec','8000');
   gcf_SetINIValue('SERVERWAVEFORMAT','nBlockAlign','1');
   gcf_SetINIValue('SERVERWAVEFORMAT','wBitsPerSample','8');

   //声卡数量
   gcf_SetINIValue('SERVERSOUNDCARD','NUMBER',edtSoundDevNum.Text);
   //采样率
   gcf_SetINIValue('SERVERSOUNDCARD','RATETYPE',IntToStr(cbbRateType.ItemIndex));
   //流方式
   gcf_SetINIValue('SERVERSOUNDCARD','STREAMTYPE',IntToStr(cbbStreamType.ItemIndex));
   //传输方式
   gcf_SetINIValue('SERVERSOUNDCARD','TRANSTYPE',IntToStr(cbbTransType.ItemIndex));
   //流模式
   gcf_SetINIValue('SERVERSOUNDCARD','TRANSTYPE',IntToStr(cbbTransType.ItemIndex));

   gcf_SetINIValue('SERVERSOUNDCARD','PB1',IntToStr(cbbPB1.ItemIndex));
   gcf_SetINIValue('SERVERSOUNDCARD','RC1',IntToStr(cbbRC1.ItemIndex));

   gcf_SetINIValue('SERVERSOUNDCARD','PB2',IntToStr(cbbPB2.ItemIndex));
   gcf_SetINIValue('SERVERSOUNDCARD','RC2',IntToStr(cbbRC2.ItemIndex));

   gcf_SetINIValue('SERVERSOUNDCARD','PB3',IntToStr(cbbPB3.ItemIndex));
   gcf_SetINIValue('SERVERSOUNDCARD','RC3',IntToStr(cbbRC3.ItemIndex));


   gcf_SetINIValue('SERVERSOUNDCARD','PB4',IntToStr(cbbPB4.ItemIndex));
   gcf_SetINIValue('SERVERSOUNDCARD','RC4',IntToStr(cbbRC4.ItemIndex));



   gcf_SetINIValue('SERVERSOUNDCARD','StreamModel',IntToStr(cbbStreamModel.ItemIndex));


   gcf_SetINIValue('SERVERNETWORK','SERVERLSTHOST',edtLstServer.Text);
   gcf_SetINIValue('SERVERNETWORK','SERVERLSTPORT',edtLstServerPort.Text);

   except

   end;

    idpclntLst.Active:=False;
    idpclntLst.Host:=gsServerListHost;
    idpclntLst.Port:=StrToIntDef(gsServerListPort,0);
    idpclntLst.Active:=True;
    idpclntLst.Send(DEF_BSEPCHAR + gComputerAddr +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gComputerName  +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      '退出' +  DEF_ESEPCHAR  + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsLocalWordPort + DEF_ESEPCHAR);
   //skyp1.Application.ConnectableUsers.Add();
end;

procedure TfrmMain.skyp1CallStatus(ASender: TObject; const pCall: ICall;
  Status: TOleEnum);
begin
   //保存状态。
   aSkype[1].Status:=Status;
    if Status = clsFinished Then
   begin
     strngrdAll.Cells[4,1]:='空闲';
      try
            aSkype[1].csCurrentStatus:='FINISH';
             //初始化关闭。
            //关闭输出流
            WaveOutStream1.close;
            //关闭输入流
            WaveInStream1.close;
            WaveOut1.close();
            WaveIn1.close();

            //设置客户端端口
         idpclntMain.Active:=False;
         idpclntMain.Port:=StrToIntDef(gsRemoteWordPort,0);
         idpclntMain.Host:=idpsrvrMain.Binding.PeerIP;
         idpclntMain.Active:=True;
         idpclntMain.Send(DEF_BSEPCHAR + gsRateType +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsStreamType  +
                      DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      gsTransType +  DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR +
                      '服务1-FREE' +  DEF_ESEPCHAR + DEF_LINKCHAR +
                      DEF_BSEPCHAR + gsStreamModel + DEF_ESEPCHAR);
      except
      end;
   end;

   
end;

procedure TfrmMain.skyp2CallStatus(ASender: TObject; const pCall: ICall;
  Status: TOleEnum);
begin
  //保存状态。
 aSkype[2].Status:=Status;
end;

procedure TfrmMain.skyp3CallStatus(ASender: TObject; const pCall: ICall;
  Status: TOleEnum);
begin
   //保存状态。
 aSkype[3].Status:=Status;
end;

procedure TfrmMain.skyp4CallStatus(ASender: TObject; const pCall: ICall;
  Status: TOleEnum);
begin
    //保存状态。
 aSkype[4].Status:=Status;
end;


procedure TfrmMain.idpsrvrUsersUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
 mData:array[1..CST_MAXBUFF] of char;
 sInfo:String;
 iCount:integer;
begin
   for iCount := 1 to CST_MAXBUFF do    // Iterate
   begin
     mData[iCount]:=#0;
   end;
   AData.ReadBuffer(mData,AData.Size);

   for iCount := 1 to CST_MAXBUFF do
   begin
         sInfo:=sInfo+mData[iCount];
   end;
   sInfo:=Trim(sInfo);

end;

procedure TfrmMain.btnSoundClick(Sender: TObject);
begin
   //采样率
   gcf_SetINIValue('SERVERSOUNDCARD','RATETYPE',IntToStr(cbbRateType.ItemIndex));
   gsRateType:=IntToStr(cbbRateType.ItemIndex);
   //流方式
   gcf_SetINIValue('SERVERSOUNDCARD','STREAMTYPE',IntToStr(cbbStreamType.ItemIndex));
   gsStreamType:=IntToStr(cbbStreamType.ItemIndex);
   //传输方式
   gcf_SetINIValue('SERVERSOUNDCARD','TRANSTYPE',IntToStr(cbbTransType.ItemIndex));
   gsTransType:=IntToStr(cbbTransType.ItemIndex);
   //流模式
   gcf_SetINIValue('SERVERSOUNDCARD','StreamModel',IntToStr(cbbStreamModel.ItemIndex));
   gsStreamModel:=IntToStr(cbbStreamModel.ItemIndex);
   //初始化关闭。

   //采样率
   cbbRateType.ItemIndex:=StrToIntDef(gsRateType,0);
   //流方式
   cbbStreamType.ItemIndex:=StrToIntDef(gsStreamType,0);
   //传输方式
   cbbTransType.ItemIndex:=StrToIntDef(gsTransType,0);
   //流模式
   cbbStreamModel.ItemIndex:=StrToIntDef(gsStreamModel,0);


  //关闭输出流
  WaveOutStream1.close;
  //关闭输入流
  WaveInStream1.close;
  WaveIn1.close();
  WaveOut1.close();

   //传输方式
  if (cbbTransType.itemIndex =0) then begin
    //UDP
    WaveOutStream1.proto := unapt_UDP;
    WaveInStream1.proto := unapt_UDP;
  end
  else begin
    //TCP
    WaveOutStream1.proto := unapt_TCP;
    WaveInStream1.proto := unapt_TCP;
  end;

  cbbStreamModel.ItemIndex:=StrToIntDef(gsStreamModel,0);

  if (cbbStreamModel.ItemIndex=0) then begin
    WaveOutStream1.streamingMode:=unasm_VC;
    WaveInStream1.streamingMode:=unasm_VC;
  end else begin
    WaveOutStream1.streamingMode:=unasm_RAW;
    WaveInStream1.streamingMode:=unasm_RAW;
  end;

  //接受来自远端的流并传输给skype的录音设备
  WaveInStream1.port := aSkype[1].gsLocalPhonePort;
  //接收来自Skype播放接口作为录音口 发送流到端口
  WaveOutStream1.port:= aSkype[1].gsRemotePhonePort;

  //回放B---------------------------------------------------------------------
  //设备号
  WaveOut1.deviceId := index2deviceId(cbbRC1);
  //采样率
  WaveOut1.pcm_samplesPerSec := str2intInt(cbbRateType.Text);
  WaveCodeP1.formatTag := str2intInt(cbbStreamType.text, 1, 10, true);
  WaveInStream1.open;
  //回放E----------------------------------------------------------------------


  //录入B--------------------------------------------------------------------
  WaveIn1.close();
  //设备号
  WaveIn1.deviceId := index2deviceId(cbbPB1);
  //采样率
  WaveIn1.pcm_samplesPerSec := str2intInt(cbbRateType.Text);
  //保存采样率
  gsRateType:=IntToStr(WaveIn1.pcm_samplesPerSec);
  //保存传输方式
  gsTransType:=cbbTransType.Text;
  //流模式
  WaveCodeR1.formatTag :=  str2intInt(cbbStreamType.text, 1, 10, true);
  //保存流模式
  gsStreamType:=IntToStr(WaveCodeR1.formatTag);

  //录入E---------------------------------------------------------------------
end;

procedure TfrmMain.ctlMainItems0Timer(Sender: TObject);
begin
 strngrdStream.Cells[0,1]:=aSkype[1].csCurrentSessionID;
 strngrdStream.Cells[1,1]:= '帐号1';
 strngrdStream.Cells[2,1]:= IntToStr(WaveInStream1.outBytes);
 strngrdStream.Cells[3,1]:= IntToStr(WaveOutStream1.inBytes);
 strngrdStream.Cells[4,1]:= TimeToStr(now-StrToDateTimeDef(aSkype[1].csBeginTime,now));
 
end;

procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
 try
   aSkype[1].csSkypeUserName:=trim(edtUserName1.Text);
   aSkype[1].csSkypePassWord:=trim(edtPassWord1.Text);
   if rbGN1.Checked then
   begin
   aSkype[1].csSkypeType:=0;
   end else if rbGJ1.Checked then
   begin
   aSkype[1].csSkypeType:=1;
   end;
   gcf_SetINIValue('Skype','UserName1',edtUserName1.Text);
   gcf_SetINIValue('Skype','PassWord1',edtPassWord1.Text);
   gcf_SetINIValue('Skype','UseSkype1',BoolToStr(chkSkype1.Checked));
end;

procedure TfrmMain.btnSetupClick(Sender: TObject);
begin
   gcf_SetINIValue('SERVERNETWORK','SERVERLSTHOST',edtLstServer.Text);
   gcf_SetINIValue('SERVERNETWORK','SERVERLSTPORT',edtLstServerPort.Text);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -