97 lines
2.5 KiB
Java
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();
|
|
}
|
|
}
|