diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index d184e61..aeb4645 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -2,6 +2,7 @@ package org.toop; import org.toop.app.App; import org.toop.framework.audio.*; +import org.toop.framework.audio.interfaces.VolumeManager; import org.toop.framework.networking.NetworkingClientManager; import org.toop.framework.networking.NetworkingInitializationException; import org.toop.framework.resource.ResourceLoader; @@ -18,11 +19,17 @@ public final class Main { ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets")); new Thread(NetworkingClientManager::new).start(); new Thread(() -> { + var mm = new MusicManager<>(MusicAsset.class); + var sem = new SoundEffectManager(); AudioEventListener a = new AudioEventListener<>( - new MusicManager<>(MusicAsset.class), - new SoundEffectManager(), + mm, + sem, new AudioVolumeManager() + .registerManager(VolumeTypes.VOLUME, mm) + .registerManager(VolumeTypes.VOLUME, sem) + .registerManager(VolumeTypes.FX, sem) + .registerManager(VolumeTypes.MUSIC, mm) ); a.initListeners(); }).start(); } diff --git a/framework/src/main/java/org/toop/framework/audio/AudioEventListener.java b/framework/src/main/java/org/toop/framework/audio/AudioEventListener.java index 5389ea6..bfa5a54 100644 --- a/framework/src/main/java/org/toop/framework/audio/AudioEventListener.java +++ b/framework/src/main/java/org/toop/framework/audio/AudioEventListener.java @@ -7,10 +7,6 @@ import org.toop.framework.audio.interfaces.VolumeManager; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.resource.types.AudioResource; -import javax.sound.sampled.LineUnavailableException; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.IOException; - public class AudioEventListener { private final MusicManager musicManager; private final SoundEffectManager soundEffectManager; @@ -60,22 +56,25 @@ public class AudioEventListener void updateVolume(T resource, double level) { - resource.updateVolume(level); + public void setVolume(double newVolume, VolumeTypes type) { + type.setVolume(newVolume, VolumeTypes.VOLUME.getVolume()); } - private double limitVolume(double volume) { - return Math.min(1.0, Math.max(0.0, volume / 100)); + public double getVolume(VolumeTypes type) { + return type.getVolume(); } - @SafeVarargs - @Override - public final void setVolume(double newVolume, VolumeTypes type, AudioManager... managers) { - double limitedVolume = limitVolume(newVolume); - - switch (type) { - case FX -> fxVolume = limitedVolume; - case MUSIC -> musicVolume = limitedVolume; - default -> volume = limitedVolume; + public AudioVolumeManager registerManager(VolumeTypes type, AudioManager manager) { + if (manager != null) { + type.addManager(manager); } - - double effectiveVolume = switch (type) { - case FX -> fxVolume * volume; - case MUSIC -> musicVolume * volume; - default -> volume; - }; - - Arrays.stream(managers) - .filter(Objects::nonNull) - .forEach(manager -> - manager.getActiveAudio().forEach(aud -> updateVolume(aud, effectiveVolume)) - ); + return AudioVolumeManager.this; } @Override - public double getVolume() { - return volume * 100; + public void updateAllVolumes() { + double masterVolume = VolumeTypes.VOLUME.getVolume(); + + for (VolumeTypes type : VolumeTypes.values()) { + if (type != VolumeTypes.VOLUME) { // skip master itself + type.setVolume(type.getVolume(), masterVolume); + } + } } - @Override - public double getFxVolume() { - return fxVolume * 100; - } - - @Override - public double getMusicVolume() { - return musicVolume * 100; - } -} +} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/audio/VolumeTypes.java b/framework/src/main/java/org/toop/framework/audio/VolumeTypes.java index 7a840dc..a2bb10a 100644 --- a/framework/src/main/java/org/toop/framework/audio/VolumeTypes.java +++ b/framework/src/main/java/org/toop/framework/audio/VolumeTypes.java @@ -1,7 +1,59 @@ package org.toop.framework.audio; +import org.toop.framework.audio.interfaces.AudioManager; +import org.toop.framework.resource.types.AudioResource; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + public enum VolumeTypes { - VOLUME, - FX, - MUSIC, -} + VOLUME(), + FX(), + MUSIC(); + + private final List> managers = new ArrayList<>(); + private double volume = 1.0; + private double masterVolume = 1.0; + + public void setVolume(double newVolume, double currentMasterVolume) { + this.volume = clamp(newVolume); + + if (this != VOLUME) { + this.masterVolume = clamp(currentMasterVolume); + } + + double effectiveVolume = computeEffectiveVolume(); + broadcastVolume(effectiveVolume); + } + + private double computeEffectiveVolume() { + return (this == VOLUME) ? volume : volume * masterVolume; + } + + private void broadcastVolume(double effectiveVolume) { + managers.stream() + .filter(Objects::nonNull) + .forEach(manager -> manager.getActiveAudio() + .forEach(aud -> aud.updateVolume(effectiveVolume))); + } + + private double clamp(double vol) { + return Math.max(0, Math.min(vol, 1.0)); + } + + public double getVolume() { + return volume; + } + + public void addManager(AudioManager manager) { + if (manager != null && !managers.contains(manager)) { + managers.add(manager); + } + } + + public List> getManagers() { + return Collections.unmodifiableList(managers); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/audio/interfaces/VolumeManager.java b/framework/src/main/java/org/toop/framework/audio/interfaces/VolumeManager.java index 95af48d..fdc4bdd 100644 --- a/framework/src/main/java/org/toop/framework/audio/interfaces/VolumeManager.java +++ b/framework/src/main/java/org/toop/framework/audio/interfaces/VolumeManager.java @@ -4,8 +4,7 @@ import org.toop.framework.audio.VolumeTypes; import org.toop.framework.resource.types.AudioResource; public interface VolumeManager { - void setVolume(double newVolume, VolumeTypes types, AudioManager... ams); - double getVolume(); - double getFxVolume(); - double getMusicVolume(); + void setVolume(double newVolume, VolumeTypes type); + double getVolume(VolumeTypes type); + void updateAllVolumes(); }