import java.io.StreamCorruptedException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import org.xiph.speex.SpeexDecoder;
/**
* @author Erik Duijs
*/
public class AudioOutputListener implements AudioStreamListener {
private SourceDataLine line;
private boolean running;
private RawSpeexStream stream;
private AudioInputStream inputStream;
private SpeexDecoder decoder;
public AudioOutputListener() {
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16, 1, 2, 16000, false);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format, 8192);
decoder = new SpeexDecoder();
decoder.init(1, 16000, 1, false);
//stream = new RawSpeexStream();
//inputStream = new Speex2PcmAudioInputStream(stream, audioFormat, AudioSystem.NOT_SPECIFIED);
try {
line = (SourceDataLine) AudioSystem.getLine(info);
System.out.println("Sound initialized successfully.");
} catch (LineUnavailableException lue) {
System.err.println("Unavailable data line");
}
start();
}
public void start() {
try {
line.open();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
line.start();
}
/*
* (non-Javadoc)
*
* @see com.qiui.sound.AudioStreamListener#write(byte[])
*/
public void write(byte[] bytes) {
if (line.isOpen()) {
try {
decoder.processData(bytes, 0, bytes.length);
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] decoded = new byte[decoder.getProcessedDataByteSize()];
decoder.getProcessedData(decoded, 0);
line.write(decoded, 0, decoded.length);
}
}
public void stop() {
line.close();
}
}
It’s a class from a voice over IP applet that I did with darcone. The write(byte[]) method is called by the networking code and writes a stream of compressed sound data. It’s decoded using JSpeex and played back using javax.sound. You can do all DSP you like with the decoded sound data.