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;
/**
* Diese erstellt aus einer Wav-File ein abspielbares Objekt. Und sollte wenn möglich nur für Sounds verwendet werden
*
* @author Soulfly alias Ingo Müller
*/
public class WaveFile implements Runnable
{
/** Vereinfacht die Steuerung für einen unendlichen Sound(Musik) */
static final boolean LOOP = true;
/** Vereinfacht die Steuerung für einenSound */
static final boolean PLAY = false;
/** Die Lautstärke vom abgespielten Sound */
private float gain;
/** zeigt, ob loop aktiviert ist */
private boolean loop;
/** Name der Sound-Datei */
private String name;
/** Links-Rechts-Modifier für die Sound-Datei */
private float pan;
/** zum Steuern des loop-Sounds */
private boolean shouldplay;
/** SoundThread */
private Thread t;
/**
* Kontruktor
*
* @param n
* Sound-Datei
* @param g
* Gain-Lautstärke
*/
public WaveFile(String n, float g)
{
pan = 0f;
gain = g;
name = n;
}
/**
* Abspiel-Thread der WaveFile
*/
public void run()
{
if (loop)
{
shouldplay = true;
loop();
}
else
{
play();
}
}
/**
* Startet den Sound einmal oder im Loop
*
* @param LOOP
* Loop oder nicht
*/
public void start(boolean LOOP)
{
loop = LOOP;
t = new Thread(this);
t.start();
}
/**
* Stop den unendlichen Sound
*/
public void stop()
{
shouldplay = false;
}
/**
* Spielt den Sound oder die Musik unendlich ab bis der Sound gestoppt
*/
private void loop()
{
while (shouldplay)
{
try
{
System.out.println("loop start");
AudioInputStream ais;
Clip clip;
AudioFormat format;
ais = AudioSystem.getAudioInputStream(new File(WaveFile.getResource(name).getFile()));
format = ais.getFormat();
if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW))
{
AudioFormat tmp = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleSizeInBits(), 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, format, ((int) ais.getFrameLength() * format.getFrameSize()));
clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
FloatControl panControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
panControl.setValue(pan);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(gain);
clip.start();
while (true)
{
try
{
Thread.sleep(100);
}
catch (Exception e)
{
}
if (!clip.isRunning())
break;
}
clip.stop();
clip.close();
}
catch (LineUnavailableException e1)
{
e1.printStackTrace();
}
catch (IOException e1)
{
e1.printStackTrace();
}
catch (UnsupportedAudioFileException e)
{
e.printStackTrace();
}
}
}
/**
* Spielt den Sound einmal ab
*/
private void play()
{
try
{
AudioInputStream ais;
Clip clip;
AudioFormat format;
ais = AudioSystem.getAudioInputStream(new File(WaveFile.getResource(name).getFile()));
format = ais.getFormat();
if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW))
{
AudioFormat tmp = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleSizeInBits(), 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, format, ((int) ais.getFrameLength() * format.getFrameSize()));
clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
FloatControl panControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
panControl.setValue(pan);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(gain);
clip.start();
while (true)
{
try
{
Thread.sleep(100);
}
catch (Exception e)
{
}
if (!clip.isRunning())
break;
}
clip.stop();
clip.close();
}
catch (LineUnavailableException e1)
{
e1.printStackTrace();
}
catch (IOException e1)
{
e1.printStackTrace();
}
catch (UnsupportedAudioFileException e)
{
e.printStackTrace();
}
}
/**
* Einfacher statische URL Loader für Jar-Archive und Ordner
*
* @param filename
* Datei die geladen werden soll
* @return Passende URL zur Datei
*/
public final static URL getResource(final String filename)
{
// Try to load resource from jar
URL url = ClassLoader.getSystemResource(filename);
// If not found in jar, then load from disk
if (url == null)
{
try
{
url = new URL("file", "localhost", filename);
}
catch (Exception urlException)
{
} // ignore
}
return url;
}
}