package view.sound; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.FloatControl; import java.net.URL; import java.util.EnumMap; public class MusicManager { private static MusicManager instance; private Clip musicClip; private MusicManager() { } public static MusicManager getInstance() { if (instance == null) { instance = new MusicManager(); } return instance; } public void playBackgroundMusic(String resourcePath, boolean loop) { stop(); if(loop){ getBackgroundMusic(resourcePath).loop(Clip.LOOP_CONTINUOUSLY); }else{ getBackgroundMusic(resourcePath).start(); } } private Clip getBackgroundMusic(String resourcePath){ try { URL musicURL = getClass().getClassLoader().getResource(resourcePath); if (musicURL == null) { System.err.println("Music file not found: " + resourcePath); return null; } AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicURL); musicClip = AudioSystem.getClip(); musicClip.open(audioStream); return musicClip; } catch (Exception e) { e.printStackTrace(); } return null; } public void setVolume(Clip clip, float percent) { if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float min = gainControl.getMinimum(); // usually -80.0f float max = gainControl.getMaximum(); // usually 0.0f // Clamp percent to 0–100 percent = Math.max(0, Math.min(100, percent)); // Convert percent to gain value float range = max - min; float gain = (range * percent / 100f) + min; System.out.println("Set volume: " + gain + " dB for " + percent + "%"); gainControl.setValue(gain); // Safe } } public void stop() { if (musicClip != null) { musicClip.stop(); musicClip.close(); } } public void setVolume(float volume) { setVolume(musicClip, volume); } }