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

📄 djtc081ac.pas

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

interface

uses tc08a32,SyncObjs,SysUtils,ExtCtrls,DjSSCx,Classes,DjBase,Dialogs,uRecordcenter;

type

{ TDjTc081AC }

  TDjTc081AC = class(TObject)
  private
    TestChannle:Integer;
    FDjSSC :TDjSSCx;
    TmrDj :TTimer;
    ChannelCount:Integer;
    function InitTc081A:boolean;
    function FinalTc081A:boolean;

    procedure DoWork(Sender:TObject);overload;
    procedure DoWork(ChnlID:integer);overload;
    function ConvertDTMF(sVal: integer): string;


    function CheckDial(Channel:PChannel):integer;
    function ClearThree(Channel1: PChannel): integer;
    function CheckPlayEnd(Channel:PChannel):boolean;
  protected

  public
    KeepList:TChannelList;
    constructor Create(DjSSC :TDjSSCx);
    destructor Destroy; override;
    function ResetChannel(ChnlID:integer):boolean;
    procedure HangUp(Channel:PChannel);  //挂机
    function SetLink(ChnlId1,ChnlId2:integer):integer;
    function OffHook(Channel:PChannel):integer;  //内线摘机
    function HangOff(Channel:PChannel):integer;  //内线摘机接听电话
    function CallOut(ChannelIn,ChannelOut:pChannel;DTMFNum:string):integer;
    function KeepChannel(ChannelIn:PChannel):integer;
    function GetKeepChannel(ChannelIn,ChannelOut:PChannel):integer;
    function ClearLink(Channel1,Channel2:PChannel):Integer;
    procedure StartRecord(Channel:PChannel);
    procedure  StopRecord(Channel:PChannel);
    procedure InitRecordChannel;
    procedure StartPlayFile(Channel:PChannel; FileName: string);
    procedure StopPlayFile(Channel:PChannel);
  published

  end;

var
  DjTc081     :TDjTc081AC ;

implementation

uses UnitWriteLogThread,uMeetingCenter;



{ TDjTc081AC }

{-------------------------------------------------------------------------------
  过程名:    TDjTc081AC.Create
  作者:      fengfan
  日期:      2006.08.29
  参数:      无
  返回值:    无
-------------------------------------------------------------------------------}
constructor TDjTc081AC.Create(DjSSC :TDjSSCx);
begin
  TestChannle := 0 ;
  FDjSSC := DjSSC;
  if not Assigned(ChannelList) then
  begin
    ChannelList := TChannelList.Create;
  end;
  if not InitTc081A then
  begin
    AddLogToListB('初始化板卡失败!','板卡',LogError);
    raise TDjException.Create(DjE_InitError);
  end
  else
  begin
    AddLogToListB('初始化板卡成功!','板卡',LogNormal);
  end;
  TmrDj := TTimer.Create(nil);
  TmrDj.Interval := 1 ;
  TmrDj.OnTimer := DoWork ;
  TmrDj.Enabled := True ;
end;

{-------------------------------------------------------------------------------
  过程名:    TDjTc081AC.Destroy
  作者:      fengfan
  日期:      2006.08.29
  参数:      无
  返回值:    无
-------------------------------------------------------------------------------}
destructor TDjTc081AC.Destroy;
begin
  TmrDj.Enabled := False ;
  TmrDj.Free;
  if not FinalTc081A then
  begin
    raise TDjException.Create(DjE_FinalError);
  end;
  inherited;
end;

procedure TDjTc081AC.DoWork(Sender: TObject);
var
  i:integer;
  Channel:PChannel;
begin
  PUSH_PLAY;
  FeedSigFunc;
  for i :=0 to ChannelList.count -1 do
  begin
    Channel := ChannelList.items[i];
    if not Channel.IsUse then Continue ;
    case Channel.ChannelType of
      TrunkChannel:
      begin
        if Sig_CheckBusy(i) = 1 then //忙音检测
        begin
          Channel.DialActor := MasterActor ;
          HangUp(Channel);//ResetChannel(i)
        end;
      end;
      UserChannel:
      begin
        if (not RingDetect(i)) and (Channel.PhoneState = HangState) and (Channel.ringing = false) then
        begin
          if Channel.State in [calling,speck] then Channel.DialActor := MasterActor ;
          ReSetChannel(i);
        end;
      end;
    end;
    DoWork(i);
  end;
end;

