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