;------------------------------------------------------------------------------- ; Menu for all conference demos [conference_menu] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,2,Set(OVERLAY=id=text_box&header=Video Conferencing&line1=1 Animal Conference&line2=2 PIN Conference&line3=3 Conference Record&line4=4 Controlled Conferencing&line5=5 Demo Menu&footer=Diastar) exten => s,3,Set(TIMEOUT_CNT=0) exten => s,4,WoomeraBackground(${APPNAME}/conference_menu,${APPNAME}/black,${OVERLAY}) exten => s,5,WaitExten(30) exten => 1,1,Goto(animal_conference,s,1) exten => 2,1,Goto(pin_conference,s,1) exten => 3,1,Goto(confrecord_menu,s,1) exten => 4,1,Goto(controlled_conf_menu,s,1) exten => 5,1,Goto(demo_menu,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(conference_menu,s,4) exten => i,1,Goto(conference_menu,s,1) [pin_conference] ; ; A file-based DB keeps track of the allowed conferences and the number of participants ; in each. The caller is asked if he wants to start a new conference, in which case an ID ; is supplied, the DB record updated accordingly and the caller is the first conferee in ; that conference. He relays the ID to other people and they call in and enter the conference ; by supplying the ID. exten => s,1,Set(CHANNEL(language)=en_US) ; ; Query to ask if starting new conference or joining existing exten => s,2,Set(OVERLAY=id=text_box&header=PIN Conference&line1=1 Start New Conference&line2=2 Enter PIN Conference&line3=3 Demo Menu&footer=Diastar) exten => s,3,Set(TIMEOUT_CNT=0) exten => s,4,WoomeraBackground(${APPNAME}/pin_conference,${APPNAME}/black,${OVERLAY}) exten => s,5,WaitExten(30) exten => 1,1,Goto(new_pin_conference,s,1) exten => 2,1,Goto(get_existing_pin,s,1) exten => 3,1,Goto(demo_menu,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(pin_conference,s,4) exten => i,1,Goto(pin_conference,s,1) [new_pin_conference] ; ; AGI script will check DB for next available conference ID and voice it to caller. ; Then we put him into that conference. Conferencd ID returned in PIN_CONF_ID exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraPlayback(${APPNAME}/new_pin_conference) exten => s,n,AGI(enter_new_pin_conf.agi) ; ; Get either the next available ID or "NONE" - all conferences in use exten => s,n,GotoIf($["${PIN_CONF_ID}" = "NONE"]?all_confs_in_use,s,1) ; When done with the conference [remove_from_pin_conference] context will take care ; of DB update that marks a caller leaving the conference exten => s,n,Dial(WOOMERA/conf:${PIN_CONF_ID}/tiles=4,30,F(remove_from_pin_conf^s^1)) [get_existing_pin] ; ; AGI script will check DB to validate conference ID. If OK, ; we put him into that conference exten => s,1,Set(OVERLAY=id=text_box&header=PIN Conference&line1=Please enter your 3&line2=digit conference PIN&footer=Diastar) exten => s,2,Set(TIMEOUT_CNT=0) exten => s,3,WoomeraBackground(${APPNAME}/pin_entry_prompt,${APPNAME}/black,${OVERLAY}) exten => s,4,WaitExten(10) ; 101-106 are valid entries exten => _XXX,1,AGI(validate_pin_conf.agi, ${EXTEN}) exten => _XXX,n,Set(COLLECTED_PIN=${EXTEN}) exten => _XXX,n,GotoIf($["${VALID_PIN}" = "T"]?join_existing_pin_conference,s,1) exten => _XXX,n,GotoIf($["${VALID_PIN}" = "F"]?bad_pin,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(get_existing_pin,s,3) exten => i,1,Goto(get_existing_pin,s,1) [bad_pin] ; ; Deliver "Entered bad PIN" message and resolicit exten => s,1,Set(OVERLAY=id=text_box&header=PIN Conference&line1=Invalid PIN&line2=Please re-enter PIN&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/bad_pin,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(6) exten => t,1,WoomeraStop exten => t,n,Goto(get_existing_pin,s,1) [join_existing_pin_conference] ; ; Good conference PIN - can join exten => s,1,AGI(enter_existing_pin_conf.agi,${COLLECTED_PIN}) ; When done with the conference [remove_from_pin_conference] context will take care ; of DB update that marks a caller leaving the conference exten => s,n,Dial(WOOMERA/conf:${PIN_CONF_ID}/tiles=4,30,F(remove_from_pin_conf^s^1)) [remove_from_pin_conf] ; ; Land in this context when have left a pin conference. ; Use AGI to decrement the pin conference database for this particular conference exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,AGI(leave_pin_conf.agi,${CHANNEL:13:3}) exten => s,n,Hangup [all_confs_in_use] ; ; No open conference IDs - deliver nice message and dump ; exten => s,1,Set(OVERLAY=id=text_box&header=Conferences Busy&line1=All Conference IDs&line2=are currently in use!&line3=Please try later&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/all_confs_in_use,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(10) exten => t,1,WoomeraStop exten => t,n,hangup ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Animal Conference ; ; Play an intro still with some voiceover, then kick off the 3 animals that ; come into the conference using SIPP plays ; [animal_conference] ; ; AGI script will check DB for next available animal conference ID. ; Then we put him into that conference. Conferencd ID returned in ANIMAL_CONF_ID exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraPlayback(${APPNAME}/animalconference,${APPNAME}/animalconference) exten => s,n,AGI(get_new_animal_conf_id.agi) ; Get either the next available ID or "NONE" - all conferences in use exten => s,n,GotoIf($["${ANIMAL_CONF_ID}" = "NONE"]?all_confs_in_use,s,1) exten => s,n,System(${SIPP_LOC}/CIF/startanimalconf.sh ${ANIMAL_CONF_ID}) exten => s,n,Dial(WOOMERA/conf:${ANIMAL_CONF_ID}/tiles=4,30,F(leave_animal_conf^s^1)) [leave_animal_conf] ; ; Land in this context when have left an animal conference. ; Conference ID is embedded in the channel name ; Use AGI to decrement the pin conference database for this particular conference exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,AGI(leave_animal_conf.agi,${CHANNEL:13:3}) exten => s,n,Hangup ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Conference Recording ; [confrecord_menu] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,2,Set(OVERLAY=id=text_box&header=Conference Record&line1=1 Start/Record New&line2= Conference&line3=2 Enter Existing Conference&line4=3 Replay Conference&line5=4 Demo Menu&footer=Diastar) exten => s,3,Set(TIMEOUT_CNT=0) exten => s,4,WoomeraBackground(${APPNAME}/confrecord_menu,${APPNAME}/black,${OVERLAY}) exten => s,5,WaitExten(30) exten => 1,1,Goto(confrecord,1,1) exten => 2,1,Goto(confrecord,2,1) exten => 3,1,Goto(confrecord,3,1) exten => 4,1,Goto(demo_menu,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(confrecord_menu,s,4) exten => i,1,Goto(confrecord_menu,s,1) [confrecord] ; This conferee enters the recorded conference, already knowing the conference PIN ; Recording is only started and stopped by the first person who generates the conferenc PIN ; This one enters and triggers recording ; And ends conference record on leaving exten => 1,1,Answer exten => 1,n,Set(CHANNEL(language)=en_US) exten => 1,n,AGI(enter_new_conf_record.agi) ; Get either the next available ID or "NONE" - all conferences in use exten => 1,n,GotoIf($["${CONF_RECORD_ID}" = "NONE"]?all_confs_in_use,s,1) exten => 1,n,System(${AMI_SCRIPT_LOC}/confrec_originate.sh ${CONF_RECORD_ID}) exten => 1,n,Dial(WOOMERA/conf:${CONF_RECORD_ID}/tiles=2,30,F(done_with_recorded_conference^s^1)) exten => 2,1,Answer exten => 2,n,Set(CHANNEL(language)=en_US) exten => 2,n,Goto(get_existing_recorded_pin,s,1) ; Conference recording playback - exten => 3,1,Answer exten => 3,n,Set(CHANNEL(language)=en_US) exten => 3,n,Verbose(Replay conference recording) exten => 3,n,Goto(get_pin_for_replay,s,1) ; Conexts to trigger conference recording. Extension and recording file name ; corresponds to conference ID ; Recording terminates when the originator leaves the conference [conf_record_131] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_131,${CONF_RECORDING_LOC}/conference_recording_131,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [conf_record_132] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_132,${CONF_RECORDING_LOC}/conference_recording_132,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [conf_record_133] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_133,${CONF_RECORDING_LOC}/conference_recording_133,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [conf_record_134] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_134,${CONF_RECORDING_LOC}/conference_recording_134,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [conf_record_135] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_135,${CONF_RECORDING_LOC}/conference_recording_135,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [conf_record_136] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraRecord(${CONF_RECORDING_LOC}/conference_recording_136,${CONF_RECORDING_LOC}/conference_recording_136,${MAX_CONF_RECORD_TIME}) exten => s,n,Hangup [done_with_recorded_conference] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,AGI(leave_recorded_conf.agi, ${CHANNEL}) exten => s,n,System(${AMI_SCRIPT_LOC}/confrec_hangup.sh ${CHANNEL}) exten => s,n,Hangup ; Enter Existing Conference ;;;;;;;;;;;;;;;;;;;;;;;;;;; [get_existing_recorded_pin] ; ; AGI script will check DB to validate conference ID. If OK, ; we put him into that conference exten => s,1,Set(OVERLAY=id=text_box&header=Conference Record&line1=Please enter your 3&line2=digit conference PIN&footer=Diastar) exten => s,2,Set(TIMEOUT_CNT=0) exten => s,3,WoomeraBackground(${APPNAME}/pin_entry_prompt,${APPNAME}/black,${OVERLAY}) exten => s,4,WaitExten(10) ; 131-136 are valid entries exten => _XXX,1,AGI(validate_record_pin.agi, ${EXTEN}) exten => _XXX,n,Set(COLLECTED_PIN=${EXTEN}) exten => _XXX,n,GotoIf($["${VALID_RECORD_PIN}" = "T"]?join_existing_recorded_conference,s,1) exten => _XXX,n,GotoIf($["${VALID_RECORD_PIN}" = "F"]?bad_pin_for_recorded_conf,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(get_existing_recorded_pin,s,3) exten => i,1,Goto(get_existing_recorded_pin,s,1) [bad_pin_for_recorded_conf] ; ; Deliver "Entered bad PIN" message and resolicit exten => s,1,Set(OVERLAY=id=text_box&header=Conference Record&line1=Invalid PIN&line2=Please re-enter PIN&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/bad_pin,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(6) exten => t,1,WoomeraStop exten => t,n,Goto(get_existing_recorded_pin,s,1) [join_existing_recorded_conference] ; ; Good conference PIN - can join recorded conference exten => s,1,AGI(enter_existing_recorded_conf.agi,${COLLECTED_PIN}) ; When done with the conference [done_with_recorded_conference] context will take care ; of DB update that marks a caller leaving the conference exten => s,n,Dial(WOOMERA/conf:${COLLECTED_PIN}/tiles=4,30,F(done_with_recorded_conference^s^1)) ; Replay ;;;;;;;; [get_pin_for_replay] exten => s,1,Set(OVERLAY=id=text_box&header=Conference Record&line1=Please enter the 3&line2=digit conference ID&line3=to replay&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/enter_replay_id,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(15) ; 131-136 are valid entries exten => _XXX,1,AGI(validate_record_pin_for_replay.agi, ${EXTEN}) exten => _XXX,n,Set(COLLECTED_PIN=${EXTEN}) exten => _XXX,n,GotoIf($["${VALID_RECORD_PIN}" = "F"]?bad_record_pin,s,1) ; ; Play one of the recordings exten => _XXX,n,WoomeraPlayback(confrecord/conference_recording_${COLLECTED_PIN},confrecord/conference_recording_${COLLECTED_PIN}) exten => _XXX,n,Hangup exten => t,1,WoomeraStop exten => t,n,Goto(get_pin_for_replay,s,1) exten => i,1,Goto(get_pin_for_replay,s,1) [bad_record_pin] ; ; Deliver "Entered bad PIN" message and resolicit exten => s,1,Set(OVERLAY=id=text_box&header=Conference Record&line1=Invalid PIN&line2=Please re-enter PIN&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/bad_pin,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(6) exten => t,1,WoomeraStop exten => t,n,Goto(get_pin_for_replay,s,1) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Controlled Conference ; Assumes that conference ids used are configured with "mode = controlled" on DiaStar. ; ; The controller's connection in managed by the dialplan by passing the 'G' ; option to the Dial() application. This has been done to allow an image to be ; played to conference attendees at times when no presenters are connected. The ; controllers audio remains connected at all times and should be muted locally ; if necessary. ; [controlled_conf_menu] ; ; A file-based DB keeps track of the allowed conferences and the number of participants ; in each. The caller is asked if he wants to start a new conference, in which case an ID ; is supplied, the DB record updated accordingly and the caller is the first conferee in ; that conference. He relays the ID to other people and they call in and enter the conference ; by supplying the ID. exten => s,1,Set(CHANNEL(language)=en_US) exten => s,2,Set(OVERLAY=id=text_box&header=Controlled Conference&line1=1 Start New Conference&line2= as Controller&line3=2 Enter as Presenter&line4=3 Enter as Atendee&line5=4 Demo Menu&footer=Diastar) exten => s,3,Set(TIMEOUT_CNT=0) exten => s,4,WoomeraBackground(${APPNAME}/controlled_conf_menu,${APPNAME}/black,${OVERLAY}) exten => s,5,WaitExten(35) exten => 1,1,Goto(controller,s,1) exten => 2,1,Set(CONFEREE_TYPE=presenter) exten => 2,n,Goto(get_controlled_pin,s,1) exten => 3,1,Set(CONFEREE_TYPE=attendee) exten => 3,n,Goto(get_controlled_pin,s,1) exten => 4,1,Goto(demo_menu,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(controlled_conf_menu,s,4) exten => i,1,Goto(controlled_conf_menu,s,1) [controller] ; The conference controller dials into here. ; Setting the number of tiles to 0, overrides the configuration and allows for ; the number of tiles shown to grow and shrink dynamically along with the number ; of presenters. ; ; ; AGI script will check DB for next available conference ID and voice it to caller. ; Then we put him into that conference. Conferencd ID returned in PIN_CONF_ID exten => s,1,Set(_PARENT=${CHANNEL}) exten => s,n,WoomeraPlayback(${APPNAME}/new_controlled_conference) exten => s,n,AGI(enter_new_controlled_conf.agi) ; ; Get either the next available ID or "NONE" - all conferences in use exten => s,n,GotoIf($["${CONTROLLED_CONF_ID}" = "NONE"]?all_confs_in_use,s,1) exten => s,n,Dial(WOOMERA/${WOOMERA_PROFILE}/conf:${CONTROLLED_CONF_ID}/role=controller:tiles=0,30,G(cc_connected,s,1))) exten => s,n,Hangup [get_controlled_pin] ; ; AGI script will check DB to validate conference ID. If OK, ; we put him into that conference exten => s,1,Set(OVERLAY=id=text_box&header=Controlled Conference&line1=Please enter your 3&line2=digit conference PIN&footer=Diastar) exten => s,2,Set(TIMEOUT_CNT=0) exten => s,3,WoomeraBackground(${APPNAME}/pin_entry_prompt,${APPNAME}/black,${OVERLAY}) exten => s,4,WaitExten(10) ; 111-116 are valid entries exten => _XXX,1,AGI(validate_controlled_conf.agi, ${EXTEN}) exten => _XXX,n,Set(COLLECTED_PIN=${EXTEN}) exten => _XXX,n,GotoIf($["${VALID_PIN}" = "T"]?enter_existing_controlled_conf,s,1) exten => _XXX,n,GotoIf($["${VALID_PIN}" = "F"]?bad_controlled_pin,s,1) exten => t,1,Set(TIMEOUT_CNT=$[${TIMEOUT_CNT} + 1]) exten => t,n,GotoIf($[${TIMEOUT_CNT} > 1]?hangup,s,1) exten => t,n,WoomeraStop exten => t,n,Goto(get_controlled_pin,s,3) exten => i,1,Goto(get_controlled_pin,s,1) [bad_controlled_pin] ; ; Deliver "Entered bad PIN" message and resolicit exten => s,1,Set(OVERLAY=id=text_box&header=Controlled Conference&line1=Invalid PIN&line2=Please re-enter PIN&footer=Diastar) exten => s,n,WoomeraBackground(${APPNAME}/bad_pin,${APPNAME}/black,${OVERLAY}) exten => s,n,WaitExten(6) exten => t,1,WoomeraStop exten => t,n,Goto(get_controlled_pin,s,1) [enter_existing_controlled_conf] ; Presenters are full members of the conference whose ; media are included in the output. ; ; Attendees are passive observers of the conference whose ; own media are not included in the output. ; ; Both enter a conference here. exten => s,1,AGI(enter_existing_controlled_conf.agi,${CONTROLLED_CONF_ID}) exten => s,n,Dial(WOOMERA/${WOOMERA_PROFILE}/conf:${CONTROLLED_CONF_ID}/role=${CONFEREE_TYPE},30) exten => s.n,Hangup [remove_from_controlled_conf] ; The conference controller lands in this context when he leaves a controlled conference. ; Extension matches conference ID to decrement. ; Use AGI to set the pin conference database to zer for this particular conference, since ; everyone will be tossed out when the controller leaves exten => s,1,Set(CHANNEL(language)=en_US) ; Conference ID is embedded in the channel name exten => s,n,AGI(leave_controlled_conf.agi,${CHANNEL:14:3}) exten => s,n,Hangup [cc_connected] ; When the conference controller call connects to the conference, the Dial() ; application jumps to the context. ; exten => s,1,Goto(cc_caller,s,1) exten => s,2,Goto(cc_callee,s,1) ; Answer the original inbound call. ; [cc_caller] exten => s,1,Answer exten => t,1,NoOp exten => h,1,Hangup ; The controllers own video stream can be shown instead of the image file by ; removing the WoomeraBackround() application. ; [cc_callee] exten => s,1,Set(CHANNEL(language)=en_US) exten => s,n,WoomeraBackground(,conference_demo/diastar-video-conf) exten => s,n,Bridge(${PARENT}) ; After controller hangs up, we continue here and need to zero out the ; number of people in the conference exten => s,n,Goto(remove_from_controlled_conf,s,1) exten => s,n,Hangup ;-------------------------------------------------------------------------------