procedure TDjTc081AC.DoWork(ChnlID: integer);
var
  Channel:PChannel;
  DTMFCode: string;
//  freetrunk: integer;
//  chnl: integer;
//  Channel2:PChannel;
begin
  Channel := ChannelList.items[ChnlID];
  if ChnlID = TestChannle then
  begin
    AddLogToList('');
  end;
  if (Channel.ChannelType <> UserChannel) and (Channel.ChannelType <> TrunkChannel) then exit ;  
  case Channel.Step of
    0:
    begin
      if RingDetect(ChnlID) then  //检测摘机信号
      begin
        Channel.PhoneState := HangState ;
        StartRecord(Channel);
        case Channel.ChannelType of
          UserChannel:   //内线摘机   拨出电话
          begin
            self.OffHook(Channel);
          end;
          TrunkChannel:   //外线摘机,呼入电话
          begin
            if (Channel.state = Idle) then
            begin
              Channel.State := Calling ;
              Channel.CallActor := CallerActor ;
              if Assigned(FDjSSC.OnDial) then
              begin
                FDjSSC.OnDial(FDjSSC,ChnlID);
              end
              else
              begin
                raise TDjException.Create(DjE_NoDialInFun);
              end;
            end
            else
            begin

            end;
          end;
        end;
        //ChannelList.items[ChnlID] := Channel ;
      end;
    end;
    100:
    begin
      if (DtmfHit(ChnlID)) then
      begin
        Channel.PhoneState := HangState ; //软件摘机后判断话机摘机
        if (Channel.dtmf = '') then    //收到按键,停止播放信号音
        begin
          StartPlaySignal(ChnlID, SIG_STOP);
        end;

        DTMFCode := ConvertDTMF(GetDtmfCode(ChnlID));
        Channel.Dtmf := Channel.Dtmf + DTMFCode ;
        if Channel.Dtmf <> '' then
        begin
          if Assigned(FDjSSC.OnDTMFHit) then
          begin
            FDjSSC.OnDTMFHit(FDjSSC,ChnlID,Channel.Dtmf);
          end;
        end;
      end;
    end;
    101:  //内线呼出是对内线话机结果检测并检测外线摘机情况.
    begin
      if (RingDetect(ChnlID)) then
      begin
         if (Channel.PhoneState <> HangState) then //
         begin
           Channel.PhoneState := HangState ;
           //StartPlaySignal(ChnlID,SIG_RINGBACK);
           Self.SetLink(channel.ChannelID,Channel.ConnectChannel.ConChnlId);
         end;
      end;
      CheckDial(Channel.ConnectChannel.Channeler) ;
    end;
    1000:
    begin
      if Assigned(FDjSSC.OnException) then
      begin
        FDjSSC.OnException(FDjSSC,ChnlID,DjE_NoManager);
      end;
    end;
    1001:
    begin
      if (RingDetect(ChnlID)) then
      begin
         if (Channel.PhoneState <> HangState) then //
         begin
           Channel.PhoneState := HangState ;
           //StartRecord(Channel);
         end
         else
           Channel.Step := 1003;
      end;
    end;
    1002:       //内线呼内线后呼出内线状态检测
    begin
      if (RingDetect(ChnlID)) then
      begin
         if (Channel.PhoneState <> HangState) then //
         begin
           Channel.PhoneState := HangState ;
           StartRecord(Channel);
           //StartPlaySignal(ChnlID,SIG_RINGBACK);


         end
         else
           Channel.Step := 1003;
      end;
    end;
    1004:
    begin
      if (RingDetect(ChnlID)) then
        if (Channel.PhoneState <> HangState) then //
        begin
          Channel.PhoneState := HangState;
          Channel.State := Calling;
        end;
      if CheckPlayEnd(Channel) then
      begin
        StopPlayFile(Channel);
        Channel.Step := 1003;
      end;
    end;
  end; // end of case
end;

function TDjTc081AC.FinalTc081A: boolean;
begin
  DisableCard;
  FreeDRV ;
  Result := true ;
end;

function TDjTc081AC.InitTc081A: boolean;
var
  i: integer;
  Channel:pChannel ;
begin
  //Result := false ;
  if LoadDRV > 0 then
  begin
    raise TDjException.Create(DjE_LoadDriveFailed);
  end
  else
  begin
    AddLogToListB('板卡驱动加载成功','板卡',LogNormal);
  end;
  ChannelCount := CheckValidCh();

  if EnableCard(ChannelCount, 1024 * 50) > 0 then
  begin
    FreeDrv;
    raise TDjException.Create(DjE_InitDjCardFailed);
  end;

  SetPackRate(FDjSSC.PackRate);  //录放音压缩比率

  Sig_Init(0);   /////不需要判断成功失败、?

  for i := 0 to ChannelCount -1 do
  begin
    InitDtmfBuf(i);
    StartSigCheck(i);
    New(Channel);
    Channel.ChannelID := i ;
    Channel.ChannelType := TChannelType(CheckChTypeNew(i));
    case Channel.ChannelType of
      UserChannel, TrunkChannel,RecordChannel:
      begin
        Channel.State :=Idle;
      end;
      Nothing:
      begin
        Channel.State := disabled;
      end;
      else
      begin
        Channel.State := disabled;
      end;
    end;
    Channel.ConnectChannel.ConState := NotingConnect ;
    Channel.ConnectChannel.ConChnlId := -1 ;
    Channel.Dtmf := '';
    Channel.Phone := '';
    Channel.Step := 0;
    Channel.PhoneState := HookState;
    Channel.Ringing:= false ;
    Channel.IsUse := False ;
    Channel.PlayState := NotPlay;
    Channel.Recorded.IsRecord :=false;
    Channel.IsMeeting := false ;
    Channel.ConnectChannel.Channeler := nil ;
    ChannelList.Add(Channel);
  end; // end of for
  Result := true;
end;

function TDjTc081AC.ResetChannel(ChnlID:integer): boolean;
var
//  chnl: integer;
  Channel,ChannelOut:PChannel ;
//  Channel2:PChannel;
  i:integer;
begin
  Channel := ChannelList.items[ChnlID] ;

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

  Channel.PhoneState := HookState;
  case Channel.ChannelType of
    UserChannel:
    begin
      if Channel.Ringing then
      begin
        FeedPower(ChnlID);
        Channel.Ringing := false ;
      end;
    end;
    TrunkChannel:
    begin
      tc08a32.HangUp(ChnlID);
      StartSigCheck(ChnlID);
      Sig_ResetCheck(ChnlID);
      //tc08a32.HangUp(ChnlID);
    end;
  end;

  
  StartPlaySignal(ChnlID, SIG_STOP);
  
  if Channel.ConnectChannel.ConState = OneConnect then
  begin
    if Channel.ConnectChannel.ConChnlId <> -1 then
    begin
      //来电话直接挂掉,不接的情况
      i:= ClearLink(Channel,ChannelList.Items[Channel.ConnectChannel.ConChnlId]) ;
      if i = 0 then
      begin
        if Assigned(FDjSSC.OnClearLink) then
        begin
          FDjSSC.OnClearLink(FDjSSC,Channel.ConnectChannel.ConChnlId,Channel.ChannelID);
        end
        else
        begin

        end;
      end;
    end;
  end;
  //如果软件没有挂机,则挂机.负责不用激发.
  if Channel.State <> idle then
  begin
    StopRecord(Channel);

    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);
      end;
  end;

  i:= Channel.ConnectChannel.ConChnlId;
  ChannelOut := Channel.ConnectChannel.Channeler;
  if Channel.State <> idle 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);


  Channel.Ringing := false ;
  Channel.State := Idle ;
  Channel.dtmf := '';
  Channel.step := 0;

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

  if Channel.ConnectChannel.ConState = Connected  then
  begin
//    Chnl := Channel.ConnectChannel.ConChnlId ;
//    Channel2 := ChannelList.Items[chnl];
//    HangUp(Channel2);
  end
  else
    if (Channel.ConnectChannel.ConState = Ringing)  then
      ResetChannel(Channel.ConnectChannel.ConChnlId);

  Channel.ConnectChannel.ConState := NotingConnect ;
  Channel.ConnectChannel.ConChnlId := -1 ;
  Channel.ConnectChannel.CallActive := false ;
  Channel.ConnectChannel.CallerPhone := '';
  Channel.ConnectChannel.Channeler := nil;

end;

function TDjTc081AC.ConvertDTMF(sVal: integer): string;
begin
  case sval of
    10: result := '0';
    11: result := '*';
    12: result := '#';
    13: result := 'A';
    14: result := 'B';
    15: result := 'C';
    0: result := 'D';
    1..9: result := inttostr(sval);
    -1: result := '';
  end;
end;

⌨️ 快捷键说明

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