/** @param call @Override */
 public void onStatusChanged(Call call) {
   try {
     MgcpCallTerminal term = (MgcpCallTerminal) call;
     LOGGER.debug(" for CallControlProperties:" + props + " " + call.toString());
     if ((Call.Status.COMPLETED == call.getStatus() || Call.Status.IN_PROGRESS == call.getStatus())
         && term.getIVREndPointState() == MgcpIvrEndpoint.IDLE
         && (term.getIVREndPointOldState() == MgcpIvrEndpoint.PLAY
             || term.getIVREndPointOldState() == MgcpIvrEndpoint.PLAY_COLLECT
             || term.getIVREndPointOldState() == MgcpIvrEndpoint.PLAY_RECORD)) {
       JVoiceXmlRecordResult result = new JVoiceXmlRecordResult();
       long duration = (long) props.getGenProperties(JVoiceXmlRecordResult.DURATION);
       result.setDuration(duration);
       if (duration >= JVoiceXmlRecordResult.DEFAULT_RECORDING_MAXTIME) result.setMAXTIME("true");
       else result.setMAXTIME("false");
       result.setTermchar((String) props.getGenProperties(JVoiceXmlRecordResult.TERMCHAR));
       result.setSize(-1);
       final JVoiceXMLEvent event = new RecordingEvent(null);
       ((RecordingEvent) event).setInputResult(result);
       EventHandler handler = (EventHandler) props.getGenProperties("EventHandler");
       handler.notifyEvent(event);
     }
   } catch (Exception ex) {
     ExLog.exception(LOGGER, ex);
   }
 }
 /** {@inheritDoc} */
 public void disconnect(final ConnectionInformation info) {
   LOGGER.info(".. with ConnectionInformation:" + info);
   final MobicentsConnectionInformation vnxivrInfo = (MobicentsConnectionInformation) info;
   terminal = vnxivrInfo.getTerminal();
   terminal.disconnect();
   terminal.removeListener(this);
 }
 /**
  * {@inheritDoc}
  *
  * <p>This implementation uses {@link SynthesizedOutput#getUriForNextSynthesisizedOutput()} to
  * obtain a URI that is being used to stream to the terminal.
  *
  * <p>Although this terminal is the source where to stream the audio this implementation makes no
  * assumptions about the URI. In most cases this will be related to the {@link SpokenInput}
  * implementation. In the simplest case this implementation <emph>invents</emph> a unique URI.
  */
 public void play(final SynthesizedOutput output, final CallControlProperties props)
     throws NoresourceError, IOException {
   try {
     if (terminal == null) {
       throw new NoresourceError("No active telephony connection!");
     }
     URI uri = null;
     try {
       LOGGER.debug("status of the terminal " + terminal);
       // checking termnal status before play
       if ((terminal.getIVREndPointState() == MgcpIvrEndpoint.PLAY
               || terminal.getIVREndPointState() == MgcpIvrEndpoint.PLAY_COLLECT
               || terminal.getIVREndPointState() == MgcpIvrEndpoint.PLAY_RECORD)
           && terminal.getIVREndPointState() != MgcpIvrEndpoint.STOP) {
         LOGGER.debug("canceling current playing....  ");
         //                    terminal.stopMedia();
       }
       uri = output.getUriForNextSynthesisizedOutput();
     } catch (URISyntaxException e) {
       throw new IOException(e.getMessage(), e);
     }
     LOGGER.debug("playing URI '" + uri + "'" + " CallControlProperties: " + props);
     terminal.play(uri, 1);
     terminal.addObserver((MobicentsSynthesizedOutput) output);
     //            terminal.play(new
     // URI("http://192.168.146.146:8080/VNXIVR/audio/dtmf_welcome.wav"), 1);
     //            Thread.sleep(10000);
   } catch (Exception ex) {
     ExLog.exception(LOGGER, ex);
   }
 }
 /** {@inheritDoc} */
 public void startRecording(
     final SpokenInput input, final OutputStream stream, final CallControlProperties props)
     throws NoresourceError, IOException {
   LOGGER.debug("with input:" + input + " stream:" + stream + " props:" + props);
   if (terminal == null) {
     throw new NoresourceError("No active telephony connection!");
   }
   this.props = props;
   terminal.addObserver(this);
   // adding observer this
   terminal.recordAfterBeep((long) props.getGenProperties(JVoiceXmlRecordResult.DURATION));
 }
 /** {@inheritDoc} */
 public void stopRecording() throws NoresourceError {
   if (terminal == null) {
     throw new NoresourceError("No active telephony connection!");
   }
   LOGGER.debug(" ...");
   terminal.stopMedia();
 }
  /** {@inheritDoc} */
  public void stopPlay() throws NoresourceError {
    if (terminal == null) {
      throw new NoresourceError("No active telephony connection!");
    }
    LOGGER.info("hangup the terminal:" + terminal);
    terminal.stopMedia();
    //        terminal.hangup();

  }
 /** {@inheritDoc} */
 public void connect(final ConnectionInformation info) throws IOException {
   LOGGER.info(".. with ConnectionInformation:" + info);
   final MobicentsConnectionInformation vnxivrInfo = (MobicentsConnectionInformation) info;
   terminal = vnxivrInfo.getTerminal();
   terminal.addListener(this);
 }