diff --git a/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java b/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java index c49bbd13df0cc78bf46c5a161e79b0f23c1000fe..d393c5fad53cf6506ba688e1cd88fb2b63abfb29 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java +++ b/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java @@ -212,6 +212,7 @@ public class PlayPadImpl implements PlayPad { initializer.submit(new KeyboardDefaultMappingTask()); initializer.submit(new ServiceInitializationTask()); + initializer.submit(new ListenerRegistrationTask()); initializer.submit(new VersionizerSetupTask()); initializer.submit(new ComponentLoadingTask()); diff --git a/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java b/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java index 3e3d063945f35329000eb53eb51c7aa3299d4754..9ac9d7d961bdefb10bddbcffb81f65cf4e8d10b8 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java +++ b/PlayWall/src/main/java/de/tobias/playpad/pad/content/AudioContent.java @@ -134,8 +134,8 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, @Override public void onFadeLevelChange(double level) { - Pad pad = getPad(); - audioHandler.setVolume(level * VolumeManager.getInstance().computeVolume(pad)); + final double newVolume = VolumeManager.getInstance().computeVolume(getPad()) * level; + audioHandler.setVolume(newVolume); } @Override diff --git a/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerItem.java b/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerItem.java index 96c9ca10899eb9ec564720a974414acce4d05f1c..88fb85bc6d345ff4b1df884d2c7c42152a949f8d 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerItem.java +++ b/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerItem.java @@ -21,7 +21,7 @@ public class VolumeTriggerItem extends TriggerItem { private Duration duration = new Duration(2000); private List<UUID> uuids; - private String type; + private final String type; VolumeTriggerItem(String type) { super(); @@ -58,11 +58,17 @@ public class VolumeTriggerItem extends TriggerItem { public void performAction(Pad pad, Project project, IMainViewController controller, Profile profile) { uuids.stream().map(project::getPad) .filter(i -> i.getContent() instanceof Fadeable) - .forEach(destination -> { - Fadeable fadeable = (Fadeable) destination.getContent(); + .forEach(targetPad -> { + final Fadeable fadeable = (Fadeable) targetPad.getContent(); - final double start = VolumeManager.getInstance().computeVolume(destination); - fadeable.fade(start, volume, duration, null); + // Use pad * last VolumeTrigger + final double start = VolumeManager.getInstance().computeVolume(targetPad) * VolumeTriggerVolumeFilter.getInstance().getVolume(pad); + // Use pad * target VolumeTrigger + final double destination = VolumeManager.getInstance().computeVolume(targetPad) * volume; + // Update VolumeTrigger + VolumeTriggerVolumeFilter.getInstance().setVolume(pad, volume); + + fadeable.fade(start, destination, duration, null); }); } diff --git a/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerVolumeFilter.java b/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerVolumeFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..b8dad1b748745a1c7415029d505a191865be0e24 --- /dev/null +++ b/PlayWall/src/main/java/de/tobias/playpad/trigger/VolumeTriggerVolumeFilter.java @@ -0,0 +1,52 @@ +package de.tobias.playpad.trigger; + +import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadStatus; +import de.tobias.playpad.plugin.PadListener; +import de.tobias.playpad.volume.VolumeFilter; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class VolumeTriggerVolumeFilter implements VolumeFilter, PadListener { + + private static VolumeTriggerVolumeFilter instance; + + public static VolumeTriggerVolumeFilter getInstance() { + if (instance == null) { + instance = new VolumeTriggerVolumeFilter(); + } + return instance; + } + + private VolumeTriggerVolumeFilter() { + // nothing to do + } + + private final Map<UUID, Double> volumes = new HashMap<>(); + + @Override + public double getVolume(Pad pad) { + return volumes.getOrDefault(pad.getUuid(), 1.0); + } + + public void setVolume(Pad pad, double newVolume) { + volumes.put(pad.getUuid(), newVolume); + } + + // Pad Listener + + + @Override + public void onNameChanged(Pad pad, String oldValue, String newValue) { + // nothing to do + } + + @Override + public void onStatusChange(Pad pad, PadStatus newValue) { + if (newValue == PadStatus.READY) { + volumes.remove(pad.getUuid()); + } + } +} diff --git a/PlayWall/src/main/scala/de/tobias/playpad/initialize/ListenerRegistrationTask.scala b/PlayWall/src/main/scala/de/tobias/playpad/initialize/ListenerRegistrationTask.scala new file mode 100644 index 0000000000000000000000000000000000000000..5ab0117dad7486c416596fcc3d2c13952d808cb8 --- /dev/null +++ b/PlayWall/src/main/scala/de/tobias/playpad/initialize/ListenerRegistrationTask.scala @@ -0,0 +1,13 @@ +package de.tobias.playpad.initialize + +import de.thecodelabs.utils.application +import de.tobias.playpad.PlayPadImpl +import de.tobias.playpad.trigger.VolumeTriggerVolumeFilter + +class ListenerRegistrationTask extends PlayPadInitializeTask { + override def name(): String = "ListenerRegistration" + + override def run(app: application.App, instance: PlayPadImpl): Unit = { + instance.addPadListener(VolumeTriggerVolumeFilter.getInstance()) + } +} diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java index 3923a9e07e8f171ce6b4c2ea714d6ed273136694..21eb241dc28053bba7ffbb8787a8874b8f840a06 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/fade/AbstractFadeController.java @@ -1,5 +1,6 @@ package de.tobias.playpad.pad.fade; +import de.thecodelabs.logger.Logger; import javafx.animation.Transition; import javafx.util.Duration; @@ -42,6 +43,8 @@ public abstract class AbstractFadeController { } public void fade(double from, double to, Duration duration, Runnable onFinish) { + Logger.debug("Fading from {0} to {1} in {2}", from, to, duration); + if (currentFadeTransition != null) { currentFadeTransition.stop(); }