mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 10:54:51 +00:00
Fixed AudioVolumemanager, all volumes calculations are now made in VolumeTypes enum
This commit is contained in:
@@ -2,6 +2,7 @@ package org.toop;
|
|||||||
|
|
||||||
import org.toop.app.App;
|
import org.toop.app.App;
|
||||||
import org.toop.framework.audio.*;
|
import org.toop.framework.audio.*;
|
||||||
|
import org.toop.framework.audio.interfaces.VolumeManager;
|
||||||
import org.toop.framework.networking.NetworkingClientManager;
|
import org.toop.framework.networking.NetworkingClientManager;
|
||||||
import org.toop.framework.networking.NetworkingInitializationException;
|
import org.toop.framework.networking.NetworkingInitializationException;
|
||||||
import org.toop.framework.resource.ResourceLoader;
|
import org.toop.framework.resource.ResourceLoader;
|
||||||
@@ -18,11 +19,17 @@ public final class Main {
|
|||||||
ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets"));
|
ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets"));
|
||||||
new Thread(NetworkingClientManager::new).start();
|
new Thread(NetworkingClientManager::new).start();
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
|
var mm = new MusicManager<>(MusicAsset.class);
|
||||||
|
var sem = new SoundEffectManager();
|
||||||
AudioEventListener<?, ?> a =
|
AudioEventListener<?, ?> a =
|
||||||
new AudioEventListener<>(
|
new AudioEventListener<>(
|
||||||
new MusicManager<>(MusicAsset.class),
|
mm,
|
||||||
new SoundEffectManager(),
|
sem,
|
||||||
new AudioVolumeManager()
|
new AudioVolumeManager()
|
||||||
|
.registerManager(VolumeTypes.VOLUME, mm)
|
||||||
|
.registerManager(VolumeTypes.VOLUME, sem)
|
||||||
|
.registerManager(VolumeTypes.FX, sem)
|
||||||
|
.registerManager(VolumeTypes.MUSIC, mm)
|
||||||
); a.initListeners();
|
); a.initListeners();
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,6 @@ import org.toop.framework.audio.interfaces.VolumeManager;
|
|||||||
import org.toop.framework.eventbus.EventFlow;
|
import org.toop.framework.eventbus.EventFlow;
|
||||||
import org.toop.framework.resource.types.AudioResource;
|
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> {
|
public class AudioEventListener<T extends AudioResource, K extends AudioResource> {
|
||||||
private final MusicManager<T> musicManager;
|
private final MusicManager<T> musicManager;
|
||||||
private final SoundEffectManager<K> soundEffectManager;
|
private final SoundEffectManager<K> soundEffectManager;
|
||||||
@@ -60,22 +56,25 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleVolumeChange(AudioEvents.ChangeVolume event) {
|
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) {
|
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) {
|
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) {
|
private void handleGetVolume(AudioEvents.GetCurrentVolume event) {
|
||||||
new EventFlow()
|
new EventFlow()
|
||||||
.addPostEvent(
|
.addPostEvent(
|
||||||
new AudioEvents.GetCurrentVolumeResponse(
|
new AudioEvents.GetCurrentVolumeResponse(
|
||||||
audioVolumeManager.getVolume(),
|
audioVolumeManager.getVolume(VolumeTypes.VOLUME),
|
||||||
event.snowflakeId()))
|
event.snowflakeId()))
|
||||||
.asyncPostEvent();
|
.asyncPostEvent();
|
||||||
}
|
}
|
||||||
@@ -84,7 +83,7 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
|
|||||||
new EventFlow()
|
new EventFlow()
|
||||||
.addPostEvent(
|
.addPostEvent(
|
||||||
new AudioEvents.GetCurrentFxVolumeResponse(
|
new AudioEvents.GetCurrentFxVolumeResponse(
|
||||||
audioVolumeManager.getFxVolume(),
|
audioVolumeManager.getVolume(VolumeTypes.FX),
|
||||||
event.snowflakeId()))
|
event.snowflakeId()))
|
||||||
.asyncPostEvent();
|
.asyncPostEvent();
|
||||||
}
|
}
|
||||||
@@ -93,7 +92,7 @@ public class AudioEventListener<T extends AudioResource, K extends AudioResource
|
|||||||
new EventFlow()
|
new EventFlow()
|
||||||
.addPostEvent(
|
.addPostEvent(
|
||||||
new AudioEvents.GetCurrentMusicVolumeResponse(
|
new AudioEvents.GetCurrentMusicVolumeResponse(
|
||||||
audioVolumeManager.getMusicVolume(),
|
audioVolumeManager.getVolume(VolumeTypes.MUSIC),
|
||||||
event.snowflakeId()))
|
event.snowflakeId()))
|
||||||
.asyncPostEvent();
|
.asyncPostEvent();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,60 +4,32 @@ import org.toop.framework.audio.interfaces.AudioManager;
|
|||||||
import org.toop.framework.audio.interfaces.VolumeManager;
|
import org.toop.framework.audio.interfaces.VolumeManager;
|
||||||
import org.toop.framework.resource.types.AudioResource;
|
import org.toop.framework.resource.types.AudioResource;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public class AudioVolumeManager implements VolumeManager {
|
public class AudioVolumeManager implements VolumeManager {
|
||||||
private double volume = 0.0;
|
|
||||||
private double fxVolume = 0.0;
|
|
||||||
private double musicVolume = 0.0;
|
|
||||||
|
|
||||||
public AudioVolumeManager() {}
|
public void setVolume(double newVolume, VolumeTypes type) {
|
||||||
|
type.setVolume(newVolume, VolumeTypes.VOLUME.getVolume());
|
||||||
private <T extends AudioResource> void updateVolume(T resource, double level) {
|
|
||||||
resource.updateVolume(level);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private double limitVolume(double volume) {
|
public double getVolume(VolumeTypes type) {
|
||||||
return Math.min(1.0, Math.max(0.0, volume / 100));
|
return type.getVolume();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SafeVarargs
|
public AudioVolumeManager registerManager(VolumeTypes type, AudioManager<? extends AudioResource> manager) {
|
||||||
@Override
|
if (manager != null) {
|
||||||
public final void setVolume(double newVolume, VolumeTypes type, AudioManager<? extends AudioResource>... managers) {
|
type.addManager(manager);
|
||||||
double limitedVolume = limitVolume(newVolume);
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case FX -> fxVolume = limitedVolume;
|
|
||||||
case MUSIC -> musicVolume = limitedVolume;
|
|
||||||
default -> volume = limitedVolume;
|
|
||||||
}
|
}
|
||||||
|
return AudioVolumeManager.this;
|
||||||
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))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getVolume() {
|
public void updateAllVolumes() {
|
||||||
return volume * 100;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,59 @@
|
|||||||
package org.toop.framework.audio;
|
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 {
|
public enum VolumeTypes {
|
||||||
VOLUME,
|
VOLUME(),
|
||||||
FX,
|
FX(),
|
||||||
MUSIC,
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,7 @@ import org.toop.framework.audio.VolumeTypes;
|
|||||||
import org.toop.framework.resource.types.AudioResource;
|
import org.toop.framework.resource.types.AudioResource;
|
||||||
|
|
||||||
public interface VolumeManager {
|
public interface VolumeManager {
|
||||||
void setVolume(double newVolume, VolumeTypes types, AudioManager<? extends AudioResource>... ams);
|
void setVolume(double newVolume, VolumeTypes type);
|
||||||
double getVolume();
|
double getVolume(VolumeTypes type);
|
||||||
double getFxVolume();
|
void updateAllVolumes();
|
||||||
double getMusicVolume();
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user