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

📄 djtc081ac.pas

📁 自己写的用delphi封装东劲板卡api.
💻 PAS
📖 第 1 页 / 共 2 页
字号:

function TDjTc081AC.SetLink(ChnlId1, ChnlID2: integer): integer;
var
  ChannelIn,ChannelOut:PChannel;
begin
  ChannelIn := ChannelList.Items[ChnlId1];
  ChannelOut := ChannelList.Items[ChnlId2];
  Result := tc08a32.SetLink(ChnlId1,ChnlId2) ;
  if Result =0 then
  begin
    ChannelIn.State := Speck;
    ChannelIn.Ringing := false ;
    ChannelIn.ConnectChannel.ConState := Connected ;
    ChannelIn.ConnectChannel.ConChnlId := ChnlId2 ;
    ChannelIn.ConnectChannel.CallActive :=true ;
    ChannelIn.ConnectChannel.Channeler := ChannelOut ;
    ChannelOut.State := Speck ;
    ChannelOut.Ringing := false ;
    ChannelOut.ConnectChannel.ConState := Connected ;
    ChannelOut.ConnectChannel.ConChnlId := ChnlID1 ;
    ChannelOut.ConnectChannel.Channeler := ChannelIn ;
    ChannelOut.ConnectChannel.CallActive := true ;
    if Assigned(FDjSSC.OnLink) then
      FDjSSC.OnLink(FDjSSC,ChannelIn.ConnectChannel.ConChnlId,ChannelIn.ChannelID);
  end;
end;

function TDjTc081AC.ClearLink(Channel1,Channel2:PChannel): Integer;
begin
  result := tc08a32.ClearLink(Channel1.ChannelID,Channel2.ChannelID);
end;

{-------------------------------------------------------------------------------
  过程名:    TDjTc081AC.HangUp
  作者:      fengfan
  日期:      2006.09.08
  参数:      Channel: PChannel  挂机
  返回值:    无
-------------------------------------------------------------------------------}
procedure TDjTc081AC.HangUp(Channel: PChannel);
var
  ChannelOut:PChannel;
//  i:integer;
begin

  if Channel.PlayState = Playing then
    DjTc081.StopPlayFile(Channel);

  case Channel.ChannelType of
    UserChannel:
    begin
      case Channel.State of
        Idle:
        begin
          exit;
        end;
        disabled: exit;
        Calling:
        begin
          StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
          //HangUp(Channel.ConnectChannel.Channeler);
        end;
        Dailing:
        begin
          if Channel.Ringing then
          begin
            FeedPower(Channel.ChannelID);
            Channel.Ringing := false ;
            //ResetChannel(Channel.ConnectChannel.ConChnlId);
          end;
        end;
        Speck:;
      end;
//      Channel.dtmf := '';
      if Channel.PhoneState = HangState then
      begin
        Channel.Step := 1001  ;          //因为软挂机,话机没有挂,所以不能读取.  判断话机类型??
        StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
      end
      else
        Channel.Step := 0;

      ChannelOut := Channel.ConnectChannel.Channeler;


      Channel.State := Idle;
      if Channel.ConnectChannel.ConState = Connected then
      begin
        Channel.ConnectChannel.ConState:= OneConnect ;
        //Channel.ConnectChannel.ConChnlId := -1 ;
        Channel.ConnectChannel.CallActive := false ;
        Channel.ConnectChannel.CallerPhone := '';
        //HangUp(Channel.ConnectChannel.Channeler);//StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
        Channel.ConnectChannel.Channeler := nil ;
      end;

      if Channel.IsMeeting then
        if Channel.ConnectChannel.ConState = ThreeState then
        begin
          Channel.ConnectChannel.ConState:= OneConnect ;
          //Channel.ConnectChannel.ConChnlId := -1 ;
          Channel.ConnectChannel.CallActive := false ;
          Channel.ConnectChannel.CallerPhone := '';
          Channel.ConnectChannel.Channeler := nil ;
          ClearThree(Channel);
          if Channel.PhoneState = HangState then
          begin
            Channel.Step := 1001  ;          //因为软挂机,话机没有挂,所以不能读取.  判断话机类型??
            StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
          end
          else
            Channel.Step := 0;
        end;

      Channel.IsMeeting := false ;
      Channel.Meeting := nil;

      if (Assigned(ChannelOut)) and (ChannelOut.State = Calling) then
        

      if Assigned(FDjSSC.OnHangUp) then
        if (Assigned(ChannelOut)) and (ChannelOut.State <> idle) then
          FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,Channel.ConnectChannel.ConChnlId)
        else
          FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,-1);
//      //挂机后处理对方
      StopRecord(Channel);

      if Channel.PhoneState = HookState then   //来电,软件摘机,但话机未摘,则reset
        ReSetChannel(Channel.ChannelID);

    end;
    TrunkChannel:
    begin
      ResetChannel(channel.ChannelID)


    end;
  end;
end;

{-------------------------------------------------------------------------------
  过程名:    TDjTc081AC.HangOff
  作者:      fengfan
  日期:      2006.09.08
  参数:      Channel: PChannel   内线被动摘机
  返回值:    integer
-------------------------------------------------------------------------------}
function TDjTc081AC.HangOff(Channel: PChannel): integer;
var
  i:integer;
  ChnlId1,ChnlId2:Integer;
  Channel1,Channel2:PChannel ;
begin
  if Channel.Ringing then
    FeedPower(Channel.ChannelID);
  Channel1 := Channel ;
  ChnlId1 := Channel.ChannelID ;
  ChnlId2 := Channel.ConnectChannel.ConChnlId ;
  Channel2 := ChannelList.Items[ChnlId2];
  Channel.Ringing := false;
  //if Channel2.ChannelType = TrunkChannel then
  StartPlaySignal(ChnlId2,SIG_STOP);
  i := Setlink(ChnlId2,ChnlId1);
  if i= 0 then
  begin
    Channel.Step := 1001 ;
    Channel2.Step := 1001;
  end
  else
  begin
    //if
  end;
end;

{-------------------------------------------------------------------------------
  过程名:    TDjTc081AC.OffHook
  作者:      fengfan
  日期:      2006.09.08
  参数:      Channel: PChannel    //内线摘机
  返回值:    integer
-------------------------------------------------------------------------------}
function TDjTc081AC.OffHook(Channel: PChannel): integer;
begin
  case  Channel.State of
    Idle:      //主动
    begin
      Channel.State := Calling ;
      if Assigned(FDjSSC.OnHookUp) then
      begin
        FDjSSC.onHookUp(FDjSSC,Channel.ChannelID);
      end;
    end;
    Dailing:    //被动
    begin
      Self.HangOff(Channel);
    end;
  end;
end;

function TDjTc081AC.CallOut(ChannelIn,ChannelOut: pChannel; DTMFNum: string): integer;
var
  ChnlID:integer;
  DialPhone:pchar;
begin
  if ChannelOut.State <> Idle then
  begin
    Result := -9;
    exit;
  end;
  ChannelOut.Dtmf := DTMFNum;
  ChannelOut.State := Dailing ;
  ChnlID := ChannelOut.ChannelID;
  StartSigCheck(ChnlID);
  tc08a32.OffHook(ChnlID);
  DialPhone := pchar(ChannelOut.Dtmf);
  Sig_StartDial(ChnlID,pchar(FDjSSC.PreDialNum + DTMFNum),'',0);
  ChannelOut.Step := 1001;
  ChannelIn.Step := 101 ;
end;

function TDjTc081AC.CheckDial(Channel: PChannel): integer;
var
  ChnlInID:Integer;
  ChnlOutID:Integer;
  CheckDialResult:integer;
  ChannelIn,ChannelOut:PChannel;
begin
  Result:=100;
  sleep(1);
  ChnlOutID := Channel.ChannelID;
  ChannelOut := Channel;

  ChannelIn := ChannelOut.ConnectChannel.Channeler;
  ChnlInID := ChannelIn.ChannelID;

//  if ElapseTime(ChnlOutID,4)>=2000 then //超时处理
//    CheckDialResult := S_TimeOut
//  else
  CheckDialResult := Sig_CheckDial(ChnlOutID);

  //StartPlaySignal(ChnlInID, SIG_RINGBACK);

  case CheckDialResult of
    S_TimeOut,S_BUSY,S_NOBODY,S_NOSIGNAL://超时,遇忙、没人接听,没有信号
    begin
      if Assigned(FDjSSC.OnCallError) then
        FDjSSC.OnCallError(FDjSSC,ChnlInID,ChnlOutID,CheckDialResult);
      ChannelOut.DialActor := MasterActor ;
      HangUp(ChannelOut);
      //ResetChannel(ChnlOutID);
    end;
    S_CONNECT:
    begin
      StartPlaySignal(ChnlInID, SIG_STOP);
      CheckDialResult :=  Self.SetLink(ChnlInID,ChnlOutID);
      StartRecord(ChannelIn);
      StartRecord(ChannelOut);
      if CheckDialResult = 0 then
      begin
        ChannelIn.Step := 1001 ;
        ChannelOut.Step := 1001 ;
      end
      else
      begin

      end;
    end;
    S_NORESULT:;
    else
    begin
      AddLogToList('没有拨号音!');
      if Assigned(FDjSSC.OnCallError) then
        FDjSSC.OnCallError(FDjSSC,ChnlInID,ChnlOutID,CheckDialResult);
      ChannelOut.DialActor := MasterActor ;
      HangUp(ChannelOut);
      //(ChnlOutID);
    end;
  end;// end of case
end;

function TDjTc081AC.KeepChannel(Channelin: PChannel): integer;
var
  ChannelOut:PChannel ;
  i:integer;
begin
  if ChannelIn.ConnectChannel.ConState in [Connected,MeetingState] then
  begin
    ChannelOut:= ChannelIn.ConnectChannel.Channeler;
    ChannelOut.State := keep ;
    ChannelOut.ConnectChannel.ConState :=  Keeping;
    ChannelOut.ConnectChannel.ConChnlId := -1;
    //KeepList.Add(ChannelOut);
    ChannelIn.ConnectChannel.ConChnlId := -1 ;
    StartPlaySignal(ChannelIn.ChannelID,SIG_STOP);
    StartPlaySignal(ChannelOut.ChannelID,SIG_STOP);
    i := Self.ClearLink(ChannelIn,ChannelOut);
    if i = 0 then
      AddLogToList('');
    HangUp(ChannelIn);
    Result := 0 ;
  end
  else
    Result := -1 ;
end;

function TDjTc081AC.GetKeepChannel(ChannelIn,
  ChannelOut: PChannel): integer;
var
  ChnlInID,ChnlOutID:integer;
  i:integer;
begin
  ChnlInID :=  ChannelIn.ChannelID;
  ChnlOutID := ChannelOut.ChannelID;
  if ChannelIn.State <> idle then
    Result := -1
  else
    if ChannelOut.State <> keep then
      Result := -2
    else
    begin
      i := Self.SetLink(ChnlInID,ChnlOutID);
      if i = 0 then
      begin

        Result := 0 ;
      end
      else
        Result := i ;
    end;
end;

function TDjTc081AC.ClearThree(Channel1: PChannel): integer;
var
  Meeting:PMeeting;
  i:integer;
  Channel2,Channel3:PChannel;
begin
  Meeting := Channel1.Meeting;
  Channel2 := DjMC.GetThreeChannel(Meeting,Channel1);
  Channel3 := DjMC.GetThreeChannel(Channel1.Meeting,Channel1,Channel2);
  i :=  DjMC.DeleteChannel(Channel2);
  if i = 0 then
  begin
    i := DjMC.DeleteChannel(Channel1);
    if i = 0 then
    begin
      i := DjMC.DeleteChannel(Channel3);
      if i = 0 then
      begin
        if Assigned(FDjSSC.OnClearThree) then
          FDjSSC.OnClearThree(Self,Channel1.ChannelID,Channel3.ChannelID,Channel2.ChannelID)
        else
        begin
          DjTc081.SetLink(Channel2.ChannelID,Channel3.ChannelID);
        end;
      end;
    end;
  end;

end;

procedure TDjTc081AC.StartRecord(Channel: PChannel);
var
  RChannel:PChannel;
  ChnlID:integer;
  FileName:string;
//  i:integer;
begin
  if not FDjSSC.Recorded then exit;
  RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
  ChnlID := Channel.ConnectChannel.ConChnlId;
  if Assigned(RChannel) then
  begin
    if Channel.Recorded.IsRecord then
    begin
      FileName:= RecordCenter.GetRecordFileName(rChannel.ChannelID);

      if StartRecordFile(RChannel.ChannelID,pchar(FileName),8000*3600) then
      begin
        if assigned(FDjSSC.OnRecord) then FDjSSC.OnRecord(FDjSSC,Channel.ChannelID,ChnlID,FileName);
        AddLogToList('开始录音    '+filename);
      end
      else
      ////////
    end;
  end;
end;

procedure TDjTc081AC.StopRecord(Channel: PChannel);
var
  RChannel:PChannel;
//  ChnlID:integer;
//  FileName:string;
//  i:integer;
begin
  if not FDjSSC.Recorded then exit;
  RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
//  ChnlID := Channel.ConnectChannel.ConChnlId;
  if (Channel.Recorded.IsRecord) and  (Assigned(RChannel)) then
  begin
    StopRecordFile(RChannel.ChannelID);
    AddLogToList('停止录音');
  end;
end;

procedure TDjTc081AC.InitRecordChannel;
var
  RChannel,Channel:PChannel ;
  i:integer;
begin
  for i :=0 to ChannelList.Count -1 do
  begin
    Channel := ChannelList.Items[i];
    if (Channel.Recorded.IsRecord) then
    begin
      RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
      if Assigned(RChannel) then
      begin
        if Channel.Recorded.IsAGC then
          D_SetWorkMode(RChannel.ChannelID,WORK_MODE_REC_AGC,REC_AGC_MODE_VAL_ENABLE)
        else
            D_SetWorkMode(RChannel.ChannelID,WORK_MODE_REC_AGC,REC_AGC_MODE_VAL_DISABLE);
        D_SetWorkMode (RChannel.ChannelID, WORK_MODE_AGC_PARAM_INCREASE, 8 );
        //			// reduce times : 0.5 (16/32)
        D_SetWorkMode (RChannel.ChannelID, WORK_MODE_AGC_PARAM_DECREASE, 16 );
      end;
    end;
  end;
end;

procedure TDjTc081AC.StartPlayFile(Channel: PChannel; FileName: string);
var
  ChnlID:Integer ;
//  i:integer;
begin
  ChnlID := Channel.ChannelID;
  //if Channel.State in [idle,Calling] then
  begin
    if tc08a32.StartPlayFile(ChnlID,pchar(FileName),0) then
    begin
      if Assigned(FDjSSC.OnPlayBegin) then FDjSSC.OnPlayBegin(FDjSSC,ChnlID,FileName);
      if Channel.State in [idle,calling] then  Channel.Step := 1004 ;//放音检查
      Channel.PlayState := Playing ;
    end
    else
    //////
  end;
end;

procedure TDjTc081AC.StopPlayFile(Channel: PChannel);
var
  ChnlID:Integer ;
//  i:integer;
begin
  ChnlID := Channel.ChannelID;
  if Channel.PlayState = Playing then
  begin
    tc08a32.StopPlayFile(ChnlID);
    Channel.PlayState := NotPlay ;
    if Assigned(FDjSSC.OnPlayEnd) then FDjSSC.OnPlayEnd(FDjSSC,ChnlID);
  end;
end;

function TDjTc081AC.CheckPlayEnd(Channel: PChannel): boolean;
begin
  Result := tc08a32.CheckPlayEnd(Channel.ChannelID);
end;

end.

⌨️ 快捷键说明

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