package org.mobicents.servlet.sip.example; import java.io.IOException; import java.net.URI; import javax.media.mscontrol.MediaEventListener; import javax.media.mscontrol.MediaSession; import javax.media.mscontrol.MsControlException; import javax.media.mscontrol.join.JoinEvent; import javax.media.mscontrol.join.JoinEventListener; import javax.media.mscontrol.join.Joinable.Direction; import javax.media.mscontrol.mediagroup.MediaGroup; import javax.media.mscontrol.mediagroup.Player; import javax.media.mscontrol.mediagroup.PlayerEvent; import javax.media.mscontrol.mediagroup.signals.SignalDetector; import javax.media.mscontrol.mediagroup.signals.SignalDetectorEvent; import javax.media.mscontrol.networkconnection.NetworkConnection; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipServletResponse; import javax.servlet.sip.SipSession; import org.apache.log4j.Logger; /** * * @author amit bhayani * */ public class PromptAndCollectServlet extends PlayerServlet { private static final long serialVersionUID = 1L; private static Logger logger = Logger .getLogger(PromptAndCollectServlet.class); private final static String WELCOME_MSG = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf_welcome.wav"; private final static String DTMF_0 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf0.wav"; private final static String DTMF_1 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf1.wav"; private final static String DTMF_2 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf2.wav"; private final static String DTMF_3 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf3.wav"; private final static String DTMF_4 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf4.wav"; private final static String DTMF_5 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf5.wav"; private final static String DTMF_6 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf6.wav"; private final static String DTMF_7 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf7.wav"; private final static String DTMF_8 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf8.wav"; private final static String DTMF_9 = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/dtmf9.wav"; private final static String STAR = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/star.wav"; private final static String POUND = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/pound.wav"; private final static String A = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/A.wav"; private final static String B = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/B.wav"; private final static String C = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/C.wav"; private final static String D = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/D.wav"; @Override public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } @Override protected void doAck(SipServletRequest req) throws ServletException, IOException { if (logger.isDebugEnabled()) { logger.debug("Received ACK for INVITE " + req); } SipSession sipSession = req.getSession(); MediaSession ms = (MediaSession) sipSession .getAttribute("MEDIA_SESSION"); try { MediaGroup mg = ms .createMediaGroup(MediaGroup.PLAYER_SIGNALDETECTOR); mg.addListener(new MyJoinEventListener()); NetworkConnection nc = (NetworkConnection) sipSession .getAttribute("NETWORK_CONNECTION"); mg.joinInitiate(Direction.DUPLEX, nc, this); sipSession.setAttribute("MediaGroup", mg); } catch (MsControlException e) { logger.error(e); // Clean up media session terminate(sipSession, ms); } } @Override protected void doInfo(SipServletRequest request) throws ServletException, IOException { int responseCode = SipServletResponse.SC_OK; // Getting the message content String messageContent = new String((byte[]) request.getContent()); logger .info("got INFO request with following content " + messageContent); int signalIndex = messageContent.indexOf("Signal="); // Playing file only if the DTMF session has been started if (messageContent != null && messageContent.length() > 0 && signalIndex != -1) { String signal = messageContent.substring("Signal=".length()).trim(); signal = signal.substring(0, 1); logger.info("Signal received " + signal); MediaGroup mediaGroup = (MediaGroup) request.getSession() .getAttribute("MediaGroup"); try { playDTMF(mediaGroup.getPlayer(), signal); } catch (MsControlException e) { logger.error( "Problem playing the stream corresponding to the following DTMF " + signal, e); responseCode = SipServletResponse.SC_SERVER_INTERNAL_ERROR; } } // sending response SipServletResponse response = request.createResponse(responseCode); response.send(); } /** * @param mg * @param dtmf * @throws MsControlException */ private void playDTMF(Player player, String dtmf) throws MsControlException { URI prompt = null; if (dtmf.equals("0")) { prompt = URI.create(DTMF_0); } else if (dtmf.equals("1")) { prompt = URI.create(DTMF_1); } else if (dtmf.equals("2")) { prompt = URI.create(DTMF_2); } else if (dtmf.equals("3")) { prompt = URI.create(DTMF_3); } else if (dtmf.equals("4")) { prompt = URI.create(DTMF_4); } else if (dtmf.equals("5")) { prompt = URI.create(DTMF_5); } else if (dtmf.equals("6")) { prompt = URI.create(DTMF_6); } else if (dtmf.equals("7")) { prompt = URI.create(DTMF_7); } else if (dtmf.equals("8")) { prompt = URI.create(DTMF_8); } else if (dtmf.equals("9")) { prompt = URI.create(DTMF_9); } else if (dtmf.equals("#")) { prompt = URI.create(POUND); } else if (dtmf.equals("*")) { prompt = URI.create(STAR); } else if (dtmf.equals("A")) { prompt = URI.create(A); } else if (dtmf.equals("B")) { prompt = URI.create(B); } else if (dtmf.equals("C")) { prompt = URI.create(C); } else if (dtmf.equals("D")) { prompt = URI.create(D); } else { throw new MsControlException("This DigitMap is not recognized " + dtmf); } player.play(prompt, null, null); } private class MyJoinEventListener implements JoinEventListener { public void onEvent(JoinEvent event) { MediaGroup mg = (MediaGroup) event.getThisJoinable(); if (event.isSuccessful()) { if (JoinEvent.JOINED == event.getEventType()) { // NC Joined to MG if (logger.isDebugEnabled()) { logger.debug("NC joined to MG. Start Player"); } try { Player player = mg.getPlayer(); player.addListener(new PlayerListener()); URI prompt = URI.create(WELCOME_MSG); player.play(prompt, null, null); } catch (MsControlException e) { logger.error(e); } } else if (JoinEvent.UNJOINED == event.getEventType()) { if (logger.isDebugEnabled()) { logger.debug("Un-Joined MG and NC"); } } } else { logger.error("Joining of MG and NC failed"); } } } private class PlayerListener implements MediaEventListener<PlayerEvent> { public void onEvent(PlayerEvent event) { logger.info("PlayerListener Received event " + event); Player player = event.getSource(); MediaGroup mg = player.getContainer(); if (!isBye) { if (event.isSuccessful() && (PlayerEvent.PLAY_COMPLETED == event.getEventType())) { logger.info("Received PlayComplete event"); try { SignalDetector sg = mg.getSignalDetector(); sg.addListener(new SignalDetectorListener()); sg.receiveSignals(1, null, null, null); } catch (MsControlException e) { logger.error(e); } } else { logger.error("Player didn't complete successfully "); } } } } class SignalDetectorListener implements MediaEventListener<SignalDetectorEvent> { public void onEvent(SignalDetectorEvent event) { try { MediaGroup mg = (MediaGroup) event.getSource().getContainer(); SignalDetector sg = mg.getSignalDetector(); sg.removeListener(this); if (event.isSuccessful() && (SignalDetectorEvent.SIGNAL_DETECTED == event .getEventType())) { String seq = event.getSignalString(); playDTMF(mg.getPlayer(), seq); } else { logger.error("DTMF detection failed "); } } catch (MsControlException e) { e.printStackTrace(); } } } }