MusicManager.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package view.sound;
  2. import javax.sound.sampled.AudioInputStream;
  3. import javax.sound.sampled.AudioSystem;
  4. import javax.sound.sampled.Clip;
  5. import javax.sound.sampled.FloatControl;
  6. import java.net.URL;
  7. import java.util.EnumMap;
  8. public class MusicManager {
  9. private static MusicManager instance;
  10. private Clip musicClip;
  11. private MusicManager() {
  12. }
  13. public static MusicManager getInstance() {
  14. if (instance == null) {
  15. instance = new MusicManager();
  16. }
  17. return instance;
  18. }
  19. public void playBackgroundMusic(String resourcePath, boolean loop) {
  20. stop();
  21. if(loop){
  22. getBackgroundMusic(resourcePath).loop(Clip.LOOP_CONTINUOUSLY);
  23. }else{
  24. getBackgroundMusic(resourcePath).start();
  25. }
  26. }
  27. private Clip getBackgroundMusic(String resourcePath){
  28. try {
  29. URL musicURL = getClass().getClassLoader().getResource(resourcePath);
  30. if (musicURL == null) {
  31. System.err.println("Music file not found: " + resourcePath);
  32. return null;
  33. }
  34. AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicURL);
  35. musicClip = AudioSystem.getClip();
  36. musicClip.open(audioStream);
  37. return musicClip;
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. return null;
  42. }
  43. public void setVolume(Clip clip, float percent) {
  44. if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
  45. FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
  46. float min = gainControl.getMinimum(); // usually -80.0f
  47. float max = gainControl.getMaximum(); // usually 0.0f
  48. // Clamp percent to 0–100
  49. percent = Math.max(0, Math.min(100, percent));
  50. // Convert percent to gain value
  51. float range = max - min;
  52. float gain = (range * percent / 100f) + min;
  53. System.out.println("Set volume: " + gain + " dB for " + percent + "%");
  54. gainControl.setValue(gain); // Safe
  55. }
  56. }
  57. public void stop() {
  58. if (musicClip != null) {
  59. musicClip.stop();
  60. musicClip.close();
  61. }
  62. }
  63. public void setVolume(float volume) {
  64. setVolume(musicClip, volume);
  65. }
  66. }