I am trying to install Peer to Peer to call sound on Android. I used an Android phone and tablet for communication, but after receiving about 40 packets, the phone almost stops receiving packets, and then suddenly receives several packets and plays them and so on, but this waiting time increases. Similarly, the tablet initially receives packets and plays them, but the lag increases, and the voice begins to collapse after a while, as if some packets were lost. Any idea that causes this problem ...
This is the code for the application ... I just pass the ip address of the sender and receiver in the RecordAudio class when it runs on two devices.
public class AudioRPActivity extends Activity implements OnClickListener { DatagramSocket socketS,socketR; DatagramPacket recvP,sendP; RecordAudio rt; PlayAudio pt; Button sr,stop,sp; TextView tv,tv1; File rf; boolean isRecording = false; boolean isPlaying = false; int frequency = 44100; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView)findViewById(R.id.text1); tv1 = (TextView)findViewById(R.id.text2); sr = (Button)findViewById(R.id.sr); sp = (Button)findViewById(R.id.sp); stop = (Button)findViewById(R.id.stop); sr.setOnClickListener(this); sp.setOnClickListener(this); stop.setOnClickListener(this); stop.setEnabled(false); try { socketS=new DatagramSocket(); socketR=new DatagramSocket(6000); } catch(SocketException se) { tv.setText(se.toString()); finish(); } } public void onClick(View v) { if(v == sr) record(); else if(v == sp) play(); else if(v == stop) stopPlaying(); } public void play() { stop.setEnabled(true); sp.setEnabled(false); pt = new PlayAudio(); pt.execute(); } public void stopPlaying() { isRecording=false; isPlaying = false; stop.setEnabled(false); } public void record() { stop.setEnabled(true); sr.setEnabled(false); rt = new RecordAudio(); rt.execute(); } private class PlayAudio extends AsyncTask<Void,String,Void> { @Override protected Void doInBackground(Void... arg0) { isPlaying = true; int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); byte[] audiodata = new byte[bufferSize]; try { AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,frequency,channelConfiguration, audioEncoding,4*bufferSize,AudioTrack.MODE_STREAM); audioTrack.setPlaybackRate(frequency); audioTrack.play(); while(isPlaying) { recvP=new DatagramPacket(audiodata,audiodata.length); socketR.receive(recvP); audioTrack.write(recvP.getData(), 0, recvP.getLength()); } audioTrack.stop(); audioTrack.release(); } catch(Throwable t) { Log.e("Audio Track","Playback Failed"); } return null; } protected void onProgressUpdate(String... progress) { tv1.setText(progress[0].toString()); } protected void onPostExecute(Void result) { sr.setEnabled(true); sp.setEnabled(true); } } private class RecordAudio extends AsyncTask<Void,String,Void> { @Override protected Void doInBackground(Void... arg0) { isRecording = true; try { int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelConfiguration ,audioEncoding,4*bufferSize); byte[] buffer = new byte[bufferSize]; audioRecord.startRecording(); int r=0; while(isRecording) { int brr = audioRecord.read(buffer,0,bufferSize); sendP=new DatagramPacket(buffer,brr,InetAddress.getByName("sender's/receiver ip"),6000); socketS.send(sendP); publishProgress(String.valueOf(r)); r++; } audioRecord.stop(); audioRecord.release(); } catch(Throwable t) { Log.e("AudioRecord","Recording Failed...."); } return null; } protected void onProgressUpdate(String... progress) { tv.setText(progress[0].toString()); } protected void onPostExecute(Void result) { sr.setEnabled(true); sp.setEnabled(true); } } }