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

📄 mainfrm.pas

📁 三汇CTI示例程序源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
            ChannelState[ch].Dir := UNKNOWN;
            ChannelState[ch].WorkState := CH_OFFLINE;
            ChannelState[ch].Lcd := '';
          end;
        E_RCV_DSTDChannel:
          case pEvent.dwParam of
            DST_OFFHOOK:
            begin
              ChannelState[ch].Dir := UP;
              ChannelState[ch].WorkState := CH_ACTIVE;
              ChannelState[ch].Lcd := '';
              ClearCallID(pEvent);
              StartRecord(ch);
            end;
            DST_RING_ON:
            begin
              ChannelState[ch].Dir := DOWN;
              ChannelState[ch].WorkState := CH_RING;
              ClearCallID(pEvent);
              ChannelState[ch].Lcd := '';
            end;
            DST_MSG_CHG:
            begin
              StrCopy(@(ChannelState[ch].Lcd), PChar(pEvent.pvBuffer));
              ChannelState[ch].LCDLen := pEvent.dwDataLength;
            end;
          end;
      end;
    //end;
    CH_RING:
      case pEvent.wEventCode of
        E_CHG_CHState:
          if (pEvent.dwParam and $ffff) = S_CALL_OFFLINE then
          begin
            ChannelState[ch].Dir := UNKNOWN;
            ChannelState[ch].WorkState := CH_OFFLINE;
            ChannelState[ch].Lcd := '';
            ClearCallID(pEvent);
          end;
        E_RCV_DSTDChannel:
          case pEvent.dwParam of
            DST_RING_OFF:
            begin
              ChannelState[ch].Dir := UNKNOWN;
              ChannelState[ch].WorkState := CH_IDLE;
              GetCallID(pEvent);
            end;
            DST_OFFHOOK:
            begin
              ChannelState[ch].Dir := DOWN;
              ChannelState[ch].WorkState := CH_ACTIVE;
              StartRecord(ch);
            end;
            DST_MSG_CHG:
            begin
              StrCopy(@(ChannelState[ch].Lcd), PChar(pEvent.pvBuffer));
              ChannelState[ch].LCDLen := pEvent.dwDataLength;
            end;
          end;
      end;
    CH_ACTIVE:
      case pEvent.wEventCode of
        E_CHG_Chstate:
          if (pEvent.dwParam and $ffff) = S_CALL_OFFLINE then
          begin
            ChannelState[ch].Dir := UNKNOWN;
            ChannelState[ch].WorkState := CH_OFFLINE;
            ChannelState[ch].Lcd := '';
            if ChannelState[ch].IsRecord = RECORDED then
            begin
              StopRecord(ch);
            end;
          end;
        E_RCV_DSTDChannel:
          case pEvent.dwParam of
            DST_ONHOOK:
            begin
              ChannelState[ch].Dir := UNKNOWN;
              ChannelState[ch].WorkState := CH_IDLE;
              GetCallID(pEvent);
              StopRecord(ch);
            end;
            DST_MSG_CHG:
            begin
              StrCopy(@(ChannelState[ch].Lcd), PChar(pEvent.pvBuffer));
              ChannelState[ch].LCDLen := pEvent.dwDataLength;
            end;
            DST_ABANDONED:
            begin
              ChannelState[ch].WorkState := CH_WAITFOR_ONHOOK;
              GetCallID(pEvent);
              StopRecord(ch);
            end;
          end;
      end;
    CH_OFFLINE:
      if (pEvent.wEventCode = E_CHG_CHState) and ((pEvent.dwParam and $ffff) = S_CALL_STANDBY) then
      begin
        ChannelState[ch].Dir := UNKNOWN;
        ChannelState[ch].Lcd := '';
        ChannelState[ch].WorkState := CH_IDLE;
        ClearCallID(pEvent);
      end;
    CH_WAITFOR_ONHOOK:
      case pEvent.wEventCode of
        E_CHG_CHState:
          if (pEvent.dwParam and $ffff) = S_CALL_OFFLINE then
          begin
            ChannelState[ch].Dir := UNKNOWN;
            ChannelState[ch].WorkState := CH_OFFLINE;
            if ChannelState[ch].IsRecord = RECORDED then
            begin
              StopRecord(ch);
            end;
          end;
        E_RCV_DSTDChannel:
          case pEvent.dwParam of
            DST_ONHOOK:
            begin
              ChannelState[ch].Dir := UNKNOWN;
              ChannelState[ch].WorkState := CH_IDLE;
            end;
            DST_MSG_CHG:
            begin
              StrCopy(@(ChannelState[ch].Lcd), PChar(pEvent.pvBuffer));
              //ChannelState[ch].Lcd := PChar(pEvent.pvBuffer);
              ChannelState[ch].LCDLen := pEvent.dwDataLength;
            end;
          end;
      end;
  end;

  Result := 0;
end;

procedure TMainForm.RdBtnDefaultClick(Sender: TObject);
begin
  iRecFormat := -1;
end;

procedure TMainForm.RdBtnALawClick(Sender: TObject);
begin
  iRecFormat := 6;
end;

procedure TMainForm.RdBtnULawClick(Sender: TObject);
begin
  iRecFormat := 7;
end;

procedure TMainForm.RdBtnIMAClick(Sender: TObject);
begin
  iRecFormat := 17;
end;

procedure TMainForm.RdBtnGC8Click(Sender: TObject);
begin
  iRecFormat := 131;
end;

procedure TMainForm.RdBtnG729AClick(Sender: TObject);
begin
  iRecFormat := $ff83;
end;

procedure TMainForm.BtnStartListenClick(Sender: TObject);
begin
  //
  iCurCh := StrToInt(CmbBxListenCh.Text);
  if iListenChannel <> iCurCh then
  begin
    if iListenChannel < iMaxCh then
    begin
      if SsmStopListenTo(iListenChannel, 0) = -1 then
      begin
        SsmGetLastErrMsg(szErrMsg);
        MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
        Exit;
      end;

      ChannelState[iListenChannel].IsListen := UNLISTEN;
    end;

    if SsmListenTo(iCurCh, 0) = -1 then
    begin
      SsmGetLastErrMsg(szErrMsg);
      MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
      Exit;
    end;

    ChannelState[iCurCh].IsListen := LISTEN;
    iListenChannel := iCurCh;
  end;
end;

procedure TMainForm.BtnStopListenClick(Sender: TObject);
begin
  //
  if iListenChannel < iMaxCh then
  begin
    ChannelState[iListenChannel].IsListen := UNLISTEN;
    if SsmStopListenTo(iListenChannel, 0) = -1 then
    begin
      SsmGetLastErrMsg(szErrMsg);
      MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
    end;

    iListenChannel := iMaxCh;
  end;
end;

procedure TMainForm.CmbBxListenChChange(Sender: TObject);
begin
  iCurCh := StrToInt(CmbBxListenCh.Text);
end;

procedure StartRecord(ch: Integer);
var
  recFile: PChar;
begin
  //
  recFile := PChar('Test'+ IntToStr(ch) + '.wav');
  if SsmRecToFile(ch, recFile, iRecFormat, 0, $ffffffff, 0, 0) = -1 then
  begin
    SsmGetLastErrMsg(szErrMsg);
    MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
  end;

  ChannelState[ch].IsRecord := RECORDED;
end;

procedure StopRecord(ch: Integer);
//var
//  nreChkRecToFile: Integer;
begin
  //
  ChannelState[ch].IsRecord := UNRECORD;

  case SsmChkRecToFile(ch) of
    -1:
    begin
      SsmGetLastErrMsg(szErrMsg);
      MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
    end;
    1:
    begin
      if SsmStopRecToFile(ch) = -1 then
      begin
        SsmGetLastErrMsg(szErrMsg);
        MessageBox(MainForm.Handle, szErrMsg, AppTitle, MB_OK or MB_ICONERROR);
      end;
    end;
  end;
end;

procedure ClearCallID(pEvent: PSSM_EVENT);
var
  ch: Integer;
begin
  //
  ch := pEvent.nReference;
  ChannelState[ch].pCallID := '';
end;

procedure GetCallID(pEvent: PSSM_EVENT);
var
  ch: Integer;
  IDPos: Integer;
  LCDPos: Integer;
  NumStarPos: Integer;
  NumStopPos: Integer;
begin
  //
  NumStarPos := 0;
  NumStopPos := 0;
  ch := pEvent.nReference;
  if ChannelState[ch].LCDLen < 2 then
  begin
    Exit;
  end;
  LCDPos := ChannelState[ch].LCDLen - 1;
  IDPos := 0;

  //
  while LCDPos > 0 do
  begin
    if NumStopPos = 0 then
    begin
      if (Ord(ChannelState[ch].Lcd[LCDPos]) < $39) and (Ord(ChannelState[ch].Lcd[LCDPos]) > $30) then
      begin
        NumStopPos := LCDPos;
      end;
    end
    else
    begin
      if (Ord(ChannelState[ch].Lcd[LCDPos]) > $39) or (Ord(ChannelState[ch].Lcd[LCDPos]) < $30) then
      begin
        NumStarPos := LCDPos + 1;
        Break;
      end;
    end;

    LCDPos := LCDPos - 1;
  end;

  if (NumStarPos = 0) and (NumStopPos = 0) and (Ord(ChannelState[ch].Lcd[0]) > $39) or (Ord(ChannelState[ch].Lcd[0]) < $30) then
  begin
    Exit;
  end;

  ChannelState[ch].CallIDLen := NumStopPos - NumStarPos + 1;

  for IDPos := 0 to ChannelState[ch].CallIDLen do
  begin
    ChannelState[ch].pCallID[IDPos] := ChannelState[ch].Lcd[NumStarPos];
    NumStarPos := NumStarPos + 1;
  end;

  ChannelState[ch].pCallId[IDPos] := #0;
end;

procedure TMainForm.MainTimerTimer(Sender: TObject);
begin
  UpdateChannelState()
end;

end.

⌨️ 快捷键说明

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