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.Recorder; import javax.media.mscontrol.networkconnection.NetworkConnection; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.sip.ServletTimer; import javax.servlet.sip.SipApplicationSession; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipSession; import javax.servlet.sip.TimerListener; import javax.servlet.sip.TimerService; import org.apache.log4j.Logger; /** * * @author amit bhayani * */ public class PromptAndRecordServlet extends PlayerServlet implements TimerListener { private static final long serialVersionUID = 1L; private static Logger logger = Logger .getLogger(PromptAndRecordServlet.class); private final static String WELCOME_MSG = "http://" + System.getProperty("jboss.bind.address", "127.0.0.1") + ":8080/media-jsr309-servlet/audio/record_welcome.wav"; private static final int RECORDING_DELAY = 30000; private final static String RECORDER = "test.wav"; // private final String RECORDED_FILE = "file://" + // System.getProperty("jboss.server.data.dir") + "/" + RECORDER; @Override public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); } @Override protected void doAck(SipServletRequest req) throws ServletException, IOException { SipSession sipSession = req.getSession(); MediaSession ms = (MediaSession) sipSession .getAttribute("MEDIA_SESSION"); try { MediaGroup mg = ms .createMediaGroup(MediaGroup.PLAYER_RECORDER_SIGNALDETECTOR); mg.addListener(new MyJoinEventListener()); NetworkConnection nc = (NetworkConnection) sipSession .getAttribute("NETWORK_CONNECTION"); mg.joinInitiate(Direction.DUPLEX, nc, this); } catch (MsControlException e) { logger.error(e); // Clean up media session terminate(sipSession, ms); } } @Override protected void doBye(SipServletRequest request) throws ServletException, IOException { MediaGroup mediaGroup = (MediaGroup) request.getSession().getAttribute( "MEDIA_GROUP"); if (mediaGroup != null) { logger.info("Bye received, stopping the recording"); try { mediaGroup.getRecorder().stop(); } catch (MsControlException e) { logger.info("recording couldn't be stopped", e); } } super.doBye(request); } public void timeout(ServletTimer servletTimer) { String sessionId = (String) servletTimer.getInfo(); logger.info("Timer fired on sip session " + sessionId); SipSession sipSession = servletTimer.getApplicationSession() .getSipSession(sessionId); if (sipSession != null) { MediaGroup mediaGroup = (MediaGroup) sipSession .getAttribute("MEDIA_GROUP"); if (mediaGroup != null) { logger.info("Timer fired, stopping the recording"); try { mediaGroup.getRecorder().stop(); } catch (MsControlException e) { logger.info("recording couldn't be stopped", e); } } } else { logger .info("the session has not been found, it may have been already invalidated"); } } private class MyJoinEventListener implements JoinEventListener { public void onEvent(javax.media.mscontrol.join.JoinEvent event) { MediaGroup mg = (MediaGroup) event.getThisJoinable(); if (event.isSuccessful()) { if (JoinEvent.JOINED == event.getEventType()) { // NC Joined to MG 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) { Player player = event.getSource(); MediaGroup mg = player.getContainer(); if (!isBye) { if (event.isSuccessful() && (PlayerEvent.PLAY_COMPLETED == event.getEventType())) { MediaSession mediaSession = event.getSource() .getMediaSession(); SipSession sipSession = (SipSession) mediaSession .getAttribute("SIP_SESSION"); sipSession.setAttribute("MEDIA_GROUP", mg); SipApplicationSession sipAppSession = sipSession .getApplicationSession(); try { Recorder recoredr = mg.getRecorder(); logger.info("recording the user at " + RECORDER); URI prompt = URI.create(RECORDER); recoredr.record(prompt, null, null); TimerService timer = (TimerService) getServletContext() .getAttribute(TIMER_SERVICE); timer.createTimer(sipAppSession, RECORDING_DELAY, false, sipSession.getId()); } catch (MsControlException e) { logger.error("An unexpected error happened ", e); } } else { logger.error("Player didn't complete successfully "); } } } } }