title: how to stream sound in java without delay using SourceDataLine
body: <p>I want to generate sounds based on user's action in Java. Even if I set the buffer size in SourceDataLine to the smallest possible value (1 frame) I still have delay of about 1 second.</p>
  
  <p>Because a code snippet is worth a thousand words (or was it a picture?), here is the code:</p>
  
  <pre><code>import javax.sound.sampled.AudioFormat;
  import javax.sound.sampled.AudioSystem;
  import javax.sound.sampled.DataLine;
  import javax.sound.sampled.SourceDataLine;
  import javax.swing.JFrame;
  import javax.swing.JSlider;
  import javax.swing.event.ChangeEvent;
  import javax.swing.event.ChangeListener;
  
  public class SoundTest {
  
      private static int sliderValue = 500;
  
      public static void main(String[] args) throws Exception {
          final JFrame frame = new JFrame();
          final JSlider slider = new JSlider(500, 1000);
          frame.add(slider);
          slider.addChangeListener(new ChangeListener() {
              @Override
              public void stateChanged(ChangeEvent e) {
                  sliderValue = slider.getValue();
              }
          });
          frame.pack();
          frame.setVisible(true);
  
          final AudioFormat audioFormat = new AudioFormat(44100, 8, 1, true, true);
          final DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat, 1);
          final SourceDataLine soundLine = (SourceDataLine) AudioSystem.getLine(info);
          soundLine.open(audioFormat);
          soundLine.start();
          byte counter = 0;
          final byte[] buffer = new byte[1];
          byte sign = 1;
          while (frame.isVisible()) {
              if (counter &gt; audioFormat.getFrameRate() / sliderValue) {
                  sign = (byte) -sign;
                  counter = 0;
              }
              buffer[0] = (byte) (sign * 30);
              soundLine.write(buffer, 0, 1);
              counter++;
          }
      }
  }
  </code></pre>
  
  <p>Try moving the slider while listening to the sound. Is it possible, or do I have to create in-memory buffers and wrap them in Clip instances?</p>