/***********************************************************************/ import javax.media.sound.sampled.*; import java.applet.*; import java.awt.*; import java.io.*; /* * Reads data from the input channel and writes to the output stream */ public class Capture extends Applet implements Runnable{ TargetDataLine line; Thread thread; private Button startCaptureButton, stopCaptureButton; public void init() { System.out.println("init"); this.setBackground(Color.white); startCaptureButton = new Button("Start Capture"); startCaptureButton.setForeground(Color.black); startCaptureButton.setBackground(Color.lightGray); this.add(startCaptureButton); stopCaptureButton = new Button("Stop Capture"); stopCaptureButton.setForeground(Color.black); stopCaptureButton.setBackground(Color.lightGray); this.add(stopCaptureButton); } public boolean action(Event event, Object arg) { System.out.println("action"); if(event.target == startCaptureButton) { this.debut(); return true; } else if(event.target == stopCaptureButton) { this.fin(); return true; } else return super.action(event, arg); } public void debut() { System.out.println("start1"); thread = new Thread(this); thread.setName("Capture"); System.out.println("start2"); thread.start(); } public void fin() { System.out.println("stop"); thread = null; } public void run() { // define the required attributes for our line, // and make sure a compatible line is supported. Type encoding = AudioFormat.PCM_SIGNED; float rate = 44100; int sampleSize = 16; int channels = 2; boolean bigEndian = true; AudioFormat format = new AudioFormat(encoding, rate, sampleSize, channels, (sampleSize/8)*channels, rate, bigEndian); DataLine.Info info = new DataLine.Info(TargetDataLine.class, null, null, new Class[0], format, AudioSystem.NOT_SPECIFIED); System.out.println("run"); if (!AudioSystem.isSupportedLine(info)) { System.out.println("Line matching " + info + " not supported."); return; } System.out.println("supported"); // get and open the target data line for capture. try { line = (TargetDataLine) AudioSystem.getLine(info); System.out.println("line_open?"); line.open(format, 5000); //line.getBufferSize()); } catch (LineUnavailableException ex) { System.out.println("Unable to open the line: " + ex); return; } catch (SecurityException ex) { System.out.println("Unable to open the line: " + ex); } System.out.println("open"); // play back the captured audio data ByteArrayOutputStream out = new ByteArrayOutputStream(); int frameSizeInBytes = format.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; byte[] data = new byte[bufferLengthInBytes]; int numFramesRead; line.start(); System.out.println("line start"); while (thread != null) { if ((numFramesRead = line.read(data, 0, bufferLengthInFrames)) == -1) { break; } out.write(data, 0, (numFramesRead * frameSizeInBytes)); } System.out.println("line stop"); // we reached the end of the stream. stop and close the line. line.stop(); line.close(); line = null; System.out.println("line null"); // stop and close the output stream try { out.flush(); out.close(); } catch (IOException ex) { ex.printStackTrace(); } System.out.println("stream close"); // load bytes into the audio input stream for playback byte audioBytes[] = out.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(audioBytes); AudioInputStream audioInputStream = new AudioInputStream(bais, format, audioBytes.length / frameSizeInBytes); try { audioInputStream.reset(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("end"); } } /***********************************************************************/