You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.1 KiB
119 lines
2.1 KiB
package net.tortuga.sounds;
|
|
|
|
|
|
import net.tortuga.util.AnimDouble;
|
|
|
|
import org.lwjgl.openal.AL10;
|
|
|
|
import com.porcupine.mutable.MFloat;
|
|
|
|
|
|
public class LoopPlayer {
|
|
|
|
private int sourceID = -1;
|
|
|
|
/** the track */
|
|
private AudioX track;
|
|
|
|
/** animator for fade in and fade out */
|
|
private AnimDouble fadeAnim = new AnimDouble(0);
|
|
|
|
/** max gain for track */
|
|
private float fullGain = 1;
|
|
|
|
/** dedicated volume control */
|
|
private MFloat gainMultiplier = null;
|
|
|
|
private float lastUpdateComputedGain = 0;
|
|
|
|
/** flag that track is paused */
|
|
private boolean paused = true;
|
|
|
|
|
|
public LoopPlayer(AudioX track, float pitch, float fullGain, MFloat gainMultiplier) {
|
|
this.track = track;
|
|
|
|
this.fullGain = fullGain;
|
|
fadeAnim.setTo(0);
|
|
this.gainMultiplier = gainMultiplier;
|
|
|
|
if (track != null) {
|
|
sourceID = track.playAsEffectLoop(1, 0);
|
|
track.pauseLoop();
|
|
}
|
|
|
|
paused = true;
|
|
}
|
|
|
|
|
|
public void pause()
|
|
{
|
|
if (track == null) return;
|
|
if (paused) {
|
|
//System.out.println("Can't pause, loop is already paused.");
|
|
return;
|
|
}
|
|
|
|
track.pauseLoop();
|
|
paused = true;
|
|
}
|
|
|
|
|
|
public boolean isPaused()
|
|
{
|
|
return paused;
|
|
}
|
|
|
|
|
|
public void resume()
|
|
{
|
|
if (track == null) return;
|
|
if (!paused) {
|
|
//System.out.println("Can't resume, loop is already playing.");
|
|
return; // playing
|
|
}
|
|
|
|
sourceID = track.resumeLoop();
|
|
paused = false;
|
|
}
|
|
|
|
|
|
public void update(double delta)
|
|
{
|
|
if (track == null) return;
|
|
if (paused) {
|
|
return;
|
|
}
|
|
fadeAnim.update(delta);
|
|
|
|
float computedGain = (float) (gainMultiplier.get() * fullGain * fadeAnim.delta());
|
|
if (!paused && computedGain != lastUpdateComputedGain) {
|
|
AL10.alSourcef(sourceID, AL10.AL_GAIN, computedGain);
|
|
lastUpdateComputedGain = computedGain;
|
|
}
|
|
|
|
if (computedGain == 0 && !paused) pause();
|
|
}
|
|
|
|
|
|
// public void setVolume(double volume) {
|
|
// fadeAnim.setTo(volume);
|
|
// }
|
|
|
|
public void fadeIn(double secs)
|
|
{
|
|
if (track == null) return;
|
|
resume();
|
|
fadeAnim.stopAnimation();
|
|
fadeAnim.addValue(1 - fadeAnim.delta(), secs * (1 - fadeAnim.delta()));
|
|
}
|
|
|
|
|
|
public void fadeOut(double secs)
|
|
{
|
|
if (track == null) return;
|
|
fadeAnim.stopAnimation();
|
|
fadeAnim.addValue(-fadeAnim.delta(), secs * (fadeAnim.delta()));
|
|
}
|
|
|
|
}
|
|
|