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 24a4014d4e2cee496016d9c95c190ba06f01464b..a3b74901b382f7546931d054a80fe7341bebed91 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 @@ -6,10 +6,7 @@ import de.tobias.playpad.audio.AudioHandler; import de.tobias.playpad.audio.AudioRegistry; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.PadStatus; -import de.tobias.playpad.pad.content.play.Durationable; -import de.tobias.playpad.pad.content.play.Equalizeable; -import de.tobias.playpad.pad.content.play.Pauseable; -import de.tobias.playpad.pad.content.play.Seekable; +import de.tobias.playpad.pad.content.play.*; import de.tobias.playpad.pad.fade.Fade; import de.tobias.playpad.pad.fade.FadeDelegate; import de.tobias.playpad.pad.fade.Fadeable; @@ -26,7 +23,8 @@ import javafx.util.Duration; import java.nio.file.Files; import java.nio.file.Path; -public class AudioContent extends PadContent implements Pauseable, Durationable, Fadeable, Equalizeable, FadeDelegate, Seekable { +public class AudioContent extends PadContent implements Pauseable, Durationable, Fadeable, + Equalizeable, FadeDelegate, Seekable, SpeedAdjustable { private final String type; @@ -36,6 +34,7 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, private ObjectProperty<Duration> positionProperty = new SimpleObjectProperty<>(); private ChangeListener<Number> volumeListener; + private ChangeListener<Number> rateListener; private Fade fade; @@ -45,7 +44,8 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, fade = new Fade(this); // Pad Volume Listener - volumeListener = (a, b, c) -> updateVolume(); + volumeListener = (a, oldValue, newValue) -> updateVolume(); + rateListener = (a, oldValue, newValue) -> setCurrentRate(newValue.doubleValue()); } @Override @@ -83,6 +83,21 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, } } + @Override + public double currentRate() { + if (audioHandler instanceof SpeedAdjustable) { + return ((SpeedAdjustable) audioHandler).currentRate(); + } + return -1; + } + + @Override + public void setCurrentRate(double rate) { + if (audioHandler instanceof SpeedAdjustable) { + ((SpeedAdjustable) audioHandler).setCurrentRate(rate); + } + } + @Override public void fadeIn() { Pad pad = getPad(); @@ -171,6 +186,7 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, positionProperty.bind(audioHandler.positionProperty()); getPad().getPadSettings().volumeProperty().addListener(volumeListener); + getPad().getPadSettings().speedProperty().addListener(rateListener); updateVolume(); } else { @@ -194,6 +210,7 @@ public class AudioContent extends PadContent implements Pauseable, Durationable, positionProperty.unbind(); getPad().getPadSettings().volumeProperty().removeListener(volumeListener); + getPad().getPadSettings().speedProperty().removeListener(rateListener); if (audioHandler != null) audioHandler.unloadMedia(); diff --git a/PlayWallComponents/src/main/java/de/tobias/playpad/audio/JavaFXAudioHandler.java b/PlayWallComponents/src/main/java/de/tobias/playpad/audio/JavaFXAudioHandler.java index 974db0addbda438f953c296172fd6a52c40a90e0..23dc9515b36df09919a02808a16d91ada58aa840 100644 --- a/PlayWallComponents/src/main/java/de/tobias/playpad/audio/JavaFXAudioHandler.java +++ b/PlayWallComponents/src/main/java/de/tobias/playpad/audio/JavaFXAudioHandler.java @@ -3,6 +3,7 @@ package de.tobias.playpad.audio; import de.tobias.playpad.pad.PadStatus; import de.tobias.playpad.pad.content.PadContent; import de.tobias.playpad.pad.content.play.Seekable; +import de.tobias.playpad.pad.content.play.SpeedAdjustable; import javafx.application.Platform; import javafx.beans.property.*; import javafx.scene.media.AudioEqualizer; @@ -12,7 +13,7 @@ import javafx.util.Duration; import java.nio.file.Path; -public class JavaFXAudioHandler extends AudioHandler implements AudioEqualizeable, Seekable { +public class JavaFXAudioHandler extends AudioHandler implements AudioEqualizeable, Seekable, SpeedAdjustable { private Media media; private MediaPlayer player; @@ -83,6 +84,16 @@ public class JavaFXAudioHandler extends AudioHandler implements AudioEqualizeabl } } + @Override + public double currentRate() { + return player.getCurrentRate(); + } + + @Override + public void setCurrentRate(double rate) { + player.setRate(rate); + } + @Override public boolean isMediaLoaded() { return player != null; diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java index 820a217cc7e59d80699070df74c40d83e7605066..b5dd8aacb8747da2a2722a3f12f3cf091eb6c115 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java @@ -29,6 +29,7 @@ import javafx.collections.ObservableList; import org.dom4j.Element; import java.nio.file.Path; +import java.util.Objects; import java.util.UUID; /** @@ -601,7 +602,7 @@ public class Pad implements Cloneable { Pad pad = (Pad) o; - return uuid != null ? uuid.equals(pad.uuid) : pad.uuid == null; + return Objects.equals(uuid, pad.uuid); } // Clone diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java index e1efe36477382090705316672bffa9f56d437152..08ee050db8d224474e960ed54b41b6bc64479523 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java @@ -25,6 +25,7 @@ public class PadSettings implements Cloneable { // Settings private DoubleProperty volumeProperty = new SimpleDoubleProperty(1.0); + private DoubleProperty speedProperty = new SimpleDoubleProperty(1.0); private BooleanProperty loopProperty = new SimpleBooleanProperty(false); private ObjectProperty<TimeMode> timeModeProperty = new SimpleObjectProperty<>(); private ObjectProperty<Fade> fadeProperty = new SimpleObjectProperty<>(); @@ -34,7 +35,6 @@ public class PadSettings implements Cloneable { private ModernCartDesign design; private HashMap<TriggerPoint, Trigger> triggers = new HashMap<>(); - private HashMap<String, Object> customSettings = new HashMap<>(); // Sync Listener @@ -72,6 +72,19 @@ public class PadSettings implements Cloneable { return volumeProperty; } + public double getSpeed() { + return speedProperty.get(); + } + + public void setSpeed(double rate) { + this.speedProperty.set(rate); + } + + public DoubleProperty speedProperty() { + return speedProperty; + } + + public boolean isLoop() { return loopProperty.get(); } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/play/SpeedAdjustable.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/play/SpeedAdjustable.java new file mode 100644 index 0000000000000000000000000000000000000000..1c5ce48bd20dbb058b82ab39d6fb08c68bf9185f --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/play/SpeedAdjustable.java @@ -0,0 +1,7 @@ +package de.tobias.playpad.pad.content.play; + +public interface SpeedAdjustable { + double currentRate(); + + void setCurrentRate(double rate); +} diff --git a/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib b/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib index b6356971661d037303822711c6430b6a7dc38c96..ae1a1c469a26c1ae31c1a13001120d47baaa6a3f 100755 Binary files a/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib and b/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib differ