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

📄 main.pas

📁 基于东进公司模拟语音板卡下的CTI demo
💻 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 + -