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

📄 uservermain.~pas

📁 采用ACM与Skype4Com并且采用分布式UDP来进行语音的拨号、分传。
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
   begin
      rbGN4.Checked:=True;
      rbGJ4.Checked:=False;
   end else begin
      rbGN4.Checked:=False;
      rbGJ4.Checked:=True;
   end;
   
   aSkype[4].csSkypeUserName:=edtUserName4.Text;
   aSkype[4].csSkypePassWord:=edtPassWord4.Text;
   aSkype[4].csSkypeType:=StrToIntDef(gcf_GetINIValue('Skype','UserType4'),0);
   aSkype[4].csSkypeUse:=chkSkype4.Checked;
    }




   cbbTransType.ItemIndex:=StrToIntDef(gcf_GetINIValue('SERVERSOUNDCARD','TransType'),0);
   cbbStreamType.ItemIndex:=StrToIntDef(gcf_GetINIValue('SERVERSOUNDCARD','StreamType'),5);
   cbbRateType.ItemIndex:=StrToIntDef(gcf_GetINIValue('SERVERSOUNDCARD','RateType'),1);
   cbbStreamModel.ItemIndex:=StrToIntDef(gcf_GetINIValue('SERVERSOUNDCARD','StreamModel'),0);
   gsStreamModel:=gcf_GetINIValue('SERVERSOUNDCARD','StreamModel');

   

 end else begin
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALWORDPORT','2333');
   //远端文字监听端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEWORDPORT','3333');
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT1','47216');
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT1','57216');
   //本地语音监听端口
   gcf_SetINIValue('SERVERNETWORK','LOCALPHONEPORT1','47226');
   //远端语音端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEPHONEPORT1','57226');

   //本地用户列表监听端口                      
   gcf_SetINIValue('SERVERNETWORK','LOCALUSERPORT','67216');
   //发送用户列表监听端口
   gcf_SetINIValue('SERVERNETWORK','REMOTEUSERPORT','77216');


   //语音样式设置
   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','5');
   //采样率
   gcf_SetINIValue('SERVERSOUNDCARD','RATETYPE','1');
   //流方式
   gcf_SetINIValue('SERVERSOUNDCARD','STREAMTYPE','5');
   //传输方式
   gcf_SetINIValue('SERVERSOUNDCARD','TRANSTYPE','0');
   //回放1
   gcf_SetINIValue('SERVERSOUNDCARD','PB1','1');
   //录音1
   gcf_SetINIValue('SERVERSOUNDCARD','RC1','3');
   {
   //回放2
   gcf_SetINIValue('SERVERSOUNDCARD','PB2','2');
   //录音2
   gcf_SetINIValue('SERVERSOUNDCARD','RC2','4');
   //回放3
   gcf_SetINIValue('SERVERSOUNDCARD','PB3','5');
   //录音3
   gcf_SetINIValue('SERVERSOUNDCARD','RC3','7');
   //回放4
   gcf_SetINIValue('SERVERSOUNDCARD','PB4','6');
   //录音4
   gcf_SetINIValue('SERVERSOUNDCARD','RC4','8');
   }
   //声道
   gcf_SetINIValue('SERVERSOUNDCARD','Channels','1');
   //流模式
   gcf_SetINIValue('SERVERSOUNDCARD','StreamModel','0');

   gcf_SetINIValue('SERVERNETWORK','SERVERLSTHOST','223.223.80.184');
   gcf_SetINIValue('SERVERNETWORK','SERVERLSTPORT','40682');

 end;

  //打开服务器
  idpsrvrMain.DefaultPort:=StrToIntDef(gsLocalWordPort,0);
  idpsrvrMain.Active:=True;

  //idpsrvrUsers.DefaultPort:=StrToIntDef(gsLocalUserPort,0);
  //idpsrvrUsers.Active:=True;
   //保存采样率
  gsRateType:=cbbRateType.Text;
    //保存传输方式
  gsTransType:=cbbTransType.Text;
    //保存流模式
  gsStreamType:=IntToStr(str2intInt(cbbStreamType.text, 1, 10, true));
  
  ////////////////////////SKYPE---1/////////BEGIN///////////////////////////////
  //初始化关闭。
  //关闭输出流
  WaveOutStream1.close;
  //关闭输入流
  WaveInStream1.close;
  WaveOut1.close();
  WaveIn1.close();

  //关联入口
  WaveIn1.consumer:=WaveCodeR1;
  WaveCodeR1.consumer:=WaveOutStream1;

  //关联出口
  WaveInStream1.consumer:=WaveCodeP1;
  WaveCodeP1.consumer:=WaveOut1;


   //传输方式
  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;

  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;

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


  //回放E----------------------------------------------------------------------

  //给予启动服务的时间。
  Sleep(500);
  
  //录入B--------------------------------------------------------------------
  WaveIn1.close();
  //设备号
  WaveIn1.deviceId := index2deviceId(cbbPB1);
  //采样率
  WaveIn1.pcm_samplesPerSec := str2intInt(cbbRateType.Text);
  //声道
  WaveIn1.pcm_numChannels:=1;
  //流模式
  WaveCodeR1.formatTag :=  str2intInt(cbbStreamType.text, 1, 10, true);


  //录入E---------------------------------------------------------------------
  ////////////////////////SKYPE---1/////////END/////////////////////////////////
    //用户列表
   fctrvwMain.Items.Clear;
   strngrdAll.RowCount:=6;
   strngrdAll.ColCount:=5;
   strngrdAll.Cells[0,0]:='会话网络';
   strngrdAll.Cells[1,0]:='电话号码';
   strngrdAll.Cells[2,0]:='计算机名';
   strngrdAll.Cells[3,0]:='请求时间';
   strngrdAll.Cells[4,0]:='使用状态';

   strngrdAll.ColWidths[0]:=100;
   strngrdAll.ColWidths[1]:=80;
   strngrdAll.ColWidths[2]:=100;
   strngrdAll.ColWidths[3]:=140;
   strngrdAll.ColWidths[4]:=80;

   strngrdStream.RowCount:=5;
   strngrdStream.ColCount:=5;
   strngrdStream.Cells[0,0]:='会话';
   strngrdStream.Cells[1,0]:='会话设备';
   strngrdStream.Cells[2,0]:='流入字节';
   strngrdStream.Cells[3,0]:='流出字节';
   strngrdStream.Cells[4,0]:='时长';

   strngrdStream.ColWidths[0]:=100;
   strngrdStream.ColWidths[1]:=80;
   strngrdStream.ColWidths[2]:=100;
   strngrdStream.ColWidths[3]:=140;
   strngrdStream.ColWidths[4]:=80;


   if not skyp1.Client.IsRunning then
   begin
     skyp1.Client.Start(true,true);
   end;

   skyp1.Attach(9,false);
   iTCount:=0;
end;

procedure TfrmMain.idpsrvrMainUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  mData:array[1..CST_MAXBUFF] of char;
  pData:Pchar;
  iCount:integer;
  sInfo:String;
  fcTN:TfcTreeNode;
  bFind:Boolean;
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);

   bFind:=False;
   
   if fctrvwMain.Items.Count>0 then
   begin
     for iCount:=0 to fctrvwMain.Items.Count-1 do
     begin
      if fctrvwMain.Items[iCount].Text=ABinding.PeerIP then
      begin
         bFind:=True;
         Break;
      end;
     end;
   end;

   //未找到节点
   if Not bFind then
   begin
     if Pos(DEF_ESEPCHAR + DEF_LINKCHAR + DEF_BSEPCHAR,sInfo)>0 then
     begin
     fctrvwMain.Items.BeginUpdate;
     fcTN:=TfcTreeNode.Create(fctrvwMain.Items);
     fcTN.StringData:=sInfo;
     fcTN.StringData2:=ABinding.PeerIP;
     //显示接口信息
     fcTN.Text:=ABinding.PeerIP;
     fctrvwMain.Items.Add(fcTN,ABinding.PeerIP);
     fctrvwMain.Items.EndUpdate;
     end ;
   //找到节点
   end else begin

      fctrvwMain.Items.BeginUpdate;
      if fctrvwMain.Items.FindNode(ABinding.PeerIP,False)<>nil then
      fctrvwMain.Items.FindNode(ABinding.PeerIP,False).Selected:=True;
      fctrvwMain.Selected.StringData:=sInfo;
      fctrvwMain.Selected.StringData2:=ABinding.PeerIP;
      fctrvwMain.Items.EndUpdate;
   end;



   //接收通话命令
   if (gcf_GetStrPosStr(sInfo,4)='HOLDON') then
   begin
        //没在保持状态。 -=Skype1=-
        if (aSkype[1].Status<>clsOnHold) and (aSkype[1].Status<>clsRinging)
         and (aSkype[1].Status<>clsInProgress) and (aSkype[1].Status<>clsBusy)   then
        begin
                       //开始拨号。
                       if Copy(gcf_GetStrPosStr(sInfo,1),1,3)=CST_CALLHEAD then
                       begin

                         aSkype[1].CtrlStatus:=skyp1.PlaceCall(gcf_GetStrPosStr(sInfo,1),'','','');

                       end else begin

                         aSkype[1].CtrlStatus:=skyp1.PlaceCall(CST_CALLHEAD+gcf_GetStrPosStr(sInfo,1),'','','');

                       end;

                       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:=gcf_GetStrPosStr(sInfo,1);
                       aSkype[1].csCurrentUserIP:=idpsrvrMain.Binding.PeerIP;
                       aSkype[1].csCurrentSessionID:=gcf_GetStrPosStr(sInfo,2);
                       aSkype[1].csBeginTime:=strngrdAll.Cells[3,1];
                       aSkype[1].csCurrentComputerName:=gcf_GetStrPosStr(sInfo,3);
                       aSkype[1].csCurrentStatus:='通话中...';


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

                       WaveInStream1.open();


                       Sleep(200);
                       
                        //接收来自Skype播放接口作为录音口 发送流到端口
                        WaveOutStream1.port:= aSkype[1].gsRemotePhonePort;
                        WaveOutStream1.host:=idpsrvrMain.Binding.PeerIP;
                        //录入B--------------------------------------------------------------------
                        WaveIn1.open;

                       ctlMain.Items[0].Enabled:=False;
                       ctlMain.Items[0].Interval:=500;
                       ctlMain.Items[0].Enabled:=True;

                         //设置客户端端口
                        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-READY' +  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);
                       
        end else if (aSkype[1].Status=clsOnHold) or  (aSkype[1].Status=clsInProgress) or (aSkype[1].Status=clsRinging) or (aSkype[1].Status=clsBusy) then begin

                      //设置客户端端口
                      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-RUNNING' +  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);
        end;
   end;

⌨️ 快捷键说明

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