2020-06-11 12:33:41 +02:00

97 lines
2.5 KiB
Java

package ruscz.game.gameOfProd.Sounds;
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
/**
* This class handles all music being played in the game
*/
public class MusicManager {
private final String musicName;
private float volume;
private final float maxVolume;
private FloatControl gainControl;
private Timer timerIn;
private Timer timerOut;
private Clip clip;
public MusicManager(String name, float volume){
musicName = name;
this.maxVolume = volume;
this.volume = -40.0f;
}
/**
* Starts playing music
*/
public void playMusic(){
AudioInputStream audioIn;
try {
audioIn = AudioSystem.getAudioInputStream(new File("src/main/resources/music/" + musicName));
clip = AudioSystem.getClip();
if (clip != null) {
clip.open(audioIn);
}
if (clip != null) {
gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(volume);
clip.loop(1000);
clip.start();
}
} catch (LineUnavailableException | IOException | UnsupportedAudioFileException e) {
e.printStackTrace();
}
}
/**
* Stops playing music
*/
public void stopMusic() {
if (timerOut != null) timerOut.stop();
clip.stop();
volume = -40.0f;
}
public void setVolumeToMaxVolume(){
gainControl.setValue(maxVolume);
}
public void setVolumeToNormalVolume(){
gainControl.setValue(-40.0f);
}
/**
* Fades music in (slowly raises volume to maxVolume)
* @param delay is timer delay in milliseconds
*/
public void fadeIn(int delay) {
timerIn = new Timer(delay, actionEvent -> {
if (volume < maxVolume) {
volume += 0.1f;
gainControl.setValue(volume);
}
});
timerIn.start();
}
/**
* Fades music out (slowly lowers volume to 'zero')
* @param delay is timer delay in milliseconds
*/
public void fadeOut(int delay) {
timerOut = new Timer(delay, actionEvent -> {
if (volume > -79.0f) {
volume -= 0.1f;
gainControl.setValue(volume);
}
else {
stopMusic();
}
});
timerIn.stop();
timerOut.start();
}
}