exten => s,1,background(voice_file)
exten =>1,1,playback(choice1)
exten => 1,2,hungup()
exten => i,1,playback(wrongchoice)
exten =>1,2,goto(s,1)
exten => t,1,play(timeout)
exten =>t,2,hungup()
一直以来都认为,当没有按键的时候,会自动进入t,谁知道,原来不是这样的。
background之后,会自动进入s,2 步,但是由于s,2没有了,所以就自动挂掉了。
查了资料才知道,要执行t,必须得先在background之后设置超时时间,可以在这里改成:
exten => s,1,background(voice_file)
exten => s,2,set(TIME(response)=10) //在这里设定为十秒
exten =>s,3,WaitExten(2) //在这里再跳回2再次设置,如果不这样的话,就自动挂掉了。
因为还没有到时间去执行t.
exten =>1,1,playback(choice1)
exten => 1,2,hungup()
exten => i,1,playback(wrongchoice)
exten =>1,2,goto(s,1)
exten => t,1,play(timeout)
exten =>t,2,hungup()
关于BackGround的在宏内的使用时,要特别注意:
如下方案:
[default]
exten => s,1,Macro(exeBG)
exten => 1,1,Noop(Press 1)
exten => 2,1,Noop(Press 2)
[macro-exeBG]
exten => s,1,BackGround(file1)
exten => s,n,WaitExten(10)
exten => 1,1,Noop(macro 1)
exten => 2,1,Noop(macro 2)
如上方案,如果用户响应的按键为1时,是不会转到[macro-exeBG]中的1那里的,而是会转到[default]中的1,即打印出Press 1.
如果希望转到[macro-exeGB],必须在BackGround中加入一个参数,参数值就是整个宏的名称,即:
[macro-exeBG]
exten => s,1,BackGround(file1,,,macro-exeGB)
exten => s,n,WaitExten(10)
exten => 1,1,Noop(macro 1)
exten => 2,1,Noop(macro 2)
这样的话,才会转到宏内对应的响应的按键那里。
不过,就我而言,我比较喜欢用Read来响应用户的按键,可以为响应按键单独写一个宏, 如下:
[macro-FuncPressDigit] ;播放提示音,并输入一个数字键
;入口: ${ARG1},即{IR1}等待时长
; ${ARG2},即{SR1}要播报的文件
;出口: ${IR1} ,10输入了*号,11超时没输入
exten => s,1,Read(IR1,${ARG2},1,,,${ARG1})
exten => s,n,GoToIf($[${LEN(${IR1})}=0]?10) ;表示超时没有输入
exten => s,n,GoToIf($["${IR1}"="*"]?20) ;输入了*号
exten => s,n,Noop(${IR1})
exten => s,10,Set(IR1=11) ;超时
exten => s,20,Set(IR1=10) ;输入了*号时,设置为10