import java.io.*; import javax.sound.sampled.*; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.AudioFileTypes; public class SoundPlayer { private AudioFormat.Encoding encoding1 = AudioFormat.Encoding.PCM_SIGNED; private AudioFormat.Encoding encoding2 = Encodings.getEncoding("GSM0610");; private AudioFileFormat.Type fileType = AudioFileTypes.getType("GSM", ".gsm");; private AudioFormat format1 = new AudioFormat(encoding1, 8000.0F, 16, 1, 2, 8000.0F, false); private DataLine.Info info; private SourceDataLine lineOut; private ByteArrayOutputStream out; public synchronized void play(Storage storage) { try { out = new ByteArrayOutputStream(); out.write(storage.getData(), 0, storage.getData().length); } catch (Exception e) { System.err.println("Player I/O problems: " + e); } try { byte[] audio = out.toByteArray(); InputStream input = new ByteArrayInputStream(audio); AudioInputStream aisTmp = AudioSystem.getAudioInputStream(input); AudioInputStream ais = AudioSystem.getAudioInputStream(format1, aisTmp); info = new DataLine.Info(SourceDataLine.class, format1); lineOut = (SourceDataLine)AudioSystem.getLine(info); lineOut.open(format1); lineOut.start(); new Player(ais); } catch (Exception e) { System.err.println("Player: Line unavailable: " + e); System.exit(-4); } } class Player extends Thread { AudioInputStream ais = null; int bufferSize = (int)format1.getSampleRate() * format1.getFrameSize(); byte buffer[] = new byte[bufferSize]; public Player(AudioInputStream ais) { this.ais = ais; start(); } public synchronized void run() { try { int count = 0; while ((count = ais.read(buffer, 0, buffer.length)) != -1) { if (count > 0) { lineOut.write(buffer, 0, count); } } lineOut.drain(); //EX lineOut.close(); } catch (IOException e) { System.err.println("I/O problems: " + e); System.exit(-3); } } } }