Java Sound @ Game causes laggs

I there. I’m developing a RTS (Real time strategy) and experienced some performance problems with the following code. Moving Images and Animations and so on got frame laggs everytime a sound is played…


import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

class whoknows
{
	
	private Clip clip;
	
	public whoknows()
	{
	}
	
	public void loadPath(String pathi)
	{
		initPlayer(pathi);
	}
	
	private void initPlayer(String patho)
	{
		try 
		{
			AudioInputStream ais = AudioSystem.getAudioInputStream(new File(patho));
			AudioFormat format = ais.getFormat();
			DataLine.Info info = new DataLine.Info(Clip.class, format,((int) ais.getFrameLength() * format.getFrameSize()));
			clip = (Clip) AudioSystem.getLine(info);
			clip.open(ais);

			FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
			gainControl.setValue(1.0F);
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
	
	public void play()
	{
		clip.start();
	}
	
}


well its adapted for this post, but thats basically it… is there a better methode playing sounds ? I already advanced to this method from using AudioClips : DD

and… if I play a background music file with the following code, I got generell laggs all the time and the animation and movements are not constant anymore…



import java.io.*; 
import javax.sound.sampled.*; 

class Music 
{ 
  public Music()
  {
  	}

 public void play() 
 { 

  File f = new File("music/vortex.au");  // yes, a sun .au file : D

  AudioInputStream ais; 

  AudioFormat format; 

  Clip cl; 

  try 
  { 
   ais = AudioSystem.getAudioInputStream(f); 
   format = ais.getFormat(); 

   if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || 
       (format.getEncoding() == AudioFormat.Encoding.ALAW)) 
   { 
       AudioFormat tmp = new AudioFormat( 
                                 AudioFormat.Encoding.PCM_SIGNED, 
                                 format.getSampleRate(), 
                                 format.getSampleSizeInBits() * 2, 
                                 format.getChannels(), 
                                 format.getFrameSize() * 2, 
                                 format.getFrameRate(), 
                                 true); 
       ais = AudioSystem.getAudioInputStream(tmp, ais); 
       format = tmp; 
   } 
   DataLine.Info info = new DataLine.Info( 
                             Clip.class, 
                             ais.getFormat(), 
                             ((int) ais.getFrameLength() * 
                                 format.getFrameSize())); 


   System.out.println(info.toString()); 
   cl = (Clip) AudioSystem.getLine(info); 
   cl.open(ais); 
   cl.start();


  } 
  catch (IOException e) 
  { 
   System.out.println("error at reading the file"); 
  } 
  catch (UnsupportedAudioFileException e) 
  { 
   System.out.println("File typ not supported!"); 
  } 
  catch (LineUnavailableException e) 
  { 
   System.out.println("line not available!"); 
  } 
  /*catch (InterruptedException e) 
  { 
   System.out.println("cancel!"); 
  }*/
 } 
}


It seems these codes are working but are not designed for games like this because of the problems…

help : D

just to inform you: I’m using now EasyOgg and I’m very surprised in many ways of it.
And the lags are also gone.

I think the lag was because you load and play the sound in the same thread as the main game/render loop, which causes it to pause until the audio file is loaded