title: Streaming voice between server and client in android
body: <p>I'm developing a voice chat between two android device. Client side works very well but server side is crashing. </p>
  
  <p>I've changed sample rate array size but it's still crashing. As soon as client connects to server,server crashes.</p>
  
  <p><strong>client :</strong></p>
  
  <pre><code>package com.example.client;
  
  import android.os.Build;
  import android.os.Bundle;
  import android.os.StrictMode;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.annotation.SuppressLint;
  import android.annotation.TargetApi;
  import android.app.Activity;
  
  import java.io.IOException;
  import java.net.DatagramPacket;
  import java.net.DatagramSocket;
  import java.net.InetAddress;
  import java.net.SocketException;
  import java.net.UnknownHostException;
  
  import android.content.Context;
  import android.content.DialogInterface;
  import android.media.AudioFormat;
  import android.media.AudioManager;
  import android.media.AudioRecord;
  import android.media.AudioTrack;
  import android.media.MediaRecorder;
  import android.util.Base64;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.TextView;
  
  
  @TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressLint("NewApi") public class MainActivity extends Activity {
  
  private EditText target,target_port;
  private TextView streamingLabel;
  private Button startButton,stopButton;
  
  public byte[] buffer;
  public static DatagramSocket socket;
  private int port=50005;        
  AudioRecord recorder;
  
  //AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
  
  private int sampleRate =8000;//Integer.parseInt(audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
  private int channelConfig = AudioFormat.CHANNEL_IN_MONO;    
  private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
  
  private boolean status = true;
  
  
  
  @SuppressLint("NewApi") @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      if (android.os.Build.VERSION.SDK_INT &gt; 9) {
          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);
      }
  
  
      target = (EditText) findViewById (R.id.target_IP);
      streamingLabel = (TextView) findViewById(R.id.streaming_label);
      startButton = (Button) findViewById (R.id.start_button);
      stopButton = (Button) findViewById (R.id.stop_button);
      target_port=(EditText) findViewById(R.id.target_Port);
      streamingLabel.setText("Press Start! to begin");
  
      startButton.setOnClickListener (startListener);
      stopButton.setOnClickListener (stopListener);
      target.setText("192.168.1.100");
      target_port.setText("50005");
  
     // AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    //  String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
    //  String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
    //  Log.d("Buffer Size and sample rate", "Size :" + size + " &amp; Rate: " + rate);
  }
  
  private final OnClickListener stopListener = new OnClickListener() {
  
      @Override
      public void onClick(View arg0) {
                  status = false;
                  recorder.release();
                  Log.d("VS","Recorder released");
      }
  
  };
  
  private final OnClickListener startListener = new OnClickListener() {
  
      @Override
      public void onClick(View arg0) {
                  status = true;
                  startStreaming();           
      }
  
  };
  
  public void startStreaming() {
  
  
      Thread streamThread = new Thread(new Runnable() {
  
          @Override
          public void run() {
              try {
  
  
                  int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
                  DatagramSocket socket = new DatagramSocket();
                  Log.d("VS", "Socket Created");
  
                  byte[] buffer = new byte[512];
  
                  Log.d("VS","Buffer created of size " + minBufSize);
                  DatagramPacket packet;
  
                  final InetAddress destination = InetAddress.getByName(target.getText().toString());
                  Log.d("VS", "Address retrieved");
  
                  if (minBufSize != AudioRecord.ERROR_BAD_VALUE) {
                      recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,sampleRate,channelConfig,audioFormat,minBufSize);
                  Log.d("VS", "Recorder initialized");
                  if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                      recorder.startRecording();}
  
  
                  while(status == true) {
  
  
                      //reading data from MIC into buffer
                      minBufSize = recorder.read(buffer, 0, buffer.length);
  
                      //encoding to base64
                   // String buffer1= Base64.encodeToString(buffer, Base64.DEFAULT);
  
                      //putting buffer in the packet
                      port=Integer.parseInt(target_port.getText().toString());
                      packet = new DatagramPacket (buffer,buffer.length,destination,port);
                      System.out.print(buffer);
                      Log.d("", "BUFERRRR");
                      socket.send(packet);
  
  
                  }
  
              } catch(UnknownHostException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  Log.e("IOException message:",e.getMessage().toString());
  
  
              } 
  
  
          }
  
      });
      streamThread.start();
   }
   }
  </code></pre>
  
  <p><strong>Server :</strong> </p>
  
  <pre><code>package com.example.server;
  
  import android.os.Build;
  import android.os.Bundle;
  import android.os.StrictMode;
  import android.annotation.SuppressLint;
  import android.annotation.TargetApi;
  import android.app.Activity;
  import java.io.IOException;
  import java.net.DatagramPacket;
  import java.net.DatagramSocket;
  import java.net.SocketException;
  import android.content.Context;
  import android.media.AudioFormat;
  import android.media.AudioManager;
  import android.media.AudioRecord;
  import android.media.AudioTrack;
  import android.media.MediaRecorder;
  import android.util.Base64;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.TextView;
  
  
  @TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressLint("NewApi") public class MainActivity extends Activity {
  
  
  private Button receiveButton,stopButton;
  private TextView recive;
  private EditText port;
  public static DatagramSocket socket;
  private AudioTrack speaker;
  private int port_num=50005;
  
  
  
  private int sampleRate =44100;//Integer.parseInt(audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));   
  private int channelConfig =  AudioFormat.CHANNEL_OUT_MONO;    
  private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
  int minBufSize =AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
  byte[] buffer;  //256
  
  private boolean status = true;
  
  
  
  @SuppressLint("NewApi") @TargetApi(Build.VERSION_CODES.GINGERBREAD) @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      setContentView(R.layout.activity_main);
      if (android.os.Build.VERSION.SDK_INT &gt; 9) {
          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);
      }
  
  
      receiveButton = (Button) findViewById (R.id.receive_button);
      stopButton = (Button) findViewById (R.id.stop_button);
      recive= (TextView) findViewById(R.id.receive_label);
      receiveButton.setOnClickListener(receiveListener);
      stopButton.setOnClickListener(stopListener);
      port=(EditText) findViewById(R.id.editText1);
  
     //AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    //  sampleRate =Integer.parseInt( audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
  }
  
  
  private final OnClickListener stopListener = new OnClickListener() {
  
      @Override
      public void onClick(View v) {
          status = false;
  
          speaker.release();
          Log.d("VR","Speaker released");
  
      }
  
  };
  
  
  private final OnClickListener receiveListener = new OnClickListener() {
  
      @Override
      public void onClick(View arg0) {
          status = true;
  
  
          startReceiving();
  
      }
  
  };
  
  public void startReceiving() {
  
      Thread receiveThread = new Thread (new Runnable() {
  
          @Override
          public void run() {
  
  
  
                         buffer= new byte[1024];
                          DatagramSocket socket = null;
  
                          try {
                              socket = new DatagramSocket(50005);
                              Log.d("VR", "Socket Created");
  
                              if (minBufSize != AudioRecord.ERROR_BAD_VALUE) {
                              speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,1024,AudioTrack.MODE_STREAM);
                              if (speaker.getState() == AudioRecord.STATE_INITIALIZED)
                              speaker.play();}
                              while(status == true) {
  
                                  DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
  
                                  socket.receive(packet);
                                  Log.d("VR", "Packet Received");
  
  
                                  buffer=packet.getData();
                                  Log.d("VR", "Packet data read into buffer");
  
                                 buffer= Base64.decode(buffer, Base64.DEFAULT);
                                  speaker.write(buffer, 0, minBufSize);
                                  Log.d("VR", "Writing buffer content to speaker");
                          }
  
                          } catch (SocketException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                          } catch (IOException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                          }
  
  
  
  
                  }
  
      });
      receiveThread.start();
  }}
  </code></pre>
  
  <p>Please help me to resolve this.</p>