📄 recordfunc.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 + -