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

📄 recordfunc.pas

📁 三汇CTI示例程序源码
💻 PAS
字号:
unit RecordFunc;

interface
type TRUNK_STATE =  (
   TRK_IDLE,
   TRK_PICKUP,
   TRK_RECORD,
   TRK_OUTLINE,
   TRK_ELSE
   );

type Constrol=
(
   SHENGKONG,
   YAKONG,
   MAKONG

)  ;
type LISTENA=
   (
    NoListen,
    Listen
    );

type TRUNK_RECORD =record

    WorkState:TRUNK_STATE;
    ListenState:LISTENA ;
    ConState:Constrol;
    pErrMsg:string;
    dwTimeOutCounter:LongWord;
end;
 /////////////////////////////////////
 function InitCtiSystem() : boolean;
 procedure ExitCtiSystem() ;
 procedure UpdateChannelState();
 procedure InitChannelState();
 procedure InitTrkChannelList();
 procedure AppErrorHandler(ch : Integer);
 procedure ScanChannelState();
 ////////////////VarDefing
 var
     MaxLine:integer;
     ListenChannel:integer;
     ChannelState:array[0..200] of TRUNK_RECORD;
//////////////////////////////
implementation
  uses Shpa3api,Main,Windows, Messages, SysUtils, Classes, Graphics,
     Controls, Forms, Dialogs,ComCtrls, ExtCtrls;
////////////Function InitCtiSystem Define
function InitCtiSystem():  boolean;
var
    strCurrentDir:string;
    fnIni:string;
    fnIndex:string;
    ErrMsg:PChar;
begin
   strCurrentDir:=GetCurrentDir();
   fnIni:=strCurrentDir+'\ShConfig.ini';
   fnIndex:=strCurrentDir+'\shindex.ini';
   if SsmStartCti(@fnIni[1],@fnIndex[1])<>0 then
   begin
      GetMem(ErrMsg,200);
      SsmGetLastErrMsg(ErrMsg);   ////////
      Application.MessageBox (ErrMsg,'错误',MB_Ok);
      FreeMem(ErrMsg);
      InitCtiSystem:=false;
      Exit;
    end;
    if (SsmGetMaxUsableBoard() <> SsmGetMaxCfgBoard())then
    begin
       GetMem(ErrMsg,200);
       SsmGetLastErrMsg(ErrMsg);
       Application.MessageBox (ErrMsg,'错误', MB_OK);
       FreeMem(ErrMsg);
    end;
    MaxLine:=SsmGetMaxCh();
    InitCtiSystem:=True;
end;
 //////////////////Procedure ExitCtiSystem Define
 procedure ExitCtiSystem();
 begin
    SsmCloseCti();
 end;
 ////////////////////Procedure UpdateChannelState Define
 procedure UpdateChannelState();
 var
    i : integer;
    State : string;
    NewDtmf : pChar;
    NewCallerId :array  [0..99] of char;
    OldDtmf : String;
    TempStr:String;
    TEmpStr1:String;
    nResult:integer;
    Num   : integer;
 begin
    num:=0;
    for i:=0 to MaxLine-1 do
    begin
        if SsmGetChType(i)=3 then
            begin
               case (ChannelState[i].WorkState ) of
                  TRK_IDLE:        State:='空闲';
                  TRK_PICKUP:      State:='摘机';
                  TRK_RECORD:      State:='录音';
                  TRK_OUTLINE:     State:='断线';
                  TRK_ELSE:        State:='未定义';
               end;
               TempStr:=MainForm.ChannelListView.Items[num].SubItems[0];
               if State<>TempStr then
                   MainForm.ChannelListView.Items[num].SubItems[0]:=State;

               case (ChannelState[I].ConState ) of
                  SHENGKONG:        State:='声控';
                  YAKONG:           State:='压控';
                  MAKONG:           State:='码控';
               end;
               TempStr:=MainForm.ChannelListView.Items[num].SubItems[1];
               if State<>TempStr then
                    MainForm.ChannelListView.Items[num].SubItems[1]:=state;

               case ChannelState[i].ConState of
                    MAKONG:                         State:='*';
                    SHENGKONG,YAKONG:               State:='';
               end;
               TempStr:=MainForm.ChannelListView.Items[num].SubItems[2];
               if TempStr<>state then
                   MainForm.ChannelListView.Items[num].SubItems[2]:=state ;

               case ChannelState[i].ListenState of
                   NOLISTEN:            State:=' ';
                   LISTEN:              sTATE:='监听';
               end;
               TempStr:=MainForm.ChannelListView.Items[num].SubItems[3];
               if TempStr<>STATE then
                   MainForm.ChannelListView.Items [num].SubItems [3]:=State;

               GetMem(NewDtmf,100);
               SsmGetDtmfStr(I, NewDtmf);
               OldDtmf:=MainForm.ChannelListView.Items[num].SubItems[4];
               if OldDtmf<>NewDtmf then
                  MainForm.ChannelListView.Items [num].SubItems [4]:=StrPas(NewDtmf);
               Freemem(newdtmf);

               nResult := SsmGetCallerId(I, @NewCallerId[0] ) ;
               If (nResult = -1) Then NewCallerId := '-1' ;
               If (nResult = 0) Then NewCallerId := ''  ;
               OldDtmf:=MainForm.ChannelListView.Items[num].SubItems[5];
               if  OldDtmf <> String(NewCallerId) then
                  MainForm.ChannelListView.Items [num].SubItems [5] := StrPas(NewCallerId);

               TempStr:=MainForm.ChannelListView.Items[num].SubItems[6];
               TempStr1:=ChannelState[i].pErrMsg ;
               if TempStr<>TempStr1 then
                  MainForm.ChannelListView.Items[num].SubItems[6]:=TempStr1;
            num:=num+1 ;
            end;
    end;
end;
 /////////////Procedure InitChannelState() Define
procedure InitChannelState();
var
   I:Integer;
Begin
   for I:=0 to MaxLine-1 do
   If SsmGetChType(I) = 3 Then
     begin
       ChannelState[i].WorkState :=TRK_IDLE;
       ChannelState[i].ListenState :=Nolisten;
       ChannelState[i].ConState := SHENGKONG;
       //SetSoundJudgeLevel(I, 1); //新版本不提供
       SsmSetBargeInSens(I, 8)  ;
       //SetJudge(I, 28); //新版本不提供
       SsmSetDtrmLineVoltage(I, 28);
     end;
end;
///////////procedure AppErrorHandler(ch : Integer)
procedure AppErrorHandler(ch : Integer);
var
   ErrMsg :  pChar;
begin
   GetMem(ErrMsg,200);
   SsmGetLastErrMsg(ErrMsg);
   ChannelState[ch].pErrMsg :=StrPas(Errmsg);
   FreeMem(ErrMsg);
   ChannelState[ch].WorkState :=TRK_IDLE;
end;
//////////////Procedure ScanChammelState Define
procedure ScanChannelState();
var
   I:Integer;
   TempDtmf1:Char;
   TempDtmf2:Char;
begin
  for I:=0 to MaxLine-1 do
     if SsmGetChType(I) = 3 then
     begin
         case ChannelState[i].WorkState of
             TRK_IDLE :
               begin
                   //if DetectPickUp(I) = 1 then //新版本不提供
                   if SsmGetChState(I) = 1 then
                   begin
                      ChannelState[i].WorkState :=TRK_PICKUP;
                      If ChannelState[i].ConState = YAKONG Then
                      begin
                         SsmRecToFile(I, 'Test.wav', -1, 0, $ffffffff, 10, 0);
                         if ChannelState[I].ListenState =LISTEN then
                            PlayListen(0,I);
                          ChannelState[I].WorkState :=TRK_RECORD;
                      end;
                   end;
                   if DetectEmpty(I) = 1 Then
                      ChannelState[I].WorkState :=TRK_OUTLINE;
               end;

             TRK_PICKUP:
                begin
                   case  ChannelState[I].ConState of
                        SHENGKONG:
                            If (SsmDetectBargeIn(I) = 1) Then
                               begin
                                  SsmRecToFile(I, 'Test.wav', -1, 0, $ffffffff, 10, 0);
                                  if (channelstate[i].ListenState =listen) then
                                      PlayListen(0,I);
                                  ChannelState[I].WorkState :=TRK_RECORD;
                               end;
                        YAKONG:
                            //if DetectPickUp(I) = 1 then
                            if SsmGetChState(I) = 1 then
                                begin
                                    SsmRecToFile(I, 'Test.wav', -1, 0, $ffffffff, 10, 0);
                                    if (channelstate[i].ListenState =listen) then
                                        PlayListen(0,I);
                                    ChannelState[I].WorkState :=TRK_RECORD;
                                end;

                        MAKONG:
                            begin
                               SsmGetLastDtmf(I,@tempDtmf1 );
                               if (tempDtmf1='*') then
                                begin
                                  SsmRecToFile(I, 'Test.wav', -1, 0, $ffffffff, 10, 0);
                                  if (channelstate[i].ListenState =listen) then
                                      PlayListen(0,I);
                                  ChannelState[I].WorkState :=TRK_RECORD;
                                  //ClearDTMFBuf (I); //新版本不支持
                                  SsmClearRxDtmfBuf(I);
                                end;
                            end;
                   end;
                   //If (DetectEmpty(I) = 1) Then //新版本不支持
                   If (SsmGetChState(I) = 8) Then
                        ChannelState[i].WorkState  := TRK_OUTLINE;
                   If (SsmGetChState(I) = 0) Then
                        ChannelState[i].WorkState := TRK_IDLE;
                end;

             TRK_RECORD:
                begin
                   case  ChannelState[I].ConState of
                        SHENGKONG:
                           if (SsmDetectNoSound(I) = 1) then
                                begin
                                   SsmStopRecToFile(I);
                                   ChannelState[i].WorkState := TRK_PICKUP;
                                end;
                        YAKONG:
                             //If (DetectPickUp(I) = 0) Then
                             If (SsmGetChState(I) = 0) Then
                                 begin
                                    SsmStopRecToFile(I);
                                    ChannelState[i].WorkState:=TRK_IDLE;
                                 end;
                        MAKONG:
                             begin
                                SsmGetLastDtmf(I,@Tempdtmf2);
                                If (TempDtmf2 ='*') Then
                                    begin
                                       SsmStopRecToFile(I);
                                       ChannelState[i].WorkState:=TRK_PICKUP;
                                       //ClearDTMFBuf(I);
                                       SsmClearRxDtmfBuf(I);
                                    end;
                             end;
                   end;
                   //If (DetectEmpty(I) = 1) Then
                   If (SsmGetChState(I) = 8) Then
                        begin
                            SsmStopRecToFile(I);
                            ChannelState[i].WorkState  := TRK_OUTLINE;
                        end;
                   If (SsmGetChState(I) = 0) Then
                        begin
                            SsmStopRecToFile(i);
                            ChannelState[i].WorkState := TRK_IDLE;
                        end;
                    if (channelstate[i].ListenState =listen) then
                        PlayListen(0,I)
                    else
                        StopListen(i);
                end;

             TRK_OUTLINE:
                begin
                   //If DetectEmpty(I) = 0 Then
                   If SsmGetChState(I) = 0 Then
                      ChannelState[i].WorkState := TRK_IDLE;
                end;
       end;
     end;
end;
//////////////InitTrkChannelList()
procedure InitTrkChannelList();
var
      i:integer;
      ListItem:TListItem;
begin
    for i:=0 to MaxLine do
    begin
          if (SsmGetChType(i)=3)then
          begin
            ListItem:=MainForm.ChannelListView.Items.Add ;
            ListItem.Caption :=IntToStr(i);
            begin
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
              ListItem.SubItems.Add (' ');
            end;
          end;
      end;
end;

//////////////

end.






⌨️ 快捷键说明

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