package org.mobicents.servlet.sip.seam.media.framework; import javax.servlet.sip.SipSession; import org.mobicents.mscontrol.MsConnection; import org.mobicents.mscontrol.MsLink; import org.mobicents.mscontrol.events.MsEventAction; import org.mobicents.mscontrol.events.MsEventFactory; import org.mobicents.mscontrol.events.MsRequestedEvent; import org.mobicents.mscontrol.events.MsRequestedSignal; import org.mobicents.mscontrol.events.ann.MsPlayRequestedSignal; import org.mobicents.mscontrol.events.audio.MsRecordRequestedSignal; import org.mobicents.mscontrol.events.dtmf.MsDtmfRequestedEvent; import org.mobicents.mscontrol.events.pkg.DTMF; import org.mobicents.mscontrol.events.pkg.MsAnnouncement; import org.mobicents.mscontrol.events.pkg.MsAudio; import org.mobicents.servlet.sip.seam.entrypoint.media.MediaController; import org.mobicents.servlet.sip.seam.entrypoint.media.MsProviderContainer; /** * This class is for convinience when you want to execute media operations on the endpoints * and MsLink/MsConnection objects assigned to the current session. Whenever you establish * an MsConnection or MsLink the mediaSessionStore is updated and the objects are assigned * to you SipSession (mediaSessionStore is session-scoped). * * @author vralev * */ public class IVRHelper { SipSession sipSession; MsEventFactory eventFactory; MediaController mediaController; MediaSessionStore mediaSessionStore; public IVRHelper(SipSession sipSession, MediaSessionStore mediaSessionStore, MediaController mediaController) { this.sipSession = sipSession; this.mediaSessionStore = mediaSessionStore; this.mediaController = mediaController; this.eventFactory = MsProviderContainer.msProvider.getEventFactory(); } /** * Play an announcement to the specified endpoint using either the MsConnection object or * the MsLink object stored in the mediaSessionStore. The MsLink object takes precedence * because it is likely the terminating object too. * * Allowed Endpoints for this operation are IVR, Announcement and Conference. * * @param file */ public void playAnnouncement(String file) { MsRequestedEvent onCompleted = eventFactory.createRequestedEvent(MsAnnouncement.COMPLETED); onCompleted.setEventAction(MsEventAction.NOTIFY); MsRequestedEvent onFailed = eventFactory.createRequestedEvent(MsAnnouncement.FAILED); onFailed.setEventAction(MsEventAction.NOTIFY); MsPlayRequestedSignal play = (MsPlayRequestedSignal) eventFactory.createRequestedSignal(MsAnnouncement.PLAY); play.setURL(file); MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { play }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { onCompleted, onFailed}; MsLink msLink = mediaSessionStore.getMsLink(); MsConnection msConnection = mediaSessionStore.getMsConnection(); if(msLink != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msLink); } else if (msConnection != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msConnection); } } /** * Play an announcement AND detect DTMF to the specified endpoint using either the MsConnection object or * the MsLink object stored in the mediaSessionStore. The MsLink object takes precedence * because it is likely the terminating object too. * * Note that DTMF detecting introduces an overhead, especially the inband DTMF detection. * * Allowed Endpoints for this operation are IVR and Conference * * @param file */ public void playAnnouncementWithDtmf(String file) { MsRequestedEvent onCompleted = eventFactory.createRequestedEvent(MsAnnouncement.COMPLETED); onCompleted.setEventAction(MsEventAction.NOTIFY); MsRequestedEvent onFailed = eventFactory.createRequestedEvent(MsAnnouncement.FAILED); onFailed.setEventAction(MsEventAction.NOTIFY); MsPlayRequestedSignal play = (MsPlayRequestedSignal) eventFactory.createRequestedSignal(MsAnnouncement.PLAY); play.setURL(file); MsDtmfRequestedEvent dtmf = (MsDtmfRequestedEvent) eventFactory.createRequestedEvent(DTMF.TONE); MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { play }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { onCompleted, onFailed, dtmf }; MsLink msLink = mediaSessionStore.getMsLink(); MsConnection msConnection = mediaSessionStore.getMsConnection(); if(msLink != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msLink); } else if (msConnection != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msConnection); } } /** * Detect DTMF on the endpoint specified in mediaSession store using either the MsLink * (higher precedence) or the MsConnection. * * Allowed Endpoints for this operation are IVR and Conference */ public void detectDtmf() { MsDtmfRequestedEvent dtmf = (MsDtmfRequestedEvent) eventFactory.createRequestedEvent(DTMF.TONE); MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { dtmf }; MsLink msLink = mediaSessionStore.getMsLink(); MsConnection msConnection = mediaSessionStore.getMsConnection(); if(msLink != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msLink); } else if (msConnection != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msConnection); } } /** * Record to a file. Note the file should be in this format "file:///somewhere/file.wav * It is using the endpoint and the link or connection specified in mediaSessionStore. * * Allowed Endpoints for this operation are IVR and Conference * * @param file */ public void record(String file) { MsDtmfRequestedEvent dtmf = (MsDtmfRequestedEvent) eventFactory.createRequestedEvent(DTMF.TONE); MsRecordRequestedSignal record = (MsRecordRequestedSignal) eventFactory.createRequestedSignal(MsAudio.RECORD); record.setFile(file); MsRequestedEvent onFailed = eventFactory.createRequestedEvent(MsAudio.FAILED); onFailed.setEventAction(MsEventAction.NOTIFY); MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { record }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { dtmf, onFailed }; MsLink msLink = mediaSessionStore.getMsLink(); MsConnection msConnection = mediaSessionStore.getMsConnection(); if(msLink != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msLink); } else if (msConnection != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msConnection); } } /** * Stops any previously executed commands. */ public void endAll() { MsRequestedSignal[] requestedSignals = new MsRequestedSignal[] { }; MsRequestedEvent[] requestedEvents = new MsRequestedEvent[] { }; MsLink msLink = mediaSessionStore.getMsLink(); MsConnection msConnection = mediaSessionStore.getMsConnection(); if(msLink != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msLink); } else if (msConnection != null) { mediaController.execute( mediaSessionStore.getMsEndpoint(), requestedSignals, requestedEvents, msConnection); } } }