📄 vox.java
字号:
/*
* Created on 2006-3-8
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author 之诸暇
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import java.net.*;
import javax.sound.sampled.*;
public class Vox extends Thread{
public static final AudioFormat FORMAT = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, 16000.0f, 16, 1, 2, 16000.0f,true);
public static final int PORT = 5000;
private DatagramSocket socket = null;
private DatagramPacket packet = new DatagramPacket(new byte[]{1},1);
private InetAddress remote = null;
public Vox(String args) {
try {
if(args=="") {
System.out.println("Waiting for partner...");
socket = new DatagramSocket(PORT);
socket.receive(packet);
socket.connect(packet.getAddress(),PORT);
}
else {
socket = new DatagramSocket(PORT);
socket.connect(InetAddress.getByName(args),PORT);
}
}
catch (Exception exec) {
System.out.println("Exception creating connection:");
exec.printStackTrace(System.out);
}
System.out.println("Connected to partner...");
}
public void run(){
Record rec = new Record(socket);
Play ply = new Play(socket);
rec.start();
ply.start();
}
}
class Play implements Runnable
{
public final int BUFFER = 8000;
private SourceDataLine line = null;
private DatagramSocket connection = null;
private Thread thread = null;
public Play(DatagramSocket socket)
{
connection = socket;
}
public void start() {
thread = new Thread(this);
thread.setName("Play");
thread.start();
}
public void stop() {
thread = null; }
public void run() {
DataLine.Info info = new DataLine.Info(SourceDataLine.class, Vox.FORMAT);
try {
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(Vox.FORMAT, BUFFER);
}
catch (LineUnavailableException exec) {
System.out.println("Play: Audio Output not ready.\n"+exec.getMessage());
System.exit(5); }
catch (Exception exec) {
System.out.println("Play: Fatal Exception:\n"+exec.getMessage());
System.exit(6); }
line.start();
DatagramPacket packet = new DatagramPacket(new byte[65536],65536);
System.out.println("Play started...");
while (thread != null) {
try {
connection.receive(packet);
}
catch(Exception exec) {
System.out.println("Play: Exception receiving packet:\n"+exec.getMessage());
}
line.write(packet.getData(),0,packet.getLength());
packet = new DatagramPacket(new byte[65536],65536);
thread.yield(); }
line.stop();
line.flush();
line.close();
line = null;
}
}
class Record implements Runnable
{
private TargetDataLine line = null;
private DatagramSocket connection = null;
private InetAddress address= null;
private Thread thread = null;
public Record(DatagramSocket socket)
{
connection = socket;
address = connection.getInetAddress();
}
public void start()
{
thread = new Thread(this);
thread.setName("Record");
thread.start();
}
public void stop() {
thread = null; }
public void run() {
DataLine.Info info = new DataLine.Info(TargetDataLine.class, Vox.FORMAT);
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(Vox.FORMAT, line.getBufferSize());
}
catch (LineUnavailableException exec) {
System.out.println("Record: Audio Input not ready.\n"+exec.getMessage ());
System.exit(3); }
catch
(Exception exec) {
System.out.println("Record: Fatal Exception:\n"+exec.getMessage());
System.exit (4);
}
int frameSizeInBytes = Vox.FORMAT.getFrameSize ();
int bufferLengthInFrames = line.getBufferSize() / 8;
int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;
int minPacketSize = (int)(bufferLengthInBytes/1.5);
byte[] data;
int bytesAvailable;
line.start ();
System.out.println("Record started...");
while (thread != null) { // Send data only when we have a buffer of at least 50%
if ((bytesAvailable = line.available())>=minPacketSize)
{
data = new byte[bytesAvailable];
line.read(data,0,bytesAvailable);
try {
connection.send(new DatagramPacket(data,bytesAvailable));
}
catch(Exception exec) {
System.out.println("Record: Exception sending packet:\n"+exec.getMessage()); } }
try {
thread.sleep(50);
}
catch(InterruptedException exec) {
}
}
line.stop();
line.flush();
line.close();
line = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -