TAPI:“电话应用程序接口”的简称( Te lephonyApplication Programm ing Interface )。它是微软与INTEL共同开发的用于直接控制电话通信系统的函数集,是微软计算机电话集成( CTI)计划的核心,是微软的w indow s开放式服务体系(WOSA )的一部分。它将电话、电话网和计算机的功能进一步集成起来,现在的计算机技术不仅可以处理语音通信等低级应用,还能处理视频等高级应用。
Tap iLine是对TAPI线路的管理,为了使程序的结构更为清晰和易于升级以及为了使TAPI能够更方便的移植到别的应用程序中,把TAPI函数中用于实现功能的一部分函数和数据结构封装成一个类来使用。下面就是通过V ISUALC + +编程实现对TAPI线路控制函数封装类的头文件。
class T apiL ine {
private:
TapiA pplicat ion ainA pp; / / paren t object
DWORD m _LineID; / / My index
HLINE m _ hL ine; / / M y line hand le typedef
CL ist
ExtensionLis;t m_extensionLis;t
/ / the list of call channe l
public:
TapiL ine( TapiApp licat ion
~ Tap iLine( ) ;
vo id OnEvent ( DWORD Device, DWORD Msg,
DWORD Param1, DWORD Param2, DWORD Param3);
HRESULT Open ( DWORD L ineID, DWORD
Ca llPr iv ilege, DWORD Med iaModes);
TapiChanne*l getChannel( DW dwAddressID);
TapiChanne*l getChanne lCall(HCALL hcall) ;
/ / Functions to support te lephony commands
BOOL M akeCa ll ( DWORD dwAddressID, LPCT??
STR pszA ddress) ;
vo id D ropCall( DWORD dwA ddressID) ;
vo idHo ldCall( DWORD dwA ddressID) ;
vo id UnholdC all( DWORD dwAddressID) ;
vo id B lindT ransferCa ll ( DWORD dwAddressID,
LPCTSTR pszAddress) ;
vo id R edirect ( DWORD dwAddressID, LPCTSTR
pszAddress) ;
vo id Ca llStatus( DWORD dwAddressID );
vo id Ca llInfo( DWORD dwA ddressID) ;
vo id Addressstatus( ) ;
};
TapiL ine通过复杂的参数传递机制,封装了大量的内部变量,通过API接口以统一短消息的形式接收用户指令同时返回线路的具体状态。最终应用程序通过调用Tap iL ine的具体函数对整个线路进行操作、控制。
3. 3 TAPI通话控制类设计
TapiChanne l是对具体通话进行控制,呼叫是TAPI开发最常用的一个功能。调用Tap iL ine的M akeC all ( DWORD dwAddressID,LPCTSTR pszAddress),传递当前号码和目标地址就可以进行拨打电话,把拨打电话的其他细节进行内部传递。当以上函数调用成功后,TSP就会控制通讯设备外呼指定的电话,该函数调用后会立刻返回到应用程序,但该电话是否成功拨通,则是依靠消息来判断,包括TAPI的其他功能也是这样的处理方式。其他常用的电话功能如接听、挂断、转移、三方等都有对应的函数实现。
line ln itia lizeEx函数中第3个参数传入的参数是方法的地址,这个方法将处理通讯设备发出来的所有TAPI消息,这个方法必须按固定的格式定义:
vo id CALLBACK Tap iLineCa llback(
DWORD dwDev ice,
DWORD nM sg,
DWORD dw Instance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
方法名TapiL ineC allback,可以自己定义,只要将此函数名作为参数传入linelnitializeEx,该方法就可以工作,方法参数将由通讯设备的TSP来填写,并传给上层应用。关键是要了解在某时刻触发此方法后,各参数值的意义以及此时收到此消息所表示的意义。要注意的是:即使完成一个最简单的通话,都会得到许多TAPI消息,这些消息以时间顺序产生,每产生一个消息,就会进入Tap iL ineCallback方法中,所以要抓住并处理关键消息。
以收到来电为例,主要处理2个消息。
( 1)参数dwMsg = LINE _ CALLSTATE并且dwParam:l LINECALLST _OFFER ING.此时可以把表示该来电的hDev ice保存到应用中,以便随后的处理。
( 2)参数dwMsg= LINE _CALLINFO.此时通过TAPI函数lineG etCa lllnfo可以得到来电信息,例如来电主叫号码、被叫号码等。当收到来电消息后,就可以在界面上切换应用状态以通知用户,或记录数据库等,按需要进行处理。与来电消息类似,当有其他电话事件发生后,就会发生相应的消息。