package tk.amberide.engine.al;
import java.awt.EventQueue;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineEvent.Type;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Mixer;
/**
*
* @author Tudor
*/
public class JSAudio implements Audio {
private Clip clip;
private boolean loop;
JSAudio(AudioInputStream as) throws LineUnavailableException, IOException {
Mixer mix = AudioIO.findMixer(as.getFormat());
clip = (Clip) (mix != null ? mix.getLine(new Line.Info(Clip.class)) : AudioSystem.getLine(new Line.Info(Clip.class)));
clip.open(as);
clip.addLineListener(new LineListener() {
public void update(LineEvent event) {
if (loop && event.getType() == Type.STOP) {
EventQueue.invokeLater(new Runnable() {
public void run() {
clip.start();
}
});
}
}
});
}
public void start() {
clip.start();
}
public void pause() {
clip.stop();
}
public void stop() {
clip.stop();
clip.setFramePosition(0);
}
public State getState() {
return clip.isRunning() ? State.PLAYING : (clip.getFramePosition() == 0 ? State.STOPPED : State.PAUSED);
}
public void setVolume(float volume) {
((FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN)).setValue(volume);
}
public float getVolume() {
return clip.getLevel();
}
public void setLooping(boolean flag) {
loop = flag;
}
public boolean isLooping() {
return loop;
}
public void setMillisecondPosition(long position) {
clip.setMicrosecondPosition(position / 1000);
}
public long getMillisecondPosition() {
return clip.getMicrosecondPosition() * 1000;
}
public long getMillisecondLength() {
return clip.getMicrosecondLength() * 1000;
}
public AudioFormat getFormat() {
return clip.getFormat();
}
public Clip getClip() {
return clip;
}
}