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(); } }