import java.net.*; import javax.sound.sampled.*; public class Phone { private static final AudioFormat FORMAT = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0f, 16, 1, 2, 8000.0f, true); private static final int PORT = 6000; private DatagramSocket socket = null; public static void main(String[] args) { new Phone(args); } public Phone(String[] args) { try { if (args.length == 0) { System.out.println("Waiting!"); socket = new DatagramSocket(PORT); DatagramPacket packet = new DatagramPacket(new byte[]{1}, 1); socket.receive(packet); socket.connect(packet.getAddress(), PORT); } else { socket = new DatagramSocket(PORT); socket.connect(InetAddress.getByName(args[0]), PORT); } } catch(Exception e) { System.out.println(e); } System.out.println("Connected!"); new Recorder(); new Player(); } class Recorder extends Thread { public Recorder() { start(); } public void run() { DataLine.Info info = new DataLine.Info(TargetDataLine.class, Phone.FORMAT); TargetDataLine line = null; try { line = (TargetDataLine)AudioSystem.getLine(info); line.open(Phone.FORMAT, line.getBufferSize()); } catch (Exception e) { System.out.println(e); } line.start(); System.out.println("Record started!"); int frameSizeInBytes = Phone.FORMAT.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; int minPacketSize = (int)(bufferLengthInBytes / 1.5); int bytesAvailable = 0; while(true) { // Send data only when we have a buffer of at least 50% if ((bytesAvailable = line.available()) >= minPacketSize) { byte[] data = new byte[bytesAvailable]; line.read(data, 0, bytesAvailable); try { socket.send(new DatagramPacket(data, bytesAvailable)); } catch(Exception e) { System.out.println(e); } } } } } class Player extends Thread { private final int BUFFER = 8000; private final int PACKET_SIZE = 65536; public Player() { start(); } public void run() { DataLine.Info info = new DataLine.Info(SourceDataLine.class, Phone.FORMAT); SourceDataLine line = null; try { line = (SourceDataLine)AudioSystem.getLine(info); line.open(Phone.FORMAT, BUFFER); } catch(Exception e) { System.out.println(e); } line.start(); System.out.println("Play started!"); while(true) { try { DatagramPacket packet = new DatagramPacket(new byte[PACKET_SIZE], PACKET_SIZE); socket.receive(packet); line.write(packet.getData(), 0, packet.getLength()); } catch(Exception e) { System.out.println(e); } } } } }