Delphi之三汇模拟语音卡(SHT-8B/PCI/FAX)可复用源码

  Delphi之三汇模拟语音卡(SHT-8B/PCI/FAX)可复用源码
  作者:成晓旭
  设计简介:
  1、 设计思路请参考本站Blog的另一篇文章:“Delphi之东进模拟语音卡(D160A)可复用源码”;链接http://blog.csdn.net/CXXSoft/archive/2006/08/23/1108211.aspx
  2、 其实,仔细对比,你会发现这两种卡的代码类方法签名几乎99%是一样的,也就是说,这两都之间,还需要更进一步的抽象,以解决“重复代码”或者“相似代码”的问题。
  3、 更高层次的抽象,请参考我的设计文档。
  4、 类图(以后补上):
  5、 卡类源码:
  
王朝网络
//------------------------------------------------------------------------------
  
王朝网络
//
  
王朝网络
// 产品名称: 成晓旭的个人软件Delphi源码库
  
王朝网络
// 产品版本: CXXSoft delphi code source lib 2.0
  
王朝网络
// 模块名称: Delphi之三汇模拟语音卡类
  
王朝网络
// 模块描述:
  
王朝网络
// 单元文件: unSHCard8B.pas
  
王朝网络
// 开发作者: 成晓旭
  
王朝网络
// 备注: 任何人使用此文件时,请保留此段自述文件,谢谢!
  
王朝网络
// 开发时间: 2003-12-03
  
王朝网络
// 修改历史:
  
王朝网络
// 修改描述:
  
王朝网络
//------------------------------------------------------------------------------
  
王朝网络
unit unSHCard8B;
  
王朝网络

  
王朝网络
interface
  
王朝网络
uses
  
王朝网络
Windows,
  
王朝网络
//unDJTC08a32,unDJNewSig,
  
王朝网络
unBaseDefine,
  
王朝网络
//unDJ160ADefine,unDJChanne160A,
  
王朝网络
unShpa3api,unSHChanne18B,unSH8BDefine;
  
王朝网络
type
  
王朝网络
TCXXCommCard8B = class(TObject)
  
王朝网络
private
  
王朝网络

  
王朝网络
ChannelNumber:Word;
  
王朝网络
channelObject:array of TCXXSHChannel8B;
  
王朝网络
OnCardChannelState:TTrunkStatusEvent;
  
王朝网络

  
王朝网络
procedure ReleaseCommDevice();
  
王朝网络
function GetChannelObjectOrder(const aChannelID:Word):Word;
  
王朝网络
function InitChannel():boolean;
  
王朝网络
public
  
王朝网络

  
王朝网络
constructor Create(const trunkEvent:TTrunkStatusEvent);
  
王朝网络
destructor Destroy(); override;
  
王朝网络

  
王朝网络
function LoadCommDevice(const loadAll:boolean=false):boolean;
  
王朝网络
function Startup():boolean;
  
王朝网络
function GetAFreeChannel():Word;
  
王朝网络
function GetChannelNumber():Word;
  
王朝网络
function DialPhone(const aChannelID:Word;const DialPhoneNumber:PChar):boolean;
  
王朝网络
function HangUp(const aChannelID:Word):boolean;
  
王朝网络

  
王朝网络
end;
  
王朝网络

  
王朝网络

  
王朝网络
implementation
  
王朝网络

  
王朝网络
const
  
王朝网络
SH_ConfigFile = 'C:ShCtiShConfig.ini';
  
王朝网络
SH_IndexFile = 'C:ShCtiShIndex.ini';
  
王朝网络

  
王朝网络
王朝网络
...{ TCXXCommCard8B }
  
王朝网络
constructor TCXXCommCard8B.Create(const trunkEvent:TTrunkStatusEvent);
  
王朝网络
begin
  
王朝网络
ChannelNumber := 0;
  
王朝网络
Self.OnCardChannelState := trunkEvent;
  
王朝网络
end;
  
王朝网络

  
王朝网络
destructor TCXXCommCard8B.Destroy;
  
王朝网络
var
  
王朝网络
Loop:Word;
  
王朝网络
begin
  
王朝网络
if (Length(channelObject) > 0) and (channelNumber > 0) then
  
王朝网络
begin
  
王朝网络
for Loop := 0 to ChannelNumber - 1 do
  
王朝网络
begin
  
王朝网络
if Assigned(channelObject[Loop]) then
  
王朝网络
begin
  
王朝网络
channelObject[Loop].Free();
  
王朝网络
channelObject[Loop] := nil;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
ReleaseCommDevice();
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.DialPhone(const aChannelID: Word;
  
王朝网络
const DialPhoneNumber: PChar): boolean;
  
王朝网络
var
  
王朝网络
K:Word;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
K := GetChannelObjectOrder(aChannelID);
  
王朝网络
if (K <> ErrorTrunkNumber) and (Assigned(channelObject[K])) then
  
王朝网络
begin
  
王朝网络
Result := channelObject[K].DialPhone(DialPhoneNumber);
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXCommCard8B.ReleaseCommDevice();
  
王朝网络
begin
  
王朝网络
SsmCloseCti() ;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.GetAFreeChannel(): Word;
  
王朝网络
var
  
王朝网络
Loop:Word;
  
王朝网络
begin
  
王朝网络
Result := ErrorTrunkNumber;
  
王朝网络
for Loop := Low(channelObject) to High(channelObject) do
  
王朝网络
begin
  
王朝网络
if NOT channelObject[Loop].CheckDialOutEnabled() then continue;
  
王朝网络
if (channelObject[Loop].GetChannelStatus() = atsFree) then
  
王朝网络
begin
  
王朝网络
Result := channelObject[Loop].GetChannelID();
  
王朝网络

  break;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.GetChannelNumber(): Word;
  
王朝网络
begin
  
王朝网络
Result := channelNumber;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.GetChannelObjectOrder(
  
王朝网络
const aChannelID: Word): Word;
  
王朝网络
var
  
王朝网络
Loop:Word;
  
王朝网络
begin
  
王朝网络
Result := ErrorTrunkNumber;
  
王朝网络
for Loop := Low(channelObject) to High(channelObject) do
  
王朝网络
begin
  
王朝网络
if (channelObject[Loop].GetChannelID = aChannelID) then
  
王朝网络
begin
  
王朝网络
Result := Loop;
  
王朝网络

  break;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.HangUp(const aChannelID: Word): boolean;
  
王朝网络
var
  
王朝网络
K:Word;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
K := GetChannelObjectOrder(aChannelID);
  
王朝网络
if (K <> ErrorTrunkNumber) and (Assigned(channelObject[K])) then
  
王朝网络
begin
  
王朝网络
channelObject[K].ChannelHangUp();
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.LoadCommDevice(const loadAll:boolean): boolean;
  
王朝网络
const
  
王朝网络
loadEmpty = true;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
if SsmStartCti(SH_ConfigFile,SH_IndexFile) <> 0 then
  
王朝网络
begin
  
王朝网络
TCXXSHChannel8B.InformInvodeError();
  
王朝网络
Exit;
  
王朝网络
end;
  
王朝网络
if(SsmGetMaxUsableBoard() <> SsmGetMaxCfgBoard()) then
  
王朝网络
begin //部分板卡初始化失败,取出失败原因
  
王朝网络
TCXXSHChannel8B.InformInvodeError();
  
王朝网络
Exit;
  
王朝网络
end;
  
王朝网络
Result := InitChannel();
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.Startup(): boolean;
  
王朝网络
var
  
王朝网络
Loop:integer;
  
王朝网络
begin
  
王朝网络
for Loop := 0 to channelNumber - 1 do
  
王朝网络
begin
  
王朝网络
channelObject[Loop].Startup();
  
王朝网络
end;
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXCommCard8B.InitChannel():boolean;
  
王朝网络
var
  
王朝网络
number,Loop:integer;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
number := SsmGetMaxCh();
  
王朝网络
if (number < 0) then Exit;
  
王朝网络
ChannelNumber := number;
  
王朝网络
SetLength(channelObject,channelNumber);
  
王朝网络
for Loop := 0 to channelNumber - 1 do
  
王朝网络
begin
  
王朝网络
channelObject[Loop] := TCXXSHChannel8B.Create(OnCardChannelState);
  
王朝网络
channelObject[Loop].CreateCommChannel(Loop);
  
王朝网络
end;
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络

  
王朝网络
end.
  
王朝网络

  6、 通道类源码:
  
王朝网络
//------------------------------------------------------------------------------
  
王朝网络
//
  
王朝网络
// 产品名称: 成晓旭的个人软件Delphi源码库
  
王朝网络
// 产品版本: CXXSoft delphi code source lib 2.0
  
王朝网络
// 模块名称: Delphi之三汇模拟语音卡通道类
  
王朝网络
// 模块描述:
  
王朝网络
// 单元文件: unSHChanne18B.pas
  
王朝网络
// 开发作者: 成晓旭
  
王朝网络
// 备注: 任何人使用此文件时,请保留此段自述文件,谢谢!
  
王朝网络
// 开发时间: 2003-12-01
  
王朝网络
// 修改历史:
  
王朝网络
// 修改描述:
  
王朝网络
//------------------------------------------------------------------------------
  
王朝网络
unit unSHChanne18B;
  
王朝网络

  
王朝网络
王朝网络
...{$DEFINE ThreadChannel}
  
王朝网络

  
王朝网络
interface
  
王朝网络

  
王朝网络
uses
  
王朝网络
Windows,Classes,SysUtils,
  
王朝网络

  
王朝网络
unBaseDefine,unShpa3api,unSH8BDefine,
  
王朝网络
//unDJ160ADefine,
  
王朝网络
unDJTC08a32,unDJNewSig;
  
王朝网络

  
王朝网络
Type
  
王朝网络

  
王朝网络

  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
TCXXSHChannel8B = class(TThread)
  
王朝网络
王朝网络
...{$ELSE}
  
王朝网络
TCXXSHChannel8B = class(TObject)
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
private
  
王朝网络
channelType:TChannelType;
  
王朝网络
oldChannelState,channelState:TTrunkState;
  
王朝网络
channelID:Word;
  
王朝网络
phoneNumber:string;
  
王朝网络
dtmfString:string;
  
王朝网络
aCallerId:PAnsiChar;
  
王朝网络

  
王朝网络
isConntectd:boolean;
  
王朝网络

  
王朝网络
isDialOut:boolean;
  
王朝网络
aTrunkState:TTrunkStatus;
  
王朝网络

  
王朝网络
procedure ChannelProcessor();
  
王朝网络
procedure InformTrunkStatus(const aMsgFlag: TLVOperateFlag);
  
王朝网络

  
王朝网络
procedure ClearTrunkStatus();
  
王朝网络
procedure ClearChannelBuffer();
  
王朝网络
function CheckSigHangup():boolean;
  
王朝网络
function CheckCallIn():boolean;
  
王朝网络
function SwitchOnCallIn():boolean;
  
王朝网络

  
王朝网络
procedure ProcessCallInSuccess();
  
王朝网络
procedure ProcessDialSuccess();
  
王朝网络

  
王朝网络
procedure ProcessCheckDialSend();
  
王朝网络
procedure ProcessDialOut();
  
王朝网络

  
王朝网络
procedure Stop();
  
王朝网络

  
王朝网络
//三汇卡专用方法
  
王朝网络
function GetTrunkStateBySsm(const ssmState: integer): TTrunkState;
  
王朝网络
protected
  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
procedure Execute(); override;
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
public
  
王朝网络
strMessage:string;
  
王朝网络
OnChannelState:TTrunkStatusEvent;
  
王朝网络

  
王朝网络
constructor Create(const trunkEvent:TTrunkStatusEvent);
  
王朝网络
destructor Destroy();override;
  
王朝网络

  
王朝网络
procedure CreateCommChannel(const aChennelID: Word);
  
王朝网络
procedure Startup();
  
王朝网络

  
王朝网络
function GetChannelID():Word;
  
王朝网络
function GetChannelStatus():TTrunkState;
  
王朝网络
function GetChannelType():TChannelType;
  
王朝网络
function DialPhone(const DialPhoneNumber:PChar):boolean;overload;
  
王朝网络
function DialPhone(const DialPhoneNumber:PChar;const PreDialNumber:PChar):boolean;overload;
  
王朝网络
procedure ChannelHangUp();
  
王朝网络

  
王朝网络
function GetDialOut():boolean;
  
王朝网络

  
王朝网络
//三汇卡特性方法
  
王朝网络
function CheckDialOutEnabled():boolean;
  
王朝网络
class procedure InformInvodeError();
  
王朝网络
end;
  
王朝网络
implementation
  
王朝网络

  
王朝网络
王朝网络
...{ TCXXSHChannel8B }
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ChannelHangUp();
  
王朝网络
begin
  
王朝网络
isDialOut := false;
  
王朝网络
SsmHangUp(channelID);
  
王朝网络
ClearChannelBuffer();
  
王朝网络
ClearTrunkStatus();
  
王朝网络
InformTrunkStatus(lvofUpdate);
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ChannelProcessor();
  
王朝网络
var
  
王朝网络
ssmState:integer;
  
王朝网络
begin
  
王朝网络
// ssmState := SsmGetChState(channelID);
  
王朝网络
// channelState := GetTrunkStateBySsm(ssmState);
  
王朝网络
CheckCallIn();
  
王朝网络
case channelState of
  
王朝网络
atsFree:
  
王朝网络
begin
  
王朝网络
//
  
王朝网络
end;
  
王朝网络
atsCallIning:
  
王朝网络
begin
  
王朝网络
SwitchOnCallIn();
  
王朝网络
end;
  
王朝网络
atsCallInSuccess:
  
王朝网络
begin
  
王朝网络
if CheckSigHangup() then Exit;
  
王朝网络
ProcessCallInSuccess();
  
王朝网络
end;
  
王朝网络
atsCheckSendDial:
  
王朝网络
begin
  
王朝网络
ProcessCheckDialSend();
  
王朝网络
end;
  
王朝网络
atsDialing:
  
王朝网络
begin
  
王朝网络
ProcessDialOut();
  
王朝网络
end;
  
王朝网络
atsDialSuccess:
  
王朝网络
begin
  
王朝网络
if CheckSigHangup() then Exit;
  
王朝网络
ProcessDialSuccess();
  
王朝网络
strMessage := '拨号成功';
  
王朝网络
end;
  
王朝网络
atsHangOff:
  
王朝网络
begin
  
王朝网络
ChannelHangUp();
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
if (oldChannelState <> channelState) then
  
王朝网络
begin
  
王朝网络
oldChannelState := channelState;
  
王朝网络
InformTrunkStatus(lvofUpdate);
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.CheckCallIn(): boolean;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
if(SsmGetChState(channelID)=2) then //检测到振铃信号
  
王朝网络
begin
  
王朝网络
SsmGetCallerId(channelID, aCallerId); //取出CALLERID信息
  
王朝网络
channelState := atsCallIning;
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络
王朝网络
...{
  
王朝网络
Result := RingDetect(channelID);
  
王朝网络
if Result then
  
王朝网络
begin
  
王朝网络
OffHook(channelID);
  
王朝网络
if isDialOut then
  
王朝网络
channelState := atsDialSuccess
  
王朝网络
else
  
王朝网络
channelState := atsCallIning;
  
王朝网络
end;
  
王朝网络
}
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.CheckSigHangup(): boolean;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
if (SsmGetChState(channelID) = S_CALL_PENDING) then
  
王朝网络
begin
  
王朝网络
strMessage := '对方已挂机';
  
王朝网络
InformTrunkStatus(lvofUpdate);
  
王朝网络
SsmStopPlay(channelID);
  
王朝网络
channelState := atsHangOff;
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ClearTrunkStatus();
  
王朝网络
begin
  
王朝网络
channelState := atsFree;
  
王朝网络
oldChannelState := channelState;
  
王朝网络
phoneNumber := '';
  
王朝网络
dtmfString := '';
  
王朝网络
strMessage := '';
  
王朝网络
isConntectd := false;
  
王朝网络
end;
  
王朝网络

  
王朝网络
constructor TCXXSHChannel8B.Create(const trunkEvent:TTrunkStatusEvent);
  
王朝网络
begin
  
王朝网络
GetMem(aCallerId,50);
  
王朝网络
Self.OnChannelState := trunkEvent;
  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
Self.FreeOnTerminate := true;
  
王朝网络
inherited Create(true);
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
end;
  
王朝网络

  
王朝网络

  
王朝网络
destructor TCXXSHChannel8B.Destroy;
  
王朝网络
begin
  
王朝网络
ChannelHangUp();
  
王朝网络
Stop();
  
王朝网络
王朝网络
...{$IFNDEF ThreadChannel}
  
王朝网络
inherited Destroy();
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
InformTrunkStatus(lvofDelete);
  
王朝网络
FreeMem(aCallerId);
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.DialPhone(const DialPhoneNumber:PChar;
  
王朝网络
const PreDialNumber:PChar): boolean;
  
王朝网络
begin
  
王朝网络
Result := false;
  
王朝网络
if (channelState <> atsFree) then Exit;
  
王朝网络
phoneNumber := DialPhoneNumber;
  
王朝网络
Result := (SsmPickup(channelID) = 0);
  
王朝网络
if NOT Result then Exit;
  
王朝网络
Result := (SsmAutoDial(channelID,DialPhoneNumber)=0);
  
王朝网络
if Result then
  
王朝网络
begin
  
王朝网络
isDialOut := true;
  
王朝网络
channelState := atsCheckSendDial;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.DialPhone(
  
王朝网络
const DialPhoneNumber: PChar): boolean;
  
王朝网络
begin
  
王朝网络
Result := DialPhone(DialPhoneNumber,'');
  
王朝网络
end;
  
王朝网络

  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
procedure TCXXSHChannel8B.Execute;
  
王朝网络
begin
  
王朝网络
while NOT Terminated do
  
王朝网络
begin
  
王朝网络
Synchronize(ChannelProcessor);
  
王朝网络
Sleep(10);
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.GetChannelID(): Word;
  
王朝网络
begin
  
王朝网络
Result := channelID;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.GetChannelStatus(): TTrunkState;
  
王朝网络
begin
  
王朝网络
Result := channelState;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.InformTrunkStatus(const aMsgFlag: TLVOperateFlag);
  
王朝网络
begin
  
王朝网络
if NOT Assigned(OnChannelState) then Exit;
  
王朝网络
aTrunkState.lvFlag := aMsgFlag;
  
王朝网络
aTrunkState.TrunkID := IntToStr(channelID);
  
王朝网络
aTrunkState.TrunkType := Ord(channelType);
  
王朝网络
aTrunkState.TrunkTypeStr := ChannelTypeString[channelType];
  
王朝网络
aTrunkState.TrunkStep := Ord(channelState);
  
王朝网络
aTrunkState.TrunkStepStr := TrunkStateString[channelState];
  
王朝网络
aTrunkState.TrunkPhone := phoneNumber;
  
王朝网络
aTrunkState.TrunkData := dtmfString;
  
王朝网络
OnChannelState(aTrunkState);
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ProcessCallInSuccess();
  
王朝网络
begin
  
王朝网络

  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.SwitchOnCallIn(): boolean;
  
王朝网络
begin
  
王朝网络
SsmPickup(channelID); //摘机
  
王朝网络
ClearChannelBuffer();
  
王朝网络
channelState := atsCallInSuccess;
  
王朝网络
Result := true;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ProcessDialSuccess();
  
王朝网络
begin
  
王朝网络

  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.CreateCommChannel(const aChennelID: Word);
  
王朝网络
var
  
王朝网络
ct:integer;
  
王朝网络
begin
  
王朝网络
channelID := aChennelID;
  
王朝网络
ct := SsmGetChType(channelID);
  
王朝网络
if (ct < 0) then Exit;
  
王朝网络
channelType := TChannelType(ct);
  
王朝网络
ClearTrunkStatus();
  
王朝网络
InformTrunkStatus(lvofAdd);
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.GetChannelType(): TChannelType;
  
王朝网络
begin
  
王朝网络
Result := channelType;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.GetDialOut(): boolean;
  
王朝网络
begin
  
王朝网络
Result := isDialOut;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ProcessCheckDialSend();
  
王朝网络
begin
  
王朝网络
//三汇卡直接转换状态
  
王朝网络
channelState := atsDialing;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.Startup();
  
王朝网络
begin
  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
Resume();
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.Stop();
  
王朝网络
begin
  
王朝网络
王朝网络
...{$IFDEF ThreadChannel}
  
王朝网络
Suspend();
  
王朝网络
Terminate();
  
王朝网络
王朝网络
...{$ENDIF}
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.CheckDialOutEnabled(): boolean;
  
王朝网络
begin
  
王朝网络
//内线通道、坐席通道、磁石通道和录音通道不支持本SsmPicuup操作
  
王朝网络
Result := NOT((channelType = ct1) or
  
王朝网络
(channelType = ct2) or
  
王朝网络
(channelType = ct3) or
  
王朝网络
(channelType = ct10));
  
王朝网络
end;
  
王朝网络

  
王朝网络
class procedure TCXXSHChannel8B.InformInvodeError;
  
王朝网络
var
  
王朝网络
msgBuffer:PAnsiChar;
  
王朝网络
begin
  
王朝网络
GetMem(msgBuffer,255);
  
王朝网络
try
  
王朝网络
SsmGetLastErrMsg(msgBuffer);
  
王朝网络
//记录异常日志,或者通知用户
  
王朝网络
//Showmessage(msgBuffer);
  
王朝网络
finally
  
王朝网络
FreeMem(msgBuffer);
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
function TCXXSHChannel8B.GetTrunkStateBySsm(
  
王朝网络
const ssmState: integer): TTrunkState;
  
王朝网络
begin
  
王朝网络
Result := atsFree;
  
王朝网络
case ssmState of
  
王朝网络
0: Result := atsFree;
  
王朝网络
4,5,6,9: Result := atsCallIning;
  
王朝网络
7: Result := atsHangOff;
  
王朝网络
//8:“断线”状态。只有录音通道才会进入本状态。暂时不处理
  
王朝网络
//8: Result := atsHangOff;
  
王朝网络
//3: Result := atsCallInSuccess;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ProcessDialOut();
  
王朝网络
var
  
王朝网络
dState:integer;
  
王朝网络
begin
  
王朝网络
dState := SsmChkAutoDial(channelID);
  
王朝网络
case dState of
  
王朝网络
DIAL_VOICE,
  
王朝网络
DIAL_VOICEF1,
  
王朝网络
DIAL_VOICEF2:
  
王朝网络
begin
  
王朝网络
channelState := atsDialSuccess;
  
王朝网络
isConntectd := true;
  
王朝网络
end;
  
王朝网络
DIAL_STANDBY,
  
王朝网络
DIAL_NO_DIALTONE,
  
王朝网络
DIAL_ECHO_NOVOICE,
  
王朝网络
DIAL_NOVOICE,
  
王朝网络
DIAL_NOANSWER,
  
王朝网络
DIAL_FAILURE,
  
王朝网络
DIAL_INVALID_PHONUM:
  
王朝网络
begin
  
王朝网络
channelState := atsHangOff;
  
王朝网络
end;
  
王朝网络
end;
  
王朝网络
strMessage := '拨号中...';
  
王朝网络
end;
  
王朝网络

  
王朝网络
procedure TCXXSHChannel8B.ClearChannelBuffer();
  
王朝网络
begin
  
王朝网络
SsmClearRxDTMFBuf(channelID); //清空驱动程序内部的DTMF按键号码接收缓冲区
  
王朝网络
SsmClearRxBuf(channelID); //清除指定通道ch上MODEM模块的接收缓冲区中的所有数据
  
王朝网络
//“抢拨” 开关是指当在放音过程中收到对方的DTMF按键字符时,由驱动程序程序立即停止正在进行的放音操作。
  
王朝网络
//SsmSetDtmfStopPlay(channelID,true); //打开抢拨开关
  
王朝网络
end;
  
王朝网络

  
王朝网络
end.
  
王朝网络