!7 // Original source: AudioLoop from jsresources.org import javax.sound.sampled.*; static int DEFAULT_INTERNAL_BUFSIZ = 40960, DEFAULT_EXTERNAL_BUFSIZ = 40960; static S mixerName; static float frameRate = 44100.0F; p { AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, fFrameRate, 16, 2, 4, frameRate, false); new AudioLoop(audioFormat, DEFAULT_INTERNAL_BUFSIZ, DEFAULT_EXTERNAL_BUFSIZ, mixerName).start(); } sclass AudioLoop extends Thread { TargetDataLine in; SourceDataLine out; new Flag stopFlag; int externalBufferSize; *(AudioFormat format, int internalBufferSize, int *externalBufferSize, S mixerName) throws LineUnavailableException { Mixer mixer = mixerName == null ? null : AudioSystem.getMixer(javaSound_getMixerInfo(mixerName)); DataLine.Info targetInfo = new DataLine.Info(TargetDataLine.class, format, internalBufferSize); DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format, internalBufferSize); if (mixer != null) { in = (TargetDataLine) mixer.getLine(targetInfo); out = (SourceDataLine) mixer.getLine(sourceInfo); } else { in = (TargetDataLine) AudioSystem.getLine(targetInfo); out = (SourceDataLine) AudioSystem.getLine(sourceInfo); } in.open(format, internalBufferSize); out.open(format, internalBufferSize); } public void start { in.start(); out.start(); super.start(); } void stopRecording { in.stop(); out.close(); stopFlag.raise(); } // "stop()" was taken public void run() { javaSound_streamFromLineToLine(in, out, externalBufferSize, stopFlag); } }