!7 // Original source: AudioLoop from jsresources.org static int DEFAULT_INTERNAL_BUFSIZ = 40960, DEFAULT_EXTERNAL_BUFSIZ = 40960; p { temp WAVDecoder decoder = new(newFileInputStream(loadLibrary(#1400093))); new L chunks; while licensed { short[] buf = new short[4096]; int n = decoder.readMonoSamples(buf); if (n <= 0) break; chunks.add(subArray(buf, 0, n)); } short[] samples = concatShortArrays(chunks); new AudioLoop(javaSound_cdQuality(), DEFAULT_INTERNAL_BUFSIZ, DEFAULT_EXTERNAL_BUFSIZ, samples).start(); } sclass AudioLoop extends Thread { TargetDataLine in; SourceDataLine out; new Flag stopFlag; int externalBufferSize; byte[] buf; short[] samples; *(AudioFormat format, int internalBufferSize, int *externalBufferSize, short[] *samples) { out = javaSound_outputLine(format, internalBufferSize); buf = new byte[internalBufferSize]; } public void start { out.start°; super.start°; } void stopPlaying { out.close°; stopFlag.raise°; } // "stop()" was taken int sampleIndex = 0; double nextSample() { double f = samples[sampleIndex]/32767.0; sampleIndex = (sampleIndex+1) % l(samples); ret f; } public void run° { while (licensed() && !stopFlag.isUp()) { for (int i = 0; i < l(buf); i += 4) { double f = nextSample(); int x = iround(max(0, min(1, f))*32767); buf[i] = buf[i+2] = (byte) x; buf[i+1] = buf[i+3] = (byte) (x >> 8); } //print("Writing " + l(buf) + " bytes"); int n = out.write(buf, 0, l(buf)); if (n != l(buf)) print("huh: " + n + " of " + l(buf)); } } }