Java Length Unlimited AudioInputStream

我有一堆代码,在运行时会产生程序性声音。 不幸的是,它只持续几秒钟。 理想情况下它会运行直到我告诉它停止。 我不是在谈论循环,生成它的算法目前提供2 ^ 64个样本,所以它在可预见的未来不会用完。 AudioInputStream的构造函数接受第三个输入,理想情况下我可以删除它。 我可以提供一个庞大的数字,但这似乎是错误的方式去做。

我考虑过使用SourceDataLine,但理想情况下算法会按需调用,而不是向前运行并编写路径。 思考?

我似乎回答了自己的问题。

经过进一步的研究,使用SourceDataLineSourceDataLine的方法,因为当你给它足够的时候它会阻止。

抱歉缺乏合适的Javadoc。

 class SoundPlayer { // plays an InputStream for a given number of samples, length public static void play(InputStream stream, float sampleRate, int sampleSize, int length) throws LineUnavailableException { // you can specify whatever format you want...I just don't need much flexibility here AudioFormat format = new AudioFormat(sampleRate, sampleSize, 1, false, true); AudioInputStream audioStream = new AudioInputStream(stream, format, length); Clip clip = AudioSystem.getClip(); clip.open(audioStream); clip.start(); } public static void play(InputStream stream, float sampleRate, int sampleSize) throws LineUnavailableException { AudioFormat format = new AudioFormat(sampleRate, sampleSize, 1, false, true); SourceDataLine line = AudioSystem.getSourceDataLine(format); line.open(format); line.start(); // if you wanted to block, you could just run the loop in here SoundThread soundThread = new SoundThread(stream, line); soundThread.start(); } private static class SoundThread extends Thread { private static final int buffersize = 1024; private InputStream stream; private SourceDataLine line; SoundThread(InputStream stream, SourceDataLine line) { this.stream = stream; this.line = line; } public void run() { byte[] b = new byte[buffersize]; // you could, of course, have a way of stopping this... for (;;) { stream.read(b); line.write(b, 0, buffersize); } } } }