Fixed AudioVolumemanager, all volumes calculations are now made in VolumeTypes enum

This commit is contained in:
lieght
2025-10-12 00:37:02 +02:00
parent 73a2fe3da2
commit a766b85a75
5 changed files with 94 additions and 65 deletions

View File

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

View File

@@ -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<T extends AudioResource, K extends AudioResource> {
private final MusicManager<T> musicManager;
private final SoundEffectManager<K> soundEffectManager;
@@ -60,22 +56,25 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
}
private void handleVolumeChange(AudioEvents.ChangeVolume event) {
this.audioVolumeManager.setVolume(event.newVolume(), VolumeTypes.VOLUME, soundEffectManager, musicManager);
this.audioVolumeManager.setVolume(event.newVolume() / 100, VolumeTypes.VOLUME);
this.audioVolumeManager.updateAllVolumes();
}
private void handleFxVolumeChange(AudioEvents.ChangeFxVolume event) {
this.audioVolumeManager.setVolume(event.newVolume(), VolumeTypes.FX, soundEffectManager);
this.audioVolumeManager.setVolume(event.newVolume() / 100, VolumeTypes.FX);
this.audioVolumeManager.updateAllVolumes();
}
private void handleMusicVolumeChange(AudioEvents.ChangeMusicVolume event) {
this.audioVolumeManager.setVolume(event.newVolume(), VolumeTypes.MUSIC, musicManager);
this.audioVolumeManager.setVolume(event.newVolume() / 100, VolumeTypes.MUSIC);
this.audioVolumeManager.updateAllVolumes();
}
private void handleGetVolume(AudioEvents.GetCurrentVolume event) {
new EventFlow()
.addPostEvent(
new AudioEvents.GetCurrentVolumeResponse(
audioVolumeManager.getVolume(),
audioVolumeManager.getVolume(VolumeTypes.VOLUME),
event.snowflakeId()))
.asyncPostEvent();
}
@@ -84,7 +83,7 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
new EventFlow()
.addPostEvent(
new AudioEvents.GetCurrentFxVolumeResponse(
audioVolumeManager.getFxVolume(),
audioVolumeManager.getVolume(VolumeTypes.FX),
event.snowflakeId()))
.asyncPostEvent();
}
@@ -93,7 +92,7 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
new EventFlow()
.addPostEvent(
new AudioEvents.GetCurrentMusicVolumeResponse(
audioVolumeManager.getMusicVolume(),
audioVolumeManager.getVolume(VolumeTypes.MUSIC),
event.snowflakeId()))
.asyncPostEvent();
}

View File

@@ -4,60 +4,32 @@ import org.toop.framework.audio.interfaces.AudioManager;
import org.toop.framework.audio.interfaces.VolumeManager;
import org.toop.framework.resource.types.AudioResource;
import java.util.Arrays;
import java.util.Objects;
public class AudioVolumeManager implements VolumeManager {
private double volume = 0.0;
private double fxVolume = 0.0;
private double musicVolume = 0.0;
public AudioVolumeManager() {}
private <T extends AudioResource> 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<? extends AudioResource>... managers) {
double limitedVolume = limitVolume(newVolume);
switch (type) {
case FX -> fxVolume = limitedVolume;
case MUSIC -> musicVolume = limitedVolume;
default -> volume = limitedVolume;
public AudioVolumeManager registerManager(VolumeTypes type, AudioManager<? extends AudioResource> 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;
}
}
}

View File

@@ -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<AudioManager<? extends AudioResource>> 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<? extends AudioResource> manager) {
if (manager != null && !managers.contains(manager)) {
managers.add(manager);
}
}
public List<AudioManager<? extends AudioResource>> getManagers() {
return Collections.unmodifiableList(managers);
}
}

View File

@@ -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<? extends AudioResource>... ams);
double getVolume();
double getFxVolume();
double getMusicVolume();
void setVolume(double newVolume, VolumeTypes type);
double getVolume(VolumeTypes type);
void updateAllVolumes();
}