Длина Java Неограниченная AudioInputStream - PullRequest
1 голос
/ 21 декабря 2011

У меня есть куча кода, который при запуске будет производить процедурный звук.К сожалению, это длится всего несколько секунд.В идеале он будет работать, пока я не скажу ему остановиться.Я не говорю о цикле, алгоритм для его генерации предоставляет 2 ^ 64 выборки, поэтому он не закончится в обозримом будущем.Конструктор для AudioInputStream принимает третий вход, который в идеале я мог бы просто удалить.Я мог бы просто предоставить огромное количество, но это кажется неправильным путем.

Я думал об использовании SourceDataLine, но в идеале алгоритм должен вызываться по требованию, а не запускаться вперед и писать путь,Мысли

1 Ответ

1 голос
/ 21 декабря 2011

Кажется, я ответил на свой вопрос.

После дальнейших исследований, использование 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);
            }
        }
    }
}
...