DiaStar Multimedia Demos
From ProjectDiaStar
What sort of applications are possible using DiaStar's new SIP and MultiMedia capabilities combined with a simple Asterisk dialplan?
Take a test drive of our IVVR demos and find out.
We have several publicly accessible applications that anyone can dial into with a SIP video phone.
Dialogic Pitch Finder
The first app is an instructional interactive video for the sports-minded. It teaches you the various grips for throwing a variety of baseball pitches - fastballs, curveballs, sliders, etc.
There are two versions. One uses DTMF for menu selections and the otherr, LumenVox/Asterisk-based speech recognition.
UGottaKlunker Tire Change Demo
The second app is a realistic customer support scenario, where you have rented a klunker, a 2002 Pontiac Grand Prix, gotten a flat tire and you need some serious help finding and changing the tire. The interactive app, which in real life would be accessed on a cell phone, leads you through all of the steps needed to get yourself up and running again, pointing out just where everything is and how to go about safely changing the flat tire.
Trying the Demos
To get to the demos, you first need a SIP video softphone that supports G711 ULaw audio and H.263 video. One of our favorites is the Kapanga. A free download of the software is available on the DiaStar downloads page or directly from Kapanga here. Once you have installed the phone, this is all you need to do:
- Choose the default configuration that comes with the phone
- If you do not have a dedicated, permanent IP address and are calling from a private network behind a single ISP-provided IP address, you will need to go through a STUN server so that the RTP streams from the DiaStar demo can find their way back to your video phone. Right click the red "K" and go to Call Control Settings -> Miscellaneous Paramters. Here, enable "STUN", and add the name of a public STUN server such as stun.ekiga.net or stun.voxgratia.org. Restart the softphone when you make any configuration changes.
- If you are using a VPN, it may be necessary to shut that down
- You are ready to try the demos
Information on other SIP video phones that have been used with DiaStar is also available.
Here are the SIP URLs you call to get to the demos:
- Verification Demo - sip:300@demo.projectdiastar.org. A very simple IVVR demo that will play several video clips and record and replay a from your SIP phone. Menu choices are made by hitting the DTMF keys on the phone. When done, just hang up.
- UGottaKlunker Demo - sip:500@demo.projectdiastar.org. Audio/video instructions will lead you through getting your klunker back on the road again. Menu choices are made hitting the DTMF keys on the phone. The rental car agreement number that it asks for is any 4-digit number. When done, just hang up.
- Pitching Demo- sip:600@demo.projectdiastar.org. Menus allow you to select the type of pitch and video clips show you how to hold the ball. When done, just hang up.
- LumenVox Speech-Enabled Pitching Demo- sip:700@demo.projectdiastar.org. Speech-enabled menus allow you to say the type of pitches you are interested in and video clips show you how to hold the ball. A headset with a microphone is needed for accurate speech recognition.
Once you have seen the demos, take a look at the Asterisk dialplan below that controls the application flows. Notice that it looks like any other audio dialplan, with the addition of several new Woomera video commands. WoomeraPlayback functions just like the usual audio Playback command, where media is played without interruption. WoomeraBackground plays audio/video in the background while waiting for a DTMF menu choice.
So, give the demos a roll and think about what sort of a customer support app you might build.
;
; Asterisk Dialplan for DiaStar Public Demos
;
; All media files are named the same as their contexts and are stored in the standard
; DiaStar media directory structure
;
[dialogic]
; Always start here. Extension 500 is tirechange demo, 600 is pitching demo.
exten => 500,1,Answer
exten => 500,n,Set(MEDIA_DIR=tirechange_demo)
exten => 500,n,Goto(tirechange_demo,s,1)
exten => 600,1,Answer
exten => 600,n,Set(FILE_LOC=pitching_demo)
exten => 600,n,Goto(greeting_000,s,1)
exten => _[1-4789]!,1,Answer
exten => _[1-4789]!,n,Set(FILE_LOC=pitching_demo)
exten => _[1-4789]!,n,Goto(greeting_000,s,1)
;Repetative plays and menus are handled with the following generic context subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[play_nointerrupt]
exten => s,1,Set(LOCAL(CALLING_CONTEXT)=${ARG1})
exten => s,n,Set(LOCAL(NEXT_CONTEXT)=${ARG2})
exten => s,n,Set(LOCAL(COMMENT)=${ARG3})
exten => s,n,Verbose(Context: ${CALLING_CONTEXT})
exten => s,n,Verbose(Next Context: ${NEXT_CONTEXT})
exten => s,n,Verbose(Comment: ${COMMENT})
; Play without interruption
exten => s,n,WoomeraPlayback(${FILE_LOC}/${CALLING_CONTEXT},${FILE_LOC}/${CALLING_CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
exten => s,n,Return
[post_menu_play]
exten => s,1,Set(LOCAL(CALLING_CONTEXT)=${ARG1})
exten => s,n,Set(LOCAL(NEXT_CONTEXT)=${ARG2})
exten => s,n,Set(LOCAL(PREV_CONTEXT)=${ARG3})
exten => s,n,Verbose(Calling Context: ${CALLING_CONTEXT})
exten => s,n,Verbose(Next Context: ${NEXT_CONTEXT})
exten => s,n,Verbose(Previous Context: ${PREV_CONTEXT})
exten => s,n,Verbose(Comment: Generic menu: 1 to go to next step 2 to replay last step)
; Play a menu, allowing the caller to interrupt with DTMF
; Just play the same recording for this recurring menu for now...
exten => s,n,WoomeraBackground(${FILE_LOC}/donerepeatwait,${FILE_LOC}/donerepeatwait)
; Sit for 5 minutes; replay this if it expires
exten => s,n,WaitExten(300)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(${NEXT_CONTEXT},s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(${PREVIOUS_CONTEXT},s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,WaitExten(300)
exten => t,1,Goto(${CONTEXT},s,1)
exten => i,1,Goto(${CONTEXT},s,1)
;exten => s,n,Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Pitching Demo
;
[greeting_000]
; Beginning of the Demo - Start Here
exten => s,1,Set(COMMENT=Demo Intro - Video version)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[main_menu_000]
; Menu listing all categories of pitches
exten => s,1,Verbose(Context: main_menu_000)
exten => s,n,Verbose(Choice of: fastball grips = 1, breakingball_grips = 2, offspeed grips = 3, knuckleball grips = 4)
exten => s,n,WoomeraBackground(${FILE_LOC}/${CONTEXT},${FILE_LOC}/${CONTEXT})
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(fastball_menu_000,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(breaking_ball_menu_000,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(off_speed_menu_000,s,1)
exten => 4,1,Verbose(Choice is "4" )
exten => 4,n,Goto(knuckleball_menu_000,s,1)
exten => t,1,Goto(main_menu_000,s,1)
exten => i,1,Goto(main_menu_000,s,1)
[fastball_menu_000]
; Menu listing all fastball pitches
exten => s,1,Verbose(Context: fastball_menu_000)
exten => s,n,Verbose(Choice of: four-seam fastball = 1, two-seam fastball = 2, split finger fastball = 3)
exten => s,n,WoomeraBackground(${FILE_LOC}/${CONTEXT},${FILE_LOC}/${CONTEXT})
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(four_seam_fastball,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(two_seam_fastball,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(splitter,s,1)
exten => t,1,Goto(fastball_menu_000,s,1)
exten => i,1,Goto(fastball_menu_000,s,1)
[breaking_ball_menu_000]
; Menu listing all breaking ball pitches
exten => s,1,Verbose(Context: breaking_ball_menu_000)
exten => s,n,Verbose(Choice of: beginners curveball = 1, straight curveball = 2, slider = 3)
exten => s,n,WoomeraBackground(${FILE_LOC}/${CONTEXT},${FILE_LOC}/${CONTEXT})
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(beginners_curveball,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(straight_curveball,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(slider,s,1)
exten => t,1,Goto(breaking_ball_menu_000,s,1)
exten => i,1,Goto(breaking_ball_menu_000,s,1)
[off_speed_menu_000]
; Menu listing all offspeed pitches
exten => s,1,Verbose(Context: off_speed_menu_000)
exten => s,n,Verbose(Choice of: three-finger changeup = 1, circle changeup = 2, palm ball = 3)
exten => s,n,WoomeraBackground(${FILE_LOC}/${CONTEXT},${FILE_LOC}/${CONTEXT})
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(three_finger_changeup,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(circle_change,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(palmball,s,1)
exten => t,1,Goto(off_speed_menu_000,s,1)
exten => i,1,Goto(off_speed_menu_000,s,1)
[knuckleball_menu_000]
; Menu listing all knuckleball pitches
exten => s,1,Verbose(Context: knuckleball_menu_000)
exten => s,n,Verbose(Choice of: knuckleball = 1, knuckle curve = 2)
exten => s,n,WoomeraBackground(${FILE_LOC}/${CONTEXT},${FILE_LOC}/${CONTEXT})
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(knuckleball,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(knucklecurve,s,1)
exten => t,1,Goto(knuckleball_menu_000,s,1)
exten => i,1,Goto(knuckecurvemenu_000,s,1)
[four_seam_fastball]
exten => s,1,Set(COMMENT=Play four seam fastball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[two_seam_fastball]
exten => s,1,Set(COMMENT=Play two seam fastball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[splitter]
exten => s,1,Set(COMMENT=Play split finger fastball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[beginners_curveball]
exten => s,1,Set(COMMENT=Play beginners curveball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[straight_curveball]
exten => s,1,Set(COMMENT=Play straight curveball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[slider]
exten => s,1,Set(COMMENT=Play slider instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[three_finger_changeup]
exten => s,1,Set(COMMENT=Play three finger changeup instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[circle_change]
exten => s,1,Set(COMMENT=Play circle chageup instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[palmball]
exten => s,1,Set(COMMENT=Play palmball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[knuckleball]
exten => s,1,Set(COMMENT=Play knuckleball instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
[knucklecurve]
exten => s,1,Set(COMMENT=Play knuckle curve instructions)
exten => s,n,Set(NEXT_CONTEXT=main_menu_000)
exten => s,n,Gosub(play_nointerrupt,s,1(${CONTEXT},${NEXT_CONTEXT},${COMMENT}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Tire Change Demo
;
;Repetitive plays and menus are handled with the following generic context subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[post_video_menu]
exten => s,1,Set(LOCAL(CALLING_CONTEXT)=${ARG1})
exten => s,n,Set(LOCAL(NEXT_CONTEXT)=${ARG2})
exten => s,n,Set(LOCAL(PREV_CONTEXT)=${ARG3})
exten => s,n,Verbose(Calling Context: ${CALLING_CONTEXT})
exten => s,n,Verbose(Next Context: ${NEXT_CONTEXT})
exten => s,n,Verbose(Previous Context: ${PREV_CONTEXT})
exten => s,n,Verbose(Comment: Generic menu: 1 to go to next step 2 to replay last step)
;exten => s,n,WoomeraBackground(${MEDIA_DIR}/${CALLING_CONTEXT},${MEDIA_DIR}/${CALLINGCONTEXT})
; Just play the same video for this recurring menu for now...
exten => s,n,WoomeraBackground(${MEDIA_DIR}/donerepeatwait,${MEDIA_DIR}/donerepeatwait)
; Sit for 5 minutes; replay this if it expires
exten => s,n,WaitExten(300)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(${NEXT_CONTEXT},s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(${PREVIOUS_CONTEXT},s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,WaitExten(300)
exten => t,1,Goto(${CONTEXT},s,1)
exten => i,1,Goto(${CONTEXT},s,1)
;exten => s,n,Return
[tirechange_demo]
; Beginning of the Demo - Start Here
exten => s,1,Set(COMMENT=Demo Intro Ugottaklunker logo)
exten => s,n,Set(NEXT_CONTEXT=greeting_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/greeting_000,${MEDIA_DIR}/greeting_000)
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[greeting_010]
; Enter 4 digit rental agreement number
; Do we want to do a "You've selected XXX, Confirm?" sort of thing here?
exten => s,1,Verbose(Context: greeting_tirechange_010)
exten => s,n,Verbose(Enter 4 digit rental agreement number)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/greeting_010,${MEDIA_DIR}/greeting_010)
exten => s,n,WaitExten(60)
exten => _XXXX,1,Set(AGREENO=${EXTEN})
exten => _XXXX,n,Verbose(Rental agreement number is ${AGREENO})
exten => _XXXX,n,Goto(which_car_000,s,1)
exten => i,1,Goto(greeting_010,s,1)
exten => t,1,Goto(greeting_010,s,1)
[which_car_000]
exten => s,1,Set(COMMENT=Play a picture of the 2002 Grand Prix that goes with the rental agreement)
exten => s,n,Set(NEXT_CONTEXT=which_car_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[which_car_010]
; Confirm that the correct car was chosen (1=yes, 2=no)
exten => s,1,Verbose(Context: which_car_010)
exten => s,n,Verbose(Confirm that the correct car was chosen: 1=yes 2=no)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/which_car_010,${MEDIA_DIR}/which_car_010)
exten => s,n,WaitExten(12)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(which_service_010,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(car_not_supported_000,s,1)
; Replay on timeout or bad choice
exten => t,1,Goto(which_car_010,s,1)
exten => i,1,Goto(which_car_010,s,1)
[car_not_supported_000]
exten => s,1,Set(COMMENT=This demo does not currently support that function - car)
exten => s,n,Set(NEXT_CONTEXT=which_car_000)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[which_service_010]
; Choice of calling for: service = 1, change a tire = 2 or jumpstart the car = 3
; Only option 2 is valid
exten => s,1,Verbose(Context: which_service_010)
exten => s,n,Verbose(Choice of calling for: service = 1 change a tire = 2 or jumpstart the car = 3)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/which_service_010,${MEDIA_DIR}/which_service_010)
exten => s,n,WaitExten(20)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(call_for_service_000,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(tire_cautions_000,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(service_not_supported_000,s,1)
exten => t,1,Goto(which_service_010,s,1)
exten => i,1,Goto(which_service_010,s,1)
[call_for_service_000]
; Bridge call to another SIP address
exten => s,1,Verbose(Outdialing to $OPERATOR})
exten => s,n,Dial(WOOMERA/${OPERATOR})
;exten => s,1,Goto(service_not_supported_000,s,1)
[service_not_supported_000]
exten => s,1,Set(COMMENT=This demo does not currently support that function - service)
exten => s,n,Set(NEXT_CONTEXT=which_service_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_cautions_000]
exten => s,1,Set(COMMENT=Play tire cautions video)
exten => s,n,Set(NEXT_CONTEXT=tire_cautions_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_cautions_010]
exten => s,1,Set(NEXT_CONTEXT=which_tire_000)
exten => s,n,Set(PREVIOUS_CONTEXT=tire_cautions_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[which_tire_000]
exten => s,1,Verbose(Context: which_tire_000)
exten => s,n,Verbose(If you need to change a front tire press 1 If you need to change a rear tire press 2)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/which_tire_000,${MEDIA_DIR}/which_tire_000)
exten => s,n,WaitExten(8)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Set(TIRE=front)
exten => 1,n,Goto(which_step_000,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Set(TIRE=rear)
exten => 2,n,Goto(which_step_000,s,1)
exten => t,1,Goto(which_tire_000,s,1)
exten => i,1,Goto(which_tire_000,s,1)
[which_step_000]
exten => s,1,Verbose(Context: which_step_000)
exten => s,n,Verbose(To locate the spare tire press 1 To locate the jack press 2 To place the jack press 3)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/which_step_000,${MEDIA_DIR}/which_step_000)
exten => s,n,WaitExten(10)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(tire_000,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(find_jack_000,s,1)
exten => 3,1,Verbose(Choice is "3" )
exten => 3,n,Goto(place_jack_000,s,1)
exten => t,1,Goto(which_step_000,s,1)
exten => i,1,Goto(which_step_000,s,1)
[tire_000]
exten => s,1,Set(COMMENT=Play tire is located video)
exten => s,n,Set(NEXT_CONTEXT=tire_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_010]
exten => s,1,Verbose(Context: tire_010)
exten => s,n,Verbose(If you know how to open trunk do so and press 1 Otherwise press 2)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/tire_010,${MEDIA_DIR}/tire_010)
exten => s,n,WaitExten(10)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(tire_030,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(trunk_000,s,1)
exten => t,1,Goto(tire_010,s,1)
exten => i,1,Goto(tire_010,s,1)
[trunk_000]
exten => s,1,Set(COMMENT=Play trun opening methods video)
exten => s,n,Set(NEXT_CONTEXT=trunk_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[trunk_010]
exten => s,1,Set(NEXT_CONTEXT=tire_030)
exten => s,n,Set(PREVIOUS_CONTEXT=trunk_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[tire_030]
exten => s,1,Set(COMMENT=Play floor of trunk video)
exten => s,n,Set(NEXT_CONTEXT=tire_040)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_040]
exten => s,1,Set(NEXT_CONTEXT=tire_050)
exten => s,n,Set(PREVIOUS_CONTEXT=tire_030)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[tire_050]
exten => s,1,Set(COMMENT=Play center nut video)
exten => s,n,Set(NEXT_CONTEXT=tire_060)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_060]
exten => s,1,Set(NEXT_CONTEXT=tire_070)
exten => s,n,Set(PREVIOUS_CONTEXT=tire_050)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[tire_070]
exten => s,1,Set(COMMENT=Play lift out spare tire video)
exten => s,n,Set(NEXT_CONTEXT=tire_080)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[tire_080]
exten => s,1,Set(NEXT_CONTEXT=tire_090)
exten => s,n,Set(PREVIOUS_CONTEXT=tire_070)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[tire_090]
exten => s,1,Set(COMMENT=Play successfully removed spare tire video)
exten => s,n,Set(NEXT_CONTEXT=find_jack_000)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[find_jack_000]
exten => s,1,Verbose(Context: find_jack_000)
exten => s,n,Verbose(Play jack located beneath spare tire menu)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/find_jack_000,${MEDIA_DIR}/find_jack_000)
exten => s,n,WaitExten(13)
exten => 1,1,Verbose(Choice is "1" )
exten => 1,n,Goto(tire_000,s,1)
exten => 2,1,Verbose(Choice is "2" )
exten => 2,n,Goto(find_jack_010,s,1)
exten => t,1,Goto(find_jack_000,s,1)
exten => i,1,Goto(find_jack_000,s,1)
[find_jack_010]
exten => s,1,Set(COMMENT=Play release the jack video)
exten => s,n,Set(NEXT_CONTEXT=find_jack_020)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[find_jack_020]
exten => s,1,Set(NEXT_CONTEXT=find_jack_030)
exten => s,n,Set(PREVIOUS_CONTEXT=find_jack_010)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[find_jack_030]
exten => s,1,Set(COMMENT=Play successfully removed jack video)
exten => s,n,Set(NEXT_CONTEXT=place_jack_000)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[place_jack_000]
exten => s,1,Verbose(Context: place_jack_000)
exten => s,n,Verbose(Play must loosen lug nuts video)
exten => s,n,WoomeraBackground(${MEDIA_DIR}/place_jack_000,${MEDIA_DIR}/place_jack_000)
exten => s,n,WaitExten(8)
exten => t,1,Goto(place_jack_010,s,1)
exten => i,1,Goto(place_jack_010,s,1)
[place_jack_010]
exten => s,1,Set(COMMENT=Play loosen nut caps video)
exten => s,n,Set(NEXT_CONTEXT=place_jack_020)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[place_jack_020]
exten => s,1,Set(NEXT_CONTEXT=place_jack_030)
exten => s,n,Set(PREVIOUS_CONTEXT=place_jack_010)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[place_jack_030]
exten => s,1,Set(COMMENT=Play loosen wheel nut video)
exten => s,n,Set(NEXT_CONTEXT=place_jack_040)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[place_jack_040]
exten => s,1,Set(NEXT_CONTEXT=place_jack_050)
exten => s,n,Set(PREVIOUS_CONTEXT=place_jack_030)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[place_jack_050]
exten => s,1,Verbose(Context: place_jack_050)
exten => s,n,Verbose(Play place jack video)
exten => s,n,Verbose(TIRE is ${TIRE})
exten => s,n,WoomeraBackground(${MEDIA_DIR}/place_jack_050,${MEDIA_DIR}/place_jack_050)
exten => s,n,WaitExten(20)
exten => s,n,GotoIf($["${TIRE}" = "front"]?jack_front_000,s,1)
exten => s,n,GotoIf($["${TIRE}" = "rear"]?jack_rear_000,s,1)
exten => t,1,GotoIf($["${TIRE}" = "front"]?jack_front_000,s,1)
exten => t,n,GotoIf($["${TIRE}" = "rear"]?jack_rear_000,s,1)
exten => i,1,GotoIf($["${TIRE}" = "front"]?jack_front_000,s,1)
exten => i,n,GotoIf($["${TIRE}" = "rear"]?jack_rear_000,s,1)
[jack_front_000]
exten => s,1,Set(COMMENT=Play first jack front video)
exten => s,n,Set(NEXT_CONTEXT=jack_front_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[jack_front_010]
exten => s,1,Set(NEXT_CONTEXT=jack_front_020)
exten => s,n,Set(PREVIOUS_CONTEXT=jack_front_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[jack_front_020]
exten => s,1,Set(COMMENT=Play car being raised with jack in front video)
exten => s,n,Set(NEXT_CONTEXT=jack_front_030)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[jack_front_030]
exten => s,1,Set(NEXT_CONTEXT=remove_000)
exten => s,n,Set(PREVIOUS_CONTEXT=jack_front_020)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[jack_rear_000]
exten => s,1,Set(COMMENT=Play first jack rear video)
exten => s,n,Set(NEXT_CONTEXT=jack_rear_010)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[jack_rear_010]
exten => s,1,Set(NEXT_CONTEXT=jack_rear_020)
exten => s,n,Set(PREVIOUS_CONTEXT=jack_rear_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[jack_rear_020]
exten => s,1,Set(COMMENT=Play car being raised with jack in rear video)
exten => s,n,Set(NEXT_CONTEXT=jack_rear_030)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[jack_rear_030]
exten => s,1,Set(NEXT_CONTEXT=remove_000)
exten => s,n,Set(PREVIOUS_CONTEXT=jack_rear_020)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[remove_000]
exten => s,1,Set(COMMENT=Play removal of wheel nuts and lifting off of spare video)
exten => s,n,Set(NEXT_CONTEXT=remove_020)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[remove_020]
exten => s,1,Set(NEXT_CONTEXT=mount_000)
exten => s,n,Set(PREVIOUS_CONTEXT=remove_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[mount_000]
exten => s,1,Set(COMMENT=Play proper placement of spare and hand tightening bolts video)
exten => s,n,Set(NEXT_CONTEXT=mount_020)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[mount_020]
exten => s,1,Set(NEXT_CONTEXT=mount_030)
exten => s,n,Set(PREVIOUS_CONTEXT=mount_000)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[mount_030]
exten => s,1,Set(COMMENT=Play lower vehicle and removing jack video)
exten => s,n,Set(NEXT_CONTEXT=mount_040)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[mount_040]
exten => s,1,Set(NEXT_CONTEXT=mount_050)
exten => s,n,Set(PREVIOUS_CONTEXT=mount_030)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[mount_050]
exten => s,1,Set(COMMENT=Play wheel mounting video)
exten => s,n,Set(NEXT_CONTEXT=mount_060)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/${CONTEXT},${MEDIA_DIR}/${CONTEXT})
exten => s,n,Goto(${NEXT_CONTEXT},s,1)
[mount_060]
exten => s,1,Set(NEXT_CONTEXT=finish_000)
exten => s,n,Set(PREVIOUS_CONTEXT=mount_050)
exten => s,n,Gosub(post_video_menu,s,1(${CONTEXT},${NEXT_CONTEXT},${PREVIOUS_CONTEXT}))
[finish_000]
exten => s,1,Verbose(Context: finish_000)
exten => s,n,Verbose(Play stowing jack and replacing trunk floor video)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/finish_000,${MEDIA_DIR}/finish_000)
exten => s,n,Goto(hangup_000,s,1)
[hangup_000]
exten => s,1,Verbose(Context: hangup_000)
exten => s,n,Verbose(Play back on the road video)
exten => s,n,WoomeraPlayback(${MEDIA_DIR}/hangup_000,${MEDIA_DIR}/hangup_000)
exten => s,n,Wait(3)
exten => s,n,Hangup()





