先在一个模块文件里(Bas文件)定义一些常量,例如:
Public TRUNK=0 '外线标志
Public USER=1 '内线标志
Public CH_FREE=1
Public CH_OFFHOOK=2
Public CH_WELCOM=3
Public CH_PASSWORD=4
Public CH_SELECT=5
Public CH_PLAYRESULT=6
Public CH_WAITONHOOK=7
Public CH_RECEVIE=8
然后在编写代码时,在初始化驱动程序的部分,或FORM_LOAD里进行初始化:
Public State(128) as Integer
Dim I as Integer
Private Sub Form_Load()
For i=0 to 128
State(i)=CH_FREE
Next i
TotalLine=GetValidChannel() '获取可用的总通道数
调用其他函数来初始化语音卡........
End Sub
然后在Timer控件里这样处理:
Private Sub Timer1_Timer()
Dim i as Integer
For i=0 to totalLine-1
Select Case State(i)
Case CH_FREE
If RingDetec(i) Then '检查到有外线震铃或内线摘机
If ChType(i)=TRUNK Then '检查如果震铃的通道是外线
State(i)=CH_RECEVIE
End if
Else
If ChType(i)=USER then '如果是内线摘机
State(i)=CH_OFFHOOK
End If
End If
Case CH_RECEVIE
在这里检测来电震铃的次数,如果两次之后就将
State(i)=CH_OFFHOOK
Case CH_OFFHOOK
在这里处理欢迎辞播放,同时将
State(i)=CH_WELCOM
Case CH_WELCOM
在这里接收电话按键,判断,并播放"请输入密码"的语音,将
State(i)=CH_PASSWORD
Case CH_PASSWORD
在这里接收电话按键,判断是否正确,如果正确就播放"请选择结果播
放",并将
State(i)=CH_SELECT
如果判断输入的密码错误,则将
State(i)=CH_WELCOM
Case CH_SELECT
在这里接收电话按键,根据输入的键码进行判断。
Select Case dtmf(i) '-----dtmf(i)是保存i通道的电话输入的键码
的变量
Case "1"
将对应的要连续播放的语音放用API压入内存,例如是:
“您的存款余额为:九万八千七百六十五元”之类的,
需要连续播放的语音文件
Case "2"
同上
End Select
State(i)=CH_PLAYRESULT
Case CH_PLAYRESULT
播放内存里的连续语音,并将
State(i)=CH_WAITONHOOK
Case CH_WAITONHOOK
检查通道连接的电话是否挂机,如果是就用API断开连接,重置通道
的连接。
End Select
Next i
End Sub
ynkmzj():
东进卡的语音处理方式是必须在大循环里进行的。它的卡在播放一个语音时,是分段播放的,如果你只单纯的用StartPlayFile函数来在普通的过程里进行一个语音文件播放,他只会
播放这个语音的1/3,所以我在一个大循环里,对每个通道都进行一次处理。这样就不会造成
专门为一个通道服务的情况了。
而且这样的处理性能不会有问题的,不会出现撞车的问题。我是这样做的,我用RPC专门做一个独立的电话语音服务器。而该服务器的功能只用于为电话拨号用户播放语音和为后台流程处理模块接收按键而已。流程是这样的:
首先想象有以下三个对象:A=拨入电话,B=语音服务器,C=流程处理模块
A 拨入电话:就是一个打电话过来的一方
B 语音服务器:就是接电话的东西,负责接收C传过来的要播放给A听的语音文件名路径或
接收A按下电话按键后,把音频信号转换后发送给C的责任。
C 流程处理模块:当从B接收到按键码后,C就去作对应的检查,然后把检查后是否正确的
语音路径传回给B,由B再播放回给A听。
整个一对一的流程就是这样。A<=>B<=>C而B则作为一个中间件。这样的做法有三个好处: