package call;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class CallThread extends AbstractCallConnection implements Runnable {
private final Socket socket;
private final long time;
private final List<String> headers;
private CallRecorder out;
private CallPlayer in;
public CallThread(Contact contact, Socket socket, List<String> headers) {
super(contact);
this.socket = socket;
this.time = System.currentTimeMillis();
this.headers = headers;
}
@Override
public void run() {
try {
OutputStream outstream = socket.getOutputStream();
out = new CallRecorder(contact, outstream);
out.saveTo(new CallCapture(time, contact, "output"));
new Thread(out, "CallThread -> CallRecorder").start();
PcmFormat format = SocketUtil.extractFormat(headers);
int buffersize = 16 * 1024;
if (buffersize < format.getByterate() / 15) {
buffersize = (int) (format.getByterate() / 15);
}
if (buffersize > format.getByterate() / 10) {
buffersize = (int) (format.getByterate() / 10);
}
if (buffersize < 4096) {
buffersize = 4096;
}
InputStream instream = socket.getInputStream();
in = new CallPlayer(contact, new BufferedInputStream(instream), format, buffersize);
in.saveTo(new CallCapture(time, contact, "input"));
new Thread(in, "CallThread -> CallPlayer").start();
} catch (LineUnavailableException | UnsupportedAudioFileException e) {
e.printStackTrace();
CallFactory.closeCall(contact);
} catch (IOException e) {
e.printStackTrace();
CallFactory.closeCall(contact);
} catch (UnknownDefaultValueException e) {
e.printStackTrace();
CallFactory.closeCall(contact);
}
}
@Override
public void onCallClose() {
try {
socket.close();
} catch (IOException e) {}
super.onCallClose();
}
public Socket getSocket() {
return socket;
}
@Override
public String getId() {
return "CallThread<" + contact.getId() + ">";
}
}