RealTimeTalk/app/src/main/java/com/smarthomies/realtimetalk/utils/SocketAudioPlayer.java

73 lines
2.2 KiB
Java

package com.smarthomies.realtimetalk.utils;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.util.Log;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
public class SocketAudioPlayer implements Runnable {
private static final String TAG = SocketAudioPlayer.class.getSimpleName();
private int playBufSize;
private AudioTrack audioTrack;
private boolean isPlaying;
private Socket socket;
private CountDownLatch completionLock;
private int noDataCounter = 0;
public SocketAudioPlayer(Socket socket, int frequency, int channelConfiguration, int audioEncoding, final CountDownLatch countDownLatch) {
this.socket = socket;
playBufSize=AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);
audioTrack.setStereoVolume(1f, 1f);
this.completionLock = countDownLatch;
}
@Override
public void run() {
try {
Log.d(TAG, "Start!");
byte[] buffer = new byte[playBufSize];
audioTrack.play();
isPlaying = true;
while (isPlaying) {
int readSize = 0;
try {
readSize = socket.getInputStream().read(buffer);
Log.d(TAG, "Received " + readSize + " bytes");
if(readSize <= 0) {
noDataCounter++;
} else {
noDataCounter = 0;
}
if(noDataCounter == 10) {
break;
}
} catch (IOException e) {
e.printStackTrace();
isPlaying = false;
break;
}
audioTrack.write(buffer, 0, readSize);
}
audioTrack.stop();
audioTrack.flush();
} finally {
Log.d(TAG, "Done!");
completionLock.countDown();
}
}
}