mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 19:04:49 +00:00
Fixed AudioVolumemanager, all volumes calculations are now made in VolumeTypes enum
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user