<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
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源码库
//产品版本:CXXSoftdelphicodesourcelib2.0
//模块名称:Delphi之三汇模拟语音卡类
//模块描述:
//单元文件:unSHCard8B.pas
//开发作者:成晓旭
//备注:任何人使用此文件时,请保留此段自述文件,谢谢!
//开发时间:2003-12-03
//修改历史:
//修改描述:
//------------------------------------------------------------------------------
unitunSHCard8B;
interface
uses
Windows,
//unDJTC08a32,unDJNewSig,
unBaseDefine,
//unDJ160ADefine,unDJChanne160A,
unShpa3api,unSHChanne18B,unSH8BDefine;
type
TCXXCommCard8B=class(TObject)
private
ChannelNumber:Word;
channelObject:arrayofTCXXSHChannel8B;
OnCardChannelState:TTrunkStatusEvent;
procedureReleaseCommDevice();
functionGetChannelObjectOrder(constaChannelID:Word):Word;
functionInitChannel():boolean;
public
constructorCreate(consttrunkEvent:TTrunkStatusEvent);
destructorDestroy();override;
functionLoadCommDevice(constloadAll:boolean=false):boolean;
functionStartup():boolean;
functionGetAFreeChannel():Word;
functionGetChannelNumber():Word;
functionDialPhone(constaChannelID:Word;constDialPhoneNumber:PChar):boolean;
functionHangUp(constaChannelID:Word):boolean;
end;
implementation
const
SH_ConfigFile='C:ShCtiShConfig.ini';
SH_IndexFile='C:ShCtiShIndex.ini';
...{TCXXCommCard8B}
constructorTCXXCommCard8B.Create(consttrunkEvent:TTrunkStatusEvent);
begin
ChannelNumber:=0;
Self.OnCardChannelState:=trunkEvent;
end;
destructorTCXXCommCard8B.Destroy;
var
Loop:Word;
begin
if(Length(channelObject)>0)and(channelNumber>0)then
begin
forLoop:=0toChannelNumber-1do
begin
ifAssigned(channelObject[Loop])then
begin
channelObject[Loop].Free();
channelObject[Loop]:=nil;
end;
end;
end;
ReleaseCommDevice();
end;
functionTCXXCommCard8B.DialPhone(constaChannelID:Word;
constDialPhoneNumber:PChar):boolean;
var
K:Word;
begin
Result:=false;
K:=GetChannelObjectOrder(aChannelID);
if(KErrorTrunkNumber)and(Assigned(channelObject[K]))then
begin
Result:=channelObject[K].DialPhone(DialPhoneNumber);
end;
end;
procedureTCXXCommCard8B.ReleaseCommDevice();
begin
SsmCloseCti();
end;
functionTCXXCommCard8B.GetAFreeChannel():Word;
var
Loop:Word;
begin
Result:=ErrorTrunkNumber;
forLoop:=Low(channelObject)toHigh(channelObject)do
begin
ifNOTchannelObject[Loop].CheckDialOutEnabled()thencontinue;
if(channelObject[Loop].GetChannelStatus()=atsFree)then
begin
Result:=channelObject[Loop].GetChannelID();
break;
end;
end;
end;
functionTCXXCommCard8B.GetChannelNumber():Word;
begin
Result:=channelNumber;
end;
functionTCXXCommCard8B.GetChannelObjectOrder(
constaChannelID:Word):Word;
var
Loop:Word;
begin
Result:=ErrorTrunkNumber;
forLoop:=Low(channelObject)toHigh(channelObject)do
begin
if(channelObject[Loop].GetChannelID=aChannelID)then
begin
Result:=Loop;
break;
end;
end;
end;
functionTCXXCommCard8B.HangUp(constaChannelID:Word):boolean;
var
K:Word;
begin
Result:=false;
K:=GetChannelObjectOrder(aChannelID);
if(KErrorTrunkNumber)and(Assigned(channelObject[K]))then
begin
channelObject[K].ChannelHangUp();
Result:=true;
end;
end;
functionTCXXCommCard8B.LoadCommDevice(constloadAll:boolean):boolean;
const
loadEmpty=true;
begin
Result:=false;
ifSsmStartCti(SH_ConfigFile,SH_IndexFile)0then
begin
TCXXSHChannel8B.InformInvodeError();
Exit;
end;
if(SsmGetMaxUsableBoard()SsmGetMaxCfgBoard())then
begin//部分板卡初始化失败,取出失败原因
TCXXSHChannel8B.InformInvodeError();
Exit;
end;
Result:=InitChannel();
end;
functionTCXXCommCard8B.Startup():boolean;
var
Loop:integer;
begin
forLoop:=0tochannelNumber-1do
begin
channelObject[Loop].Startup();
end;
Result:=true;
end;
functionTCXXCommCard8B.InitChannel():boolean;
var
number,Loop:integer;
begin
Result:=false;
number:=SsmGetMaxCh();
if(number0)thenExit;
ChannelNumber:=number;
SetLength(channelObject,channelNumber);
forLoop:=0tochannelNumber-1do
begin
channelObject[Loop]:=TCXXSHChannel8B.Create(OnCardChannelState);
channelObject[Loop].CreateCommChannel(Loop);
end;
Result:=true;
end;
end.
6、 通道类源码:
//------------------------------------------------------------------------------
//
//产品名称:成晓旭的个人软件Delphi源码库
//产品版本:CXXSoftdelphicodesourcelib2.0
//模块名称:Delphi之三汇模拟语音卡通道类
//模块描述:
//单元文件:unSHChanne18B.pas
//开发作者:成晓旭
//备注:任何人使用此文件时,请保留此段自述文件,谢谢!
//开发时间:2003-12-01
//修改历史:
//修改描述:
//------------------------------------------------------------------------------
unitunSHChanne18B;
...{$DEFINEThreadChannel}
interface
uses
Windows,Classes,SysUtils,
unBaseDefine,unShpa3api,unSH8BDefine,
//unDJ160ADefine,
unDJTC08a32,unDJNewSig;
Type
...{$IFDEFThreadChannel}
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;
procedureChannelProcessor();
procedureInformTrunkStatus(constaMsgFlag:TLVOperateFlag);
procedureClearTrunkStatus();
procedureClearChannelBuffer();
functionCheckSigHangup():boolean;
functionCheckCallIn():boolean;
functionSwitchOnCallIn():boolean;
procedureProcessCallInSuccess();
procedureProcessDialSuccess();
procedureProcessCheckDialSend();
procedureProcessDialOut();
procedureStop();
//三汇卡专用方法
functionGetTrunkStateBySsm(constssmState:integer):TTrunkState;
protected
...{$IFDEFThreadChannel}
procedureExecute();override;
...{$ENDIF}
public
strMessage:string;
OnChannelState:TTrunkStatusEvent;
constructorCreate(consttrunkEvent:TTrunkStatusEvent);
destructorDestroy();override;
procedureCreateCommChannel(constaChennelID:Word);
procedureStartup();
functionGetChannelID():Word;
functionGetChannelStatus():TTrunkState;
functionGetChannelType():TChannelType;
functionDialPhone(constDialPhoneNumber:PChar):boolean;overload;
functionDialPhone(constDialPhoneNumber:PChar;constPreDialNumber:PChar):boolean;overload;
procedureChannelHangUp();
functionGetDialOut():boolean;
//三汇卡特性方法
functionCheckDialOutEnabled():boolean;
classprocedureInformInvodeError();
end;
implementation
...{TCXXSHChannel8B}
procedureTCXXSHChannel8B.ChannelHangUp();
begin
isDialOut:=false;
SsmHangUp(channelID);
ClearChannelBuffer();
ClearTrunkStatus();
InformTrunkStatus(lvofUpdate);
end;
procedureTCXXSHChannel8B.ChannelProcessor();
var
ssmState:integer;
begin
//ssmState:=SsmGetChState(channelID);
//channelState:=GetTrunkStateBySsm(ssmState);
CheckCallIn();
casechannelStateof
atsFree:
begin
//
end;
atsCallIning:
begin
SwitchOnCallIn();
end;
atsCallInSuccess:
begin
ifCheckSigHangup()thenExit;
ProcessCallInSuccess();
end;
atsCheckSendDial:
begin
ProcessCheckDialSend();
end;
atsDialing:
begin
ProcessDialOut();
end;
atsDialSuccess:
begin
ifCheckSigHangup()thenExit;
ProcessDialSuccess();
strMessage:=color:
分享到:
相关推荐
CTI 系列 B 型语音卡,是一种采用 PCI 总线的 8 或 16 通道模拟线语音卡,该系列语音卡通过配置不同的功能模块,...三汇语音卡: SHT-8B/PCI SHT-8B/PCI/FAX SHT-16B-CT/PCI SHT-16B-CT/PCI/FAX 模拟语音卡硬件说明书
《三汇软件开发平台工具》,此项文件夹包括〈IP电话超市演示系统〉、<三汇 EasyCall4.0>、〈三汇IVR3.0>工具. <三汇EasyCall4.0>是一个集三汇 PABX、智能路由系统、 CTI接口及相关开发和应用工具的综合平台.
三汇语音卡硬件手册.pdf 三汇语音卡硬件手册.pdf
三汇语音卡最新开发文档,相当齐全,函数说明,掉用方法
三汇语音卡示例程序,回拨系统基础代码 三汇 语音卡 回拨 呼叫中心 电信增值
三汇语音卡的代码 例子程序,入门编程的好帮手
三汇语音卡,最新官方c#开发例子,源码,可以直接调试
用户拨打电话时系统自动播放已设定好的欢迎词。 客户通过按键选择,从而可以听到预先设置好的语音信息。
三汇语音卡7号信令调试文档,很不错的东西,分享给大家
三汇语音卡硬件说明书
三汇语音卡程序开发API函数详细说明,,如下面这样的: 函数名称:int WINAPI SsmGetMinVocDtrEnergy(int ch, PDWORD pdwMinVocDtrEnergy) 入口参数: ch: 通道编号。 pdwMinVocDtrEnergy: 判定声音还是噪声的能量...
本文档是 SynCTI 驱动程序的帮助文件,主要阅读对象是使用 SynCTI 驱动程序的应用程序开发接口(API)开发应用软件的软件工程师。 本文档还可以作为使用Synway 产品构建 CTI 应用系统的安装维护技术人员、产品销售...
使用三汇语音卡计算机蓝屏问题处理办法问题描述用户在使用三汇.pdf
有希望学习开发呼叫中心系统、自动语音查询系统、电子传真系统的朋友可以学习。
各种语音卡安装,开发指导~模拟语言卡,数字中继卡,GSM卡,ISDN BRI语音卡.希望能够对你有帮助
该语音卡可实现坐席、会议、FSK数据收发、语音合成等多种功能,并提供SDK开发工具包。 在安装完驱动程序后,相应的动态链接库(NewSig.dll和Tc08a32.dll文件)会复制到Windows的系统目录下。在语音卡的开发过程中,...
正对三汇的板卡的ivr服务程序以及客户端程序,请试用
语音卡,CTi,IVR,ACD,提供各种函数说明。引用方法,如何使用。语句例子。
三汇SMG系列模拟网关[整理].pdf