title: Streaming voice between Android Phones over WiFi
body: <p>I'm trying to stream audio from the mic from 1 Android to another over WiFi.
  After looking at some examples I made 2 applications with a single activity in each,  1 to capture and send audio and the other to receive.</p>
  
  <p>I've used the Audiorecord and Audiotrack classes to capture and play. However, i just hear some crackling sound (which has now stopped after i made some changes though i reverted back)</p>
  
  <p>The activity to send voice.      </p>
  
  <pre><code>public class VoiceSenderActivity extends Activity {
  
  private EditText target;
  private TextView streamingLabel;
  private Button startButton,stopButton;
  
  public byte[] buffer;
  public static DatagramSocket socket;
  private int port=50005;         //which port??
  AudioRecord recorder;
  
  //Audio Configuration. 
  private int sampleRate = 8000;      //How much will be ideal?
  private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;    
  private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
  
  private boolean status = true;
  
  
  
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  
      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);
  
      streamingLabel.setText("Press Start! to begin");
  
      startButton.setOnClickListener (startListener);
      stopButton.setOnClickListener (stopListener);
  }
  
  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[minBufSize];
  
                  Log.d("VS","Buffer created of size " + minBufSize);
                  DatagramPacket packet;
  
                  final InetAddress destination = InetAddress.getByName(target.getText().toString());
                  Log.d("VS", "Address retrieved");
  
  
                  recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize);
                  Log.d("VS", "Recorder initialized");
  
                  recorder.startRecording();
  
  
                  while(status == true) {
  
  
                      //reading data from MIC into buffer
                      minBufSize = recorder.read(buffer, 0, buffer.length);
  
                      //putting buffer in the packet
                      packet = new DatagramPacket (buffer,buffer.length,destination,port);
  
                      socket.send(packet);
  
  
                  }
  
  
  
              } catch(UnknownHostException e) {
                  Log.e("VS", "UnknownHostException");
              } catch (IOException e) {
                  Log.e("VS", "IOException");
              } 
  
  
          }
  
      });
      streamThread.start();
   }
   }
  </code></pre>
  
  <p>The activity to receive voice</p>
  
  <pre><code>public class VoiceReceiverActivity extends Activity {
  
  
  private Button receiveButton,stopButton;
  
  public static DatagramSocket socket;
  private AudioTrack speaker;
  
  //Audio Configuration. 
  private int sampleRate = 8000;      //How much will be ideal?
  private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;    
  private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
  
  private boolean status = true;
  
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  
      receiveButton = (Button) findViewById (R.id.receive_button);
      stopButton = (Button) findViewById (R.id.stop_button);
      findViewById(R.id.receive_label);
  
      receiveButton.setOnClickListener(receiveListener);
      stopButton.setOnClickListener(stopListener);
  
  }
  
  
  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() {
  
              try {
  
                  DatagramSocket socket = new DatagramSocket(50005);
                  Log.d("VR", "Socket Created");
  
  
                  byte[] buffer = new byte[256];
  
  
                  //minimum buffer size. need to be careful. might cause problems. try setting manually if any problems faced
                  int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
  
                  speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);
  
                  speaker.play();
  
                  while(status == true) {
                      try {
  
  
                          DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
                          socket.receive(packet);
                          Log.d("VR", "Packet Received");
  
                          //reading content from packet
                          buffer=packet.getData();
                          Log.d("VR", "Packet data read into buffer");
  
                          //sending data to the Audiotrack obj i.e. speaker
                          speaker.write(buffer, 0, minBufSize);
                          Log.d("VR", "Writing buffer content to speaker");
  
                      } catch(IOException e) {
                          Log.e("VR","IOException");
                      }
                  }
  
  
              } catch (SocketException e) {
                  Log.e("VR", "SocketException");
              }
  
  
          }
  
      });
      receiveThread.start();
  }
  
  }
  </code></pre>
  
  <p>I used wireshark to check if the packets are being sent and i can see the packets. The source however, is the MAC address of the sending device and destination too something like a physical address. Not sure if this is relevant though.</p>
  
  <p>So what's the problem with?</p>