[asterisk-dev] Application timeouts, Periodic and Scheduled Announcements
Russell Bryant
russell at digium.com
Wed Aug 29 14:00:40 CDT 2007
Greetings,
I started looking at issue 8030 yesterday, which adds the S() and L() options to
MeetMe, which act the same as those options for the Dial application.
http://bugs.digium.com/view.php?id=8030
After thinking about it, I decided it would make more sense to attempt to make a
way to use these features for any application, instead of putting this code in a
lot of places. I have a little bit of the code actually written, but I have an
idea for how I want all of it to work in my head.
Right now, I just wanted to show my plan for the interface I plan to build to
see if anyone has any comments on things that would make the features easier to
use before I get too far with coding it.
Requirements:
Today, the Dial application has the S() and L() options. The S() option lets
you limit how long a call will last. The L() option does the same, but also
plays sounds to warn the user when time is running out.
So, to make these features generic, I have decided to implement the following
three application independent features:
1) Scheduled announcements
2) Periodic announcements
3) Application timeout
Design:
1) Scheduled announcements
To accomplish playing an announcement to a channel at some point in the future,
I plan to make two functions, START_ANNOUNCE, and STOP_ANNOUNCE. These will
have the announcement mixed with whatever other audio the channel is receiving
at the time of the announcement.
; Schedule a beep for 2 minutes from now
exten => s,1,Set(ANNOUNCE_ID=${START_ANNOUNCE(beep,120)})
; 2 minutes into a conference, hear a beep
exten => s,n,MeetMe(1234)
; Unschedule the beep
exten => s,n,NoOp(Unscheduling the beep ${UNSCHED_ANNOUNCE(${ANNOUNCE_ID})}
seconds later)
2) Periodic announcements
This just uses an additional argument to START_ANNOUNCE, to set a repeat interval.
; Set a periodic announement to play a beep every 10 seconds
exten => s,1,Set(ANNOUNCE_ID=${START_ANNOUNCE(beep,0,10)})
; Call someone and have a beep in your ear every 10 seconds.
exten => s,n,Dial(IAX2/123)
; Stop the announcement
exten => s,n,NoOp(Announcement ran for ${STOP_ANNOUNCE(${ANNOUNCE_ID})} seconds)
3) Application timeout
This is the trickiest one to implement. The idea is to be able to set a custom
timeout to make it break out of whatever application it is currently in when hit.
; Limit conference to 5 minutes
exten => s,1,Set(TIMEOUT(application)=300)
exten => s,n,MeetMe(1234)
; Turn timeout back off
exten => s,n,Set(TIMEOUT(application)=0)
Full example:
; Limit a call to 5 minutes
exten => s,1,Set(TIMEOUT(application)=300)
; Play a beep every 5 seconds for the last minute
exten => s,n,Set(ANNOUNCE_ID1=${START_ANNOUNCE(beep,240,5)})
; Let them know just before the timeout hits
exten => s,n,Set(ANNOUNCE_ID2=${START_ANNOUNCE(timeup,395)})
exten => s,n,Dial(SIP/1234)
; Cancel announcements in case the call ended early
exten => s,n,NoOp(Cancel beep after ${STOP_ANNOUNCE(${ANNOUNCE_ID1})} seconds)
exten => s,n,NoOp(Cancel timeup after ${STOP_ANNOUNCE(${ANNOUNCE_ID2})} seconds)
; Turn off application timeout
exten => s,n,Set(TIMEOUT(application)=0)
--
Russell Bryant
Software Engineer
Digium, Inc.
More information about the asterisk-dev
mailing list