📄 mainfrm.pas
字号:
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 + -