73 lines
2.2 KiB
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();
|
|
}
|
|
}
|
|
|
|
} |