📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,GxVoice, ExtCtrls;
type
TForm1 = class(TForm)
ListViewV: TListView;
Timer1: TTimer;
Timer2: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
card_run:Integer;
public
{ Public declarations }
end;
type
TStatus=(STATUS_IDLE,
STATUS_RECORDING
);
LINERECORD = record
chno:integer;
chtype:integer;
status:TStatus;
substatus:integer;
chhook:integer;
chiddtmf:integer;
chidtime:integer;
chdirection:integer;
chdiretime:integer;
dtmf:array [0..101] of char;
dtmflen:integer;
end;
var
Form1: TForm1;
DriverOpenFlag:Integer;
TotalVoiceLine:Integer;
Line:array [0..31] of LINERECORD;
MessageBuffer : GX_MESSAGE_INFO;
PListItem : TListItem;
VoicePath:array [0..MAX_PATH] of char;
VoiceFile:array [0..MAX_PATH] of char;
soundpath:string;
DTMFBuffer:array [0..50] of char;
CallerIDString:array [0..200] of char;
CIDDateTime,CIDTelNo,CIDName:array [0..150] of char;
// VoiceBuffer:array [0..$8000] of char;
// PlayIndexBufferTable:array [0..$100] of word;
// OneBuffer:array [0..2878] of char;
// EightBuffer:array [0..3542] of char;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
ListItem:TListItem;
ctemp:string;
iFileHandle: Integer;
iFileLength: Integer;
iBytesRead: Integer;
begin
// GetWindowsDirectory(VoicePath,MAX_PATH);
// ctemp:=strpas(VoicePath)+'\Cti\';
// strPCopy(VoicePath,ctemp);
DriverOpenFlag:=GX_InitializeSystem();
if DriverOpenFlag<>GX_OK then
begin
ShowMessage('Initialize card failure');
exit;
end;
TotalVoiceLine:=GX_GetTotalVoiceChannel();
if TotalVoiceLine > 32 then
TotalVoiceLine:=32;
for i:=0 to TotalVoiceLine - 1 do
begin
ListItem:=ListViewV.Items.Add;
ListItem.Caption:=format('%d',[i+1]);
Line[i].chtype:=GX_GetChannelType(i);
Line[i].status:=STATUS_IDLE;
Line[i].chhook:=0;
Line[i].chiddtmf:=0;
Line[i].chidtime:=0;
Line[i].chdirection:=0;
Line[i].chdiretime:=0;
Line[i].dtmflen:=0;
case Line[i].chtype of
CHANNEL_TYPE_NONE:
ctemp:='None';
CHANNEL_TYPE_USER:
ctemp:='User';
CHANNEL_TYPE_TRUNK:
ctemp:='Thrunk';
CHANNEL_TYPE_RECORD:
ctemp:='Record';
CHANNEL_TYPE_MIX:
ctemp:='Mix';
else
ctemp:='Unknown';
end;
ListItem.SubItems.Add(ctemp);
ListItem.SubItems.Add('Idle');
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
if Line[i].chtype <> CHANNEL_TYPE_NONE then
begin
GX_OpenChannel(i);
GX_StartDetectDTMF(i, 0);
GX_StartDetectCallerID(i);
end;
end;
card_run:=0;
Timer1.Enabled:=true;
Timer2.Enabled:=true;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
begin
Timer1.Enabled:=false;
Timer2.Enabled:=false;
if DriverOpenFlag=GX_OK then
begin
for i:=0 to TotalVoiceLine - 1 do
begin
GX_StopAllOperate(i);
GX_CloseChannel(i);
end;
GX_CloseSystem();
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
ChannelNo:word;
MessageCode:word;
Hour, Min, Sec, MSec: Word;
begin
if (card_run <> 0) then
exit;
card_run:=1;
while GX_GetMessageForWindows(10, @MessageBuffer)=GX_OK do
begin
ChannelNo:=MessageBuffer.ChannelNo;
MessageCode:=MessageBuffer.MessageCode;
case Line[ChannelNo].status of
STATUS_IDLE:
begin
case MessageCode of
MESSAGE_HAVE_CID_FSK:
begin
if (GX_GetFskCallerID(ChannelNo, CIDDateTime,CIDTelNo,CIDName)=GX_OK) then
begin
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[2]:=strPas(CIDTelNo);
PListItem.SubItems.Strings[3]:=strpas(CIDDateTime);
end;
GX_StartDetectCallerID(ChannelNo);
Line[ChannelNo].status:=STATUS_IDLE;
end;
MESSAGE_HAVE_DTMF:
begin
//before hook off,dtmf is dtmf cid.
if (Line[ChannelNo].chhook = 0) then
begin
if (GX_GetDTMFKey(ChannelNo,1,DTMFBuffer)=GX_OK) then
begin
//0-9
if ((Line[ChannelNo].dtmflen < 50) and
(DTMFBuffer[0]>=chr($30)) and (DTMFBuffer[0]<=chr($39))) then
begin
Line[ChannelNo].dtmf[Line[ChannelNo].dtmflen] := DTMFBuffer[0];
Line[ChannelNo].dtmflen:=Line[ChannelNo].dtmflen + 1;
Line[ChannelNo].dtmf[Line[ChannelNo].dtmflen]:= chr(0);
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[2]:=Line[ChannelNo].dtmf;
Line[ChannelNo].chiddtmf := 1;
Line[ChannelNo].chidtime := 0;
end;
end;
end;
end;
MESSAGE_RECORD_OPEN_CIRCLE:
begin
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Disconnect';
Line[ChannelNo].chiddtmf := 0;
Line[ChannelNo].chhook := 0;
Line[ChannelNo].dtmflen := 0;
end;
MESSAGE_RECORD_NO_OPEN_CIRCLE:
begin
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Connect';
Line[ChannelNo].chiddtmf := 0;
Line[ChannelNo].chhook := 0;
Line[ChannelNo].dtmflen := 0;
end;
MESSAGE_RECORD_HOOK_OFF:
begin
Line[ChannelNo].dtmflen:=$0000;
PListItem := ListViewV.Items.Item[ChannelNo];
if Line[ChannelNo].chdirection=0 then
PListItem.SubItems.Strings[1]:='Recording Out'
else
PListItem.SubItems.Strings[1]:='Recording In';
DecodeTime(Time, Hour, Min, Sec, MSec);
StrPCopy(VoiceFile,format('c:\%0.2d_%0.2d%0.2d%0.2d.wav',[ChannelNo,Hour, Min, Sec]));
If (GX_StartRecordWaveFile(ChannelNo, VoiceFile, 0, $ffffffff, chr(0)) <> GX_OK) Then
PListItem.SubItems.Strings[1]:='Record Error';
Line[ChannelNo].chdirection :=0;
Line[ChannelNo].chiddtmf := 0;
Line[ChannelNo].chhook := 1;
Line[ChannelNo].dtmflen := 0;
Line[ChannelNo].status:=STATUS_RECORDING;
end;
{ MESSAGE_RECORD_HOOK_ON:
begin
Line[ChannelNo].dtmflen:=$0000;
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Hook on';
PListItem.SubItems.Strings[2]:='';
PListItem.SubItems.Strings[3]:='';
Line[ChannelNo].chiddtmf := 0;
Line[ChannelNo].chhook := 0;
Line[ChannelNo].dtmflen := 0;
end;}
MESSAGE_RECORD_RING:
begin
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Ring'+format('%d',[MessageBuffer.MsgBuff[0]]);
Line[ChannelNo].chidtime:=0;
Line[ChannelNo].chdirection:=1;
Line[ChannelNo].chdiretime:=0;
end;
end;
end;
STATUS_RECORDING:
begin
//dtmf
if MessageCode = MESSAGE_HAVE_DTMF then
begin
if (GX_GetDTMFKey(ChannelNo,1,DTMFBuffer)=GX_OK) then
begin
Line[ChannelNo].dtmf[Line[ChannelNo].dtmflen] := DTMFBuffer[0];
Line[ChannelNo].dtmflen:=Line[ChannelNo].dtmflen + 1;
Line[ChannelNo].dtmf[Line[ChannelNo].dtmflen]:= chr(0);
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[4]:=Line[ChannelNo].dtmf;
end;
end
//stop record
else if MessageCode = MESSAGE_RECORD_HOOK_ON then
begin
GX_StopRecordVoice(ChannelNo);
Line[ChannelNo].status:=STATUS_IDLE;
Line[ChannelNo].chhook :=0;
Line[ChannelNo].chidtime:=0;
Line[ChannelNo].chdirection:=0;
Line[ChannelNo].chdiretime:=0;
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Idle';
PListItem.SubItems.Strings[2]:='';
PListItem.SubItems.Strings[3]:='';
PListItem.SubItems.Strings[4]:='';
end
else if MessageCode = MESSAGE_RECORD_OPEN_CIRCLE then
begin
GX_StopRecordVoice(ChannelNo);
Line[ChannelNo].status:=STATUS_IDLE;
Line[ChannelNo].chhook :=0;
Line[ChannelNo].chidtime:=0;
Line[ChannelNo].chdirection:=0;
Line[ChannelNo].chdiretime:=0;
PListItem := ListViewV.Items.Item[ChannelNo];
PListItem.SubItems.Strings[1]:='Disconnect';
PListItem.SubItems.Strings[2]:='';
PListItem.SubItems.Strings[3]:='';
PListItem.SubItems.Strings[4]:='';
end;
end;
end;
end;
card_run:=0;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var
i:integer;
begin
//clear dtmf cid
for i:=0 to TotalVoiceLine - 1 do
begin
if Line[i].chiddtmf = 1 then
begin
Line[i].chidtime := Line[i].chidtime + 1;
if Line[i].chidtime >= 8 then
begin
Line[i].chiddtmf:=0;
Line[i].chidtime:=0;
Line[i].dtmflen:=0;
PListItem := ListViewV.Items.Item[i];
PListItem.SubItems.Strings[1]:='Idle';
PListItem.SubItems.Strings[2]:='';
PListItem.SubItems.Strings[3]:='';
end;
end;
if Line[i].chdirection=1 then
begin
Line[i].chdiretime:=Line[i].chdiretime + 1;
if Line[i].chdiretime >= 8 then
begin
Line[i].chdirection:=0;
Line[i].chdiretime:=0;
PListItem := ListViewV.Items.Item[i];
PListItem.SubItems.Strings[1]:='Idle';
PListItem.SubItems.Strings[2]:='';
PListItem.SubItems.Strings[3]:='';
end;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -