javawavplaybackjavasound

Trouble playing wav in Java


I'm trying to play a

PCM_UNSIGNED 11025.0 Hz, 8 bit, mono, 1 bytes/frame

file as described here (1) and here(2).

The first approach works, but I don't want to depend on sun.* stuff. The second results in just some leading frames being played, that sounds more like a click. Can't be an IO issue as I'm playing from a ByteArrayInputStream.

Why might this happen?


Solution

  • I'm not sure why the second approach you linked to starts another thread; I believe the audio will be played in its own thread anyway. Is the problem that your application finishes before the clip has finished playing?

    import javax.sound.sampled.*;
    import java.io.File;
    import java.io.IOException;
    import javax.sound.sampled.LineEvent.Type;
    
    private static void playClip(File clipFile) throws IOException, 
      UnsupportedAudioFileException, LineUnavailableException, InterruptedException {
      class AudioListener implements LineListener {
        private boolean done = false;
        @Override public synchronized void update(LineEvent event) {
          Type eventType = event.getType();
          if (eventType == Type.STOP || eventType == Type.CLOSE) {
            done = true;
            notifyAll();
          }
        }
        public synchronized void waitUntilDone() throws InterruptedException {
          while (!done) { wait(); }
        }
      }
      AudioListener listener = new AudioListener();
      AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(clipFile);
      try {
        Clip clip = AudioSystem.getClip();
        clip.addLineListener(listener);
        clip.open(audioInputStream);
        try {
          clip.start();
          listener.waitUntilDone();
        } finally {
          clip.close();
        }
      } finally {
        audioInputStream.close();
      }
    }