📄 djtc081ac.pas.bak
字号:
function TDjTc081AC.SetLink(ChnlId1, ChnlID2: integer): integer;
var
ChannelIn,ChannelOut:PChannel;
begin
ChannelIn := ChannelList.Items[ChnlId1];
ChannelOut := ChannelList.Items[ChnlId2];
Result := tc08a32.SetLink(ChnlId1,ChnlId2) ;
if Result =0 then
begin
ChannelIn.State := Speck;
ChannelIn.Ringing := false ;
ChannelIn.ConnectChannel.ConState := Connected ;
ChannelIn.ConnectChannel.ConChnlId := ChnlId2 ;
ChannelIn.ConnectChannel.CallActive :=true ;
ChannelIn.ConnectChannel.Channeler := ChannelOut ;
ChannelOut.State := Speck ;
ChannelOut.Ringing := false ;
ChannelOut.ConnectChannel.ConState := Connected ;
ChannelOut.ConnectChannel.ConChnlId := ChnlID1 ;
ChannelOut.ConnectChannel.Channeler := ChannelIn ;
ChannelOut.ConnectChannel.CallActive := true ;
if Assigned(FDjSSC.OnLink) then
FDjSSC.OnLink(FDjSSC,ChannelIn.ConnectChannel.ConChnlId,ChannelIn.ChannelID);
end;
end;
function TDjTc081AC.ClearLink(Channel1,Channel2:PChannel): Integer;
begin
result := tc08a32.ClearLink(Channel1.ChannelID,Channel2.ChannelID);
end;
{-------------------------------------------------------------------------------
过程名: TDjTc081AC.HangUp
作者: 姜亦文
日期: 2006.09.08
参数: Channel: PChannel 挂机
返回值: 无
-------------------------------------------------------------------------------}
procedure TDjTc081AC.HangUp(Channel: PChannel);
var
ChannelOut:PChannel;
// i:integer;
begin
if Channel.PlayState = Playing then
DjTc081.StopPlayFile(Channel);
case Channel.ChannelType of
UserChannel:
begin
case Channel.State of
Idle:
begin
exit;
end;
disabled: exit;
Calling:
begin
StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
//HangUp(Channel.ConnectChannel.Channeler);
end;
Dailing:
begin
if Channel.Ringing then
begin
FeedPower(Channel.ChannelID);
Channel.Ringing := false ;
//ResetChannel(Channel.ConnectChannel.ConChnlId);
end;
end;
Speck:;
end;
// Channel.dtmf := '';
if Channel.PhoneState = HangState then
begin
Channel.Step := 1001 ; //因为软挂机,话机没有挂,所以不能读取. 判断话机类型??
StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
end
else
Channel.Step := 0;
ChannelOut := Channel.ConnectChannel.Channeler;
Channel.State := Idle;
if Channel.ConnectChannel.ConState = Connected then
begin
Channel.ConnectChannel.ConState:= OneConnect ;
//Channel.ConnectChannel.ConChnlId := -1 ;
Channel.ConnectChannel.CallActive := false ;
Channel.ConnectChannel.CallerPhone := '';
//HangUp(Channel.ConnectChannel.Channeler);//StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
Channel.ConnectChannel.Channeler := nil ;
end;
if Channel.IsMeeting then
if Channel.ConnectChannel.ConState = ThreeState then
begin
Channel.ConnectChannel.ConState:= OneConnect ;
//Channel.ConnectChannel.ConChnlId := -1 ;
Channel.ConnectChannel.CallActive := false ;
Channel.ConnectChannel.CallerPhone := '';
Channel.ConnectChannel.Channeler := nil ;
ClearThree(Channel);
if Channel.PhoneState = HangState then
begin
Channel.Step := 1001 ; //因为软挂机,话机没有挂,所以不能读取. 判断话机类型??
StartPlaySignal(Channel.ChannelID,SIG_BUSY1);
end
else
Channel.Step := 0;
end;
Channel.IsMeeting := false ;
Channel.Meeting := nil;
if (Assigned(ChannelOut)) and (ChannelOut.State = Calling) then
if Assigned(FDjSSC.OnHangUp) then
if (Assigned(ChannelOut)) and (ChannelOut.State <> idle) then
FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,Channel.ConnectChannel.ConChnlId)
else
FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,-1);
// //挂机后处理对方
StopRecord(Channel);
if Channel.PhoneState = HookState then //来电,软件摘机,但话机未摘,则reset
ReSetChannel(Channel.ChannelID);
end;
TrunkChannel:
begin
ResetChannel(channel.ChannelID)
end;
end;
end;
{-------------------------------------------------------------------------------
过程名: TDjTc081AC.HangOff
作者: 姜亦文
日期: 2006.09.08
参数: Channel: PChannel 内线被动摘机
返回值: integer
-------------------------------------------------------------------------------}
function TDjTc081AC.HangOff(Channel: PChannel): integer;
var
i:integer;
ChnlId1,ChnlId2:Integer;
Channel1,Channel2:PChannel ;
begin
if Channel.Ringing then
FeedPower(Channel.ChannelID);
Channel1 := Channel ;
ChnlId1 := Channel.ChannelID ;
ChnlId2 := Channel.ConnectChannel.ConChnlId ;
Channel2 := ChannelList.Items[ChnlId2];
Channel.Ringing := false;
//if Channel2.ChannelType = TrunkChannel then
StartPlaySignal(ChnlId2,SIG_STOP);
i := Setlink(ChnlId2,ChnlId1);
if i= 0 then
begin
Channel.Step := 1001 ;
Channel2.Step := 1001;
end
else
begin
//if
end;
end;
{-------------------------------------------------------------------------------
过程名: TDjTc081AC.OffHook
作者: 姜亦文
日期: 2006.09.08
参数: Channel: PChannel //内线摘机
返回值: integer
-------------------------------------------------------------------------------}
function TDjTc081AC.OffHook(Channel: PChannel): integer;
begin
case Channel.State of
Idle: //主动
begin
Channel.State := Calling ;
if Assigned(FDjSSC.OnHookUp) then
begin
FDjSSC.onHookUp(FDjSSC,Channel.ChannelID);
end;
end;
Dailing: //被动
begin
Self.HangOff(Channel);
end;
end;
end;
function TDjTc081AC.CallOut(ChannelIn,ChannelOut: pChannel; DTMFNum: string): integer;
var
ChnlID:integer;
DialPhone:pchar;
begin
if ChannelOut.State <> Idle then
begin
Result := -9;
exit;
end;
ChannelOut.Dtmf := DTMFNum;
ChannelOut.State := Dailing ;
ChnlID := ChannelOut.ChannelID;
StartSigCheck(ChnlID);
tc08a32.OffHook(ChnlID);
DialPhone := pchar(ChannelOut.Dtmf);
Sig_StartDial(ChnlID,pchar(FDjSSC.PreDialNum + DTMFNum),'',0);
ChannelOut.Step := 1001;
ChannelIn.Step := 101 ;
end;
function TDjTc081AC.CheckDial(Channel: PChannel): integer;
var
ChnlInID:Integer;
ChnlOutID:Integer;
CheckDialResult:integer;
ChannelIn,ChannelOut:PChannel;
begin
Result:=100;
sleep(1);
ChnlOutID := Channel.ChannelID;
ChannelOut := Channel;
ChannelIn := ChannelOut.ConnectChannel.Channeler;
ChnlInID := ChannelIn.ChannelID;
// if ElapseTime(ChnlOutID,4)>=2000 then //超时处理
// CheckDialResult := S_TimeOut
// else
CheckDialResult := Sig_CheckDial(ChnlOutID);
//StartPlaySignal(ChnlInID, SIG_RINGBACK);
case CheckDialResult of
S_TimeOut,S_BUSY,S_NOBODY,S_NOSIGNAL://超时,遇忙、没人接听,没有信号
begin
if Assigned(FDjSSC.OnCallError) then
FDjSSC.OnCallError(FDjSSC,ChnlInID,ChnlOutID,CheckDialResult);
ChannelOut.DialActor := MasterActor ;
HangUp(ChannelOut);
//ResetChannel(ChnlOutID);
end;
S_CONNECT:
begin
StartPlaySignal(ChnlInID, SIG_STOP);
CheckDialResult := Self.SetLink(ChnlInID,ChnlOutID);
StartRecord(ChannelIn);
StartRecord(ChannelOut);
if CheckDialResult = 0 then
begin
ChannelIn.Step := 1001 ;
ChannelOut.Step := 1001 ;
end
else
begin
end;
end;
S_NORESULT:;
else
begin
AddLogToList('没有拨号音!');
if Assigned(FDjSSC.OnCallError) then
FDjSSC.OnCallError(FDjSSC,ChnlInID,ChnlOutID,CheckDialResult);
ChannelOut.DialActor := MasterActor ;
HangUp(ChannelOut);
//(ChnlOutID);
end;
end;// end of case
end;
function TDjTc081AC.KeepChannel(Channelin: PChannel): integer;
var
ChannelOut:PChannel ;
i:integer;
begin
if ChannelIn.ConnectChannel.ConState in [Connected,MeetingState] then
begin
ChannelOut:= ChannelIn.ConnectChannel.Channeler;
ChannelOut.State := keep ;
ChannelOut.ConnectChannel.ConState := Keeping;
ChannelOut.ConnectChannel.ConChnlId := -1;
//KeepList.Add(ChannelOut);
ChannelIn.ConnectChannel.ConChnlId := -1 ;
StartPlaySignal(ChannelIn.ChannelID,SIG_STOP);
StartPlaySignal(ChannelOut.ChannelID,SIG_STOP);
i := Self.ClearLink(ChannelIn,ChannelOut);
if i = 0 then
AddLogToList('');
HangUp(ChannelIn);
Result := 0 ;
end
else
Result := -1 ;
end;
function TDjTc081AC.GetKeepChannel(ChannelIn,
ChannelOut: PChannel): integer;
var
ChnlInID,ChnlOutID:integer;
i:integer;
begin
ChnlInID := ChannelIn.ChannelID;
ChnlOutID := ChannelOut.ChannelID;
if ChannelIn.State <> idle then
Result := -1
else
if ChannelOut.State <> keep then
Result := -2
else
begin
i := Self.SetLink(ChnlInID,ChnlOutID);
if i = 0 then
begin
Result := 0 ;
end
else
Result := i ;
end;
end;
function TDjTc081AC.ClearThree(Channel1: PChannel): integer;
var
Meeting:PMeeting;
i:integer;
Channel2,Channel3:PChannel;
begin
Meeting := Channel1.Meeting;
Channel2 := DjMC.GetThreeChannel(Meeting,Channel1);
Channel3 := DjMC.GetThreeChannel(Channel1.Meeting,Channel1,Channel2);
i := DjMC.DeleteChannel(Channel2);
if i = 0 then
begin
i := DjMC.DeleteChannel(Channel1);
if i = 0 then
begin
i := DjMC.DeleteChannel(Channel3);
if i = 0 then
begin
if Assigned(FDjSSC.OnClearThree) then
FDjSSC.OnClearThree(Self,Channel1.ChannelID,Channel3.ChannelID,Channel2.ChannelID)
else
begin
DjTc081.SetLink(Channel2.ChannelID,Channel3.ChannelID);
end;
end;
end;
end;
end;
procedure TDjTc081AC.StartRecord(Channel: PChannel);
var
RChannel:PChannel;
ChnlID:integer;
FileName:string;
// i:integer;
begin
if not FDjSSC.Recorded then exit;
RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
ChnlID := Channel.ConnectChannel.ConChnlId;
if Assigned(RChannel) then
begin
if Channel.Recorded.IsRecord then
begin
FileName:= RecordCenter.GetRecordFileName(rChannel.ChannelID);
if StartRecordFile(RChannel.ChannelID,pchar(FileName),8000*3600) then
begin
if assigned(FDjSSC.OnRecord) then FDjSSC.OnRecord(FDjSSC,Channel.ChannelID,ChnlID,FileName);
AddLogToList('开始录音 '+filename);
end
else
////////
end;
end;
end;
procedure TDjTc081AC.StopRecord(Channel: PChannel);
var
RChannel:PChannel;
// ChnlID:integer;
// FileName:string;
// i:integer;
begin
if not FDjSSC.Recorded then exit;
RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
// ChnlID := Channel.ConnectChannel.ConChnlId;
if (Channel.Recorded.IsRecord) and (Assigned(RChannel)) then
begin
StopRecordFile(RChannel.ChannelID);
AddLogToList('停止录音');
end;
end;
procedure TDjTc081AC.InitRecordChannel;
var
RChannel,Channel:PChannel ;
i:integer;
begin
for i :=0 to ChannelList.Count -1 do
begin
Channel := ChannelList.Items[i];
if (Channel.Recorded.IsRecord) then
begin
RChannel := ChannelList.Items[Channel.Recorded.RecordChannel];
if Assigned(RChannel) then
begin
if Channel.Recorded.IsAGC then
D_SetWorkMode(RChannel.ChannelID,WORK_MODE_REC_AGC,REC_AGC_MODE_VAL_ENABLE)
else
D_SetWorkMode(RChannel.ChannelID,WORK_MODE_REC_AGC,REC_AGC_MODE_VAL_DISABLE);
D_SetWorkMode (RChannel.ChannelID, WORK_MODE_AGC_PARAM_INCREASE, 8 );
// // reduce times : 0.5 (16/32)
D_SetWorkMode (RChannel.ChannelID, WORK_MODE_AGC_PARAM_DECREASE, 16 );
end;
end;
end;
end;
procedure TDjTc081AC.StartPlayFile(Channel: PChannel; FileName: string);
var
ChnlID:Integer ;
// i:integer;
begin
ChnlID := Channel.ChannelID;
//if Channel.State in [idle,Calling] then
begin
if tc08a32.StartPlayFile(ChnlID,pchar(FileName),0) then
begin
if Assigned(FDjSSC.OnPlayBegin) then FDjSSC.OnPlayBegin(FDjSSC,ChnlID,FileName);
if Channel.State in [idle,calling] then Channel.Step := 1004 ;//放音检查
Channel.PlayState := Playing ;
end
else
//////
end;
end;
procedure TDjTc081AC.StopPlayFile(Channel: PChannel);
var
ChnlID:Integer ;
// i:integer;
begin
ChnlID := Channel.ChannelID;
if Channel.PlayState = Playing then
begin
tc08a32.StopPlayFile(ChnlID);
Channel.PlayState := NotPlay ;
if Assigned(FDjSSC.OnPlayEnd) then FDjSSC.OnPlayEnd(FDjSSC,ChnlID);
end;
end;
function TDjTc081AC.CheckPlayEnd(Channel: PChannel): boolean;
begin
Result := tc08a32.CheckPlayEnd(Channel.ChannelID);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -