import java.io.*; import javax.sound.sampled.*; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.AudioFileTypes; public class SoundRecorder { 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 TargetDataLine lineIn; private ByteArrayOutputStream out; Client client = null; public SoundRecorder(Client client) { this.client = client; } public synchronized void record() { try { info = new DataLine.Info(TargetDataLine.class, format1); lineIn = (TargetDataLine)AudioSystem.getLine(info); lineIn.open(format1); lineIn.start(); new Recorder(); } catch (LineUnavailableException e) { System.err.println("Recorder: Line unavailable: " + e); System.exit(-2); } } class Recorder extends Thread { int bufferSize = (int)format1.getSampleRate() * format1.getFrameSize(); byte buffer[] = new byte[bufferSize]; public Recorder() { start(); } public synchronized void run() { out = new ByteArrayOutputStream(); while(true) { int count = lineIn.read(buffer, 0, buffer.length); if (count > 0) { out.write(buffer, 0, count); } client.send(getEncoded(out)); out.reset(); } } } public Storage getEncoded(ByteArrayOutputStream out) { byte[] audio2 = null; try { byte[] audio1 = out.toByteArray(); InputStream input = new ByteArrayInputStream(audio1); AudioInputStream ais1 = new AudioInputStream(input, format1, audio1.length / format1.getFrameSize()); AudioInputStream ais2 = AudioSystem.getAudioInputStream(encoding2, ais1); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); int nWrittenFrames = AudioSystem.write(ais2, fileType, out2); return new Storage(out2); } catch(Exception e) { System.out.println(e); return null; } } }