语音卡编程,help me, please!(100分)

  • 主题发起人 主题发起人 lby15
  • 开始时间 开始时间
L

lby15

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是深圳鼎铭公司的TB-08A/4FX语音传真卡。
如果,每接收到一个键码,就做一次处理,那也太麻烦了!
比如我要等待用户输入身份证号码,按#字键结束,而且,还有多级菜单,简直就是太麻烦了。
如果有一个函数,能得到一串键码就好了。
我自己做了一个,但有两个问题没法解决。
用循环取键码,直到按#键结束。
一般情况下,如果正在播放提示音,在收到一个键码后,就停止播音。
如果在循环里用Application.ProcessMessage的话,就不能停止,
如果不用的话,就不能播音。
想请大家帮忙,有谁做过,能解决这个问题吗?
另外,怎么样才能等它播音结束后,再执行下一个语句呢?
 
循环取?DOS下的东东噎,WIN是事件驱动的,总该有个EVENT什么的吧?不然也太...
>如果在循环里用Application.ProcessMessage的话,就不能停止
不能播放什么?
 
老兄,你还是用线程把,在主线程里干那事儿,可不怎么好。
 
我做过。
用timer定时产生事件,先取语音卡当前的状态,再判断所取的码是什么,做二重case,罗列出各种情况。
只能收一码做一次处理。
 
语音卡的每一个API都不是阻塞的,也不用太多的CPU资源,
即便多个(16)通道,也完全可以在一个timer事件中完成,
建议不要用线程。
我作语音卡处理的思路是定义一些状态和它们之间切换的条件。
例如输入帐号是一个状态,输入口令是一个状态,他们之间的
切换是接收到#。
在一个函数中接收一个字符串的想法不可取,应该是在每一个
timer事件处理一个字符。
 
语音卡应有自带的开发包,里面有例子。
要的话,我可给你。
 
to CJ:
是有事件,但没次事件只能得到一个键码,我想一次取一串。
>>如果在循环里用Application.ProcessMessage的话,就不能在收到键码时
停止播音。如果有的话,就首先不能播音,更别说停播了。
to everybody:
如果不用语音提示,我做的函数是很好用的,
如果不用语音提示,那还要语音卡干嘛?
所以,还是放弃这个办法,另想办法把。
大家不讨论第一个问题了,帮我解决第二问题吧。
如:
DMFAX1.PlayDBVoc(ChannelNo,'你好');
DMFAX1.PlayDBVoc(ChannelNo,'欢迎');
Label1.Caption:='1234';
'你'字还没说完呢,Label1.Caption 已经 := '1234' 了。
怎样让它先说完,在执行下一步工作,
厂商给的开发包,没啥内容,简简单单。
 
哈哈,捡便宜了,我没做过,我的一位朋友做过,语音卡厂商、型号和你的一样。
等我去问一问他,大伙儿耐心等一下。
 
定义成状态机,
第一个状态方音,
放映完了再进入下一个状态,
切换状态时做Label1.Caption:=":"
我也再写语音卡的软件,只是和你的牌子型号不同而已(东进TC30E1)。
“有限状态机”是非常适合分析、开发语音卡、通信软件的
一种方法学,好好用他。
 
哎呀,可找到地方了 :-))
我也在用语音卡,不过是Dialogic的,我刚刚开始学,我们的项目负责人说只有
C语言才可以完成语音卡功能,Delphi休想!吓得我只好放下Delphi.
今天看到大家讨论,想来可以起死回生,哪位可以给一些这方面的资料,在下先
谢谢大家了!
希望以后常交流,我的妹儿: Anytime@netease.com
 
我又来了。
我朋友也没有试图一个函数取一串字符,也是用状态,跟小坏同志说的差不多。
有很多级菜单,但避免了多重case选择,都只有一重。
最关键的地方我想就只有一点:
你可以做其它的函数,在OnReceiveDTMF时,
把DTMFBuf和ChannelNo作为参数一层层的传递下去。
在函数里判断状态,定义多个状态变量,不要所有的状态都用一个变量,
这样就不会因为一个case里有百个状态,而使一个函数变700行。
这样做其实也不麻烦,当然比你的想的一个函数取一串烦一点。
其他的你自己去努力吧,
再说的话,不如我把源码给你了,不行!
至于你想等说完在做下面的工作,好象不行。
不过播音结束会产生一个OnActEnd事件。
你可以在这里处理。
 
对呀,这方面我也满有兴趣的。
外行话:既然事件里能接一个字符那么为什么不那么做呢?
var
s:String
implementation
....
procedure OnXXX(c:Char);
begin
if c = '#' then
begin
do(s);
s := '';
end
else
s := s + c;
end;
 
坚决支持CJ,
其实我现在就是折磨做的,
OnXXX过程实际上就是你在这个状态下需要赶的事情,
还可以加点东西如下:
vars:String
implementation
....
procedure OnXXX(c:Char);
begin
 if 方音尚未停止 then

  停止方音;//你不是想一按键就停止放音吗?
 if c = '#' then

 begin
  do(s);
  转移状态,因为此次收号已结束
  s := '';
 end
 else
  s := s + c;
end;
 
多谢各位大侠。
 
后退
顶部