我有一堆代码,在运行时会产生程序性声音。不幸的是,它只持续几秒钟。理想情况下,它会一直运行,直到我告诉它停止。我不是在谈论循环,生成它的算法目前提供2 ^ 64个样本,所以它在可预见的未来不会用完。 AudioInputStream的构造函数接受第三个输入,理想情况下我可以删除它。我可以提供一个庞大的数字,但这似乎是错误的方法。
我考虑过使用SourceDataLine,但理想情况下算法会按需调用,而不是提前运行并编写路径。想法?
答案 0 :(得分:1)
我似乎回答了自己的问题。
经过进一步的研究,使用SourceDataLine
是可行的方法,因为它会在你给它足够的时候阻止它。
抱歉缺乏合适的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);
}
}
}
}