title: Java Multithreading for IVRS with GSM Modem rxtx (playing voice file making event listener stop working)
body: <p>I have implemented a program to receive call using gsm modem. Upon Detecting <strong>"RING"</strong> call is answered an audio clip is played by calling  a function from inside DATA_AVAILABLE EVENT HANDLER. But the event handler stops working after this. After the audio is complete Event Handler does not show any data received event anymore.</p>
  
  <p>Why does the event listener stops working. Am I doing it wrong by playing the audio from inside the event handler? I was thinking about setting a variable true or false from inside data_received event handler  and create custom event handler to listen to change to that variable to do playback of audio can these both work simultaneously in anyway?</p>
  
  <p>How to create a multi threading solution So that Serial I/O is not interrupted and Audio Playback and Audio Sampling Can be done in a synchronised manner to detect dtmf tones.
  Is there any way that serial port events can be listened to constantly without interruption and run a function for audio sampling and audio playback at specific time</p>
  
  <h2>Call Accepted in this case of switch and thread is started inside play() function</h2>
  
  <pre><code> case SerialPortEvent.DATA_AVAILABLE:
  
         StringBuffer sb = new StringBuffer();
         byte[] readBuffer = new byte[2048];
         try {
           while (inputStream.available() &gt; 0) 
           {
             int numBytes = inputStream.read(readBuffer);
             sb.append(new String(readBuffer,0,numBytes));
             System.out.println(numBytes);
             System.out.println(sb);
           }
           System.out.println("Data Available");   
  
           if((sb.toString()).contains("RING")){
              System.out.println("Enter Inside if RING Loop");   
              //play();
              send("ATA\r\n");
  
              //welcomeMessage();
           }
  
           if((sb.toString()).contains("CARRIER")){
  
                    hangup();
                    //Thread.sleep(1000);
                    closePort();
                    outCommand();
                    System.out.println("Enter Inside if NO CARRIER Loop");   
           }
           //print response message
           System.out.print(sb.toString());
         } catch (IOException  e) {
         }
  
         break;
  </code></pre>
  
  <hr>
  
  <pre><code> public void play() {
          try {
              new Thread() {
                  public void run() {
                      for(int i=0;i&lt;1;i++)
                         welcomeMessage();
                  }
              }.start();
          } catch (Throwable e) {
              e.printStackTrace();
          }
      }
  </code></pre>
  
  <h2>Full Code</h2>
  
  <pre><code>package sample;
  
  import java.io.*;
  import java.util.*;
  import javax.sound.sampled.*;
  import javazoom.jl.player.*;
  import java.io.FileInputStream;
  import gnu.io.*;
  import java.io.*;
  import javax.sound.sampled.AudioInputStream;
  import javax.sound.sampled.AudioSystem;
  import javax.sound.sampled.Clip;
  import javax.sound.sampled.LineUnavailableException;
  import javax.sound.sampled.UnsupportedAudioFileException;
  import org.apache.log4j.chainsaw.Main;
  import sun.audio.*;
  
  public class GSMConnect implements SerialPortEventListener, 
   CommPortOwnershipListener {
  
   private static String comPort = "COM3"; // This COM Port must be connect with GSM Modem or your mobile phone
   private String messageString = "";
   private CommPortIdentifier portId = null;
   private Enumeration portList;
   private InputStream inputStream = null;
   private OutputStream outputStream = null;
   private SerialPort serialPort;
   String readBufferTrial = "";
   /** Creates a new instance of GSMConnect */
   public GSMConnect(String comm) {
  
     this.comPort = comm;
  
   }
  
   public boolean init() {
     portList = CommPortIdentifier.getPortIdentifiers();
     while (portList.hasMoreElements()) {
       portId = (CommPortIdentifier) portList.nextElement();
       if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
         if (portId.getName().equals(comPort)) {
             System.out.println("Got PortName");
           return true;
         }
       }
     }
     return false;
   }
  
   public void checkStatus() {
     send("AT+CREG?\r\n");
   }
  
   public void dial(String phoneNumber) {
     try {
  //dial to this phone number
  
       messageString = "ATD" + phoneNumber + ";\r\n";
       outputStream.write(messageString.getBytes());
       System.out.println("Called ");
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
  
   public void send(String cmd) {
     try {
       outputStream.write(cmd.getBytes());
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
  
   public void sendMessage(String phoneNumber, String message) {
         char quotes ='"';
     send("AT+CMGS="+quotes + phoneNumber +quotes+ "\r\n");
     try {
      Thread.sleep(2000);
  } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
  }
      //   send("AT+CMGS=\""+ phoneNumber +"\"\r\n");
     send(message + '\032');
     System.out.println("Message Sent");
   }
  
   public void hangup() {
     send("ATH\r\n");
   }
   public void welcomeMessage(){
  
       // open the sound file as a Java input stream
          String gongFile = "C:\\Users\\XXXX\\Desktop\\1-welcome.wav";
  
          }*/
          try{
  
              FileInputStream fis = new FileInputStream("C:\\Users\\XXXX\\Desktop\\7001110.mp3");
              Player playMP3 = new Player(fis);
  
              playMP3.play();
              System.out.print("welcomeMessage() Read");
              }catch(Exception e){
  
                  System.out.println(e);
  
              }
   }
  
   public void play() {
          try {
              new Thread() {
                  public void run() {
                      for(int i=0;i&lt;1;i++)
                         welcomeMessage();
                  }
              }.start();
          } catch (Throwable e) {
              e.printStackTrace();
          }
      }
   public void connect() throws NullPointerException {
     if (portId != null) {
       try {
         portId.addPortOwnershipListener(this);
  
         serialPort = (SerialPort) portId.open("MobileGateWay", 2000);
         serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
       } catch (PortInUseException | UnsupportedCommOperationException e) {
         e.printStackTrace();
       }
  
       try {
         inputStream = serialPort.getInputStream();
         outputStream = serialPort.getOutputStream();
  
       } catch (IOException e) {
         e.printStackTrace();
       }
  
       try {
         /** These are the events we want to know about*/
         serialPort.addEventListener(this);
         serialPort.notifyOnDataAvailable(true);
         serialPort.notifyOnRingIndicator(true);
  
       } catch (TooManyListenersException e) {
         e.printStackTrace();
       }
  
  //Register to home network of sim card
  
       send("ATZ\r\n");
  
     } else {
       throw new NullPointerException("COM Port not found!!");
     }
   }
  
   public void serialEvent(SerialPortEvent serialPortEvent) {
      System.out.println("serialPortEvent.getEventType()"+serialPortEvent.getEventType()); 
     switch (serialPortEvent.getEventType()) {
       case SerialPortEvent.BI:
       case SerialPortEvent.OE:
       case SerialPortEvent.FE:
       case SerialPortEvent.PE:
       case SerialPortEvent.CD:
       case SerialPortEvent.CTS:
       case SerialPortEvent.DSR:
       case SerialPortEvent.RI:
          // System.out.println("Ringing");
            if( serialPortEvent.getNewValue() ) 
            {
                System.out.println("Ring Indicator On");
            }
            else 
            {
                System.out.println("Ring Indicator Off");
            }
  
            break;
  
  
  
       case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
       case SerialPortEvent.DATA_AVAILABLE:
  
         StringBuffer sb = new StringBuffer();
         byte[] readBuffer = new byte[2048];
         try {
           while (inputStream.available() &gt; 0) 
           {
             int numBytes = inputStream.read(readBuffer);
             sb.append(new String(readBuffer,0,numBytes));
             System.out.println(numBytes);
             System.out.println(sb);
           }
           System.out.println("Data Available");   
  
           if((sb.toString()).contains("RING")){
              System.out.println("Enter Inside if RING Loop");   
              //play();
              send("ATA\r\n");
  
              //welcomeMessage();
           }
  
           if((sb.toString()).contains("CARRIER")){
  
                    hangup();
                    //Thread.sleep(1000);
                    closePort();
                    outCommand();
                    System.out.println("Enter Inside if NO CARRIER Loop");   
           }
           //print response message
           System.out.print(sb.toString());
         } catch (IOException  e) {
         }
  
         break;
     }
   }
  
   public void outCommand(){
       System.out.print(readBufferTrial);
   }
   public void ownershipChange(int type) {
     switch (type) {
       case CommPortOwnershipListener.PORT_UNOWNED:
         System.out.println(portId.getName() + ": PORT_UNOWNED");
         break;
       case CommPortOwnershipListener.PORT_OWNED:
         System.out.println(portId.getName() + ": PORT_OWNED");
         break;
       case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
         System.out.println(portId.getName() + ": PORT_INUSED");
         break;
     }
   }
   public void closePort(){
  
      serialPort.close(); 
   }
  
   public static void main(String args[]) {
     GSMConnect gsm = new GSMConnect(comPort);
     if (gsm.init()) {
       try {
           System.out.println("Initialization Success");
         gsm.connect();
         Thread.sleep(5000);
         gsm.checkStatus();
         Thread.sleep(5000);
     //   System.out.println("Before Auto Answer");
       //  gsm.send("ATS0=5");
      //   gsm.dial("87XXXXXSS");
     //    Thread.sleep(7500);
       //  System.out.println("After Auto Answer set");
  
      //   gsm.sendMessage("8XXXXXS56", "Trial Success Call me");
      //   gsm.sendMessage("80XXXXS56", "Trial Success Call me");
      //   gsm.sendMessage("8XXXXSXS6", "Trial Success Call me");
      //   Thread.sleep(5000);
       //   gsm.sendMessage("+919XXXXXXS3", "Third Msg");
       //  Thread.sleep(1000);
       //  gsm.dial("9XXXXS773");
      //   gsm.dial("871XXXXS5");
       //  Thread.sleep(1000);
       //  gsm.welcomeMessage();
      //   Thread.sleep(1000);
       //  gsm.welcomeMessage();// for turning on Echo ATE1&amp;W
  
       //  Thread.sleep(20000);
        // welcomeMessage();
  
       //  gsm.hangup();
       //  Thread.sleep(1000);
       //  gsm.closePort();
       //  gsm.outCommand();
        // System.exit(1);
  
       } catch (Exception e) {
         e.printStackTrace();
       }
     } else {
       System.out.println("Can't init this card");
     }
   }
  }
  </code></pre>