package com.fteams.siftrain.controller;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.Disposable;
import com.fteams.siftrain.assets.GlobalConfiguration;
public class Crossfader implements Disposable {
private static final float fadeRate = 0.25f;
private Music fadingIn = null;
private Music fadingOut = null;
private Music enqueued = null;
private boolean enqueuedStop = false;
private float volume;
public Crossfader() {
volume = GlobalConfiguration.songVolume / 100.0f;
}
private void disposeOf(Music mus) {
if(mus == null)
return;;
if(mus.isPlaying())
mus.stop();
mus.dispose();
}
private void initMusic(Music mus) {
mus.setLooping(true);
mus.setVolume(0.0f);
mus.play();
}
@Override
public void dispose() {
disposeOf(fadingIn);
disposeOf(fadingOut);
disposeOf(enqueued);
fadingIn = null;
fadingOut = null;
enqueued = null;
}
private void fadeIn() {
if(enqueued != null)
initMusic(enqueued);
disposeOf(fadingOut);
fadingOut = fadingIn;
fadingIn = enqueued;
enqueued = null;
enqueuedStop = false;
}
private void tryFadeIn() {
if(enqueued != null || enqueuedStop)
fadeIn();
}
public void enqueue(Music mus) {
disposeOf(enqueued);
enqueued = mus;
enqueuedStop = (mus == null);
if(fadingOut == null)
fadeIn();
}
public void update(float delta) {
final float volStep = volume * delta * fadeRate;
if(fadingIn != null && !fadingIn.isPlaying()) {
fadingIn.dispose();
fadingIn = null;
}
if(fadingOut != null && !fadingOut.isPlaying()) {
fadingOut.dispose();
fadingOut = null;
tryFadeIn();
}
if(fadingOut != null) {
final float newVol = MathUtils.clamp(fadingOut.getVolume() - volStep, 0f, volume);
if(newVol > 0f)
fadingOut.setVolume(newVol);
else {
disposeOf(fadingOut);
fadingOut = null;
tryFadeIn();
}
}
if(fadingIn != null && fadingIn.getVolume() < volume) {
fadingIn.setVolume(MathUtils.clamp(fadingIn.getVolume() + volStep, 0f, volume));
}
}
}