diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java index 5b21ad95d7c702cfe498a7d722be1db3826460f7..882aa5c0f6fb3da0e81e180dd2eff5a45cb11f7b 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java @@ -28,9 +28,9 @@ public class PadStatusControlListener implements ChangeListener<PadStatus> { PadSettings padSettings = pad.getPadSettings(); ProfileSettings profileSettings = Profile.currentProfile().getProfileSettings(); + PlayPadPlugin.getInstance().getPadListener().forEach(listener -> listener.onStatusChange(pad, newValue)); if (newValue == PadStatus.PLAY) { if (pad.getContent() != null) { - PlayPadPlugin.getInstance().getPadListener().forEach(listener -> listener.onPlay(pad)); pad.getProject().updateActivePlayerProperty(); @@ -45,9 +45,7 @@ public class PadStatusControlListener implements ChangeListener<PadStatus> { } if (pad.getContent() instanceof Fadeable) { - if (oldValue == PadStatus.PAUSE && padSettings.getFade().isFadeInPause()) { - ((Fadeable) pad.getContent()).fadeIn(); - } else if (padSettings.getFade().isFadeInStart()) { + if (padSettings.getFade().isFadeInStart() || (oldValue == PadStatus.PAUSE && padSettings.getFade().isFadeInPause())) { ((Fadeable) pad.getContent()).fadeIn(); } } @@ -56,17 +54,13 @@ public class PadStatusControlListener implements ChangeListener<PadStatus> { } else if (newValue == PadStatus.PAUSE) { if (pad.getContent() instanceof Pauseable) { if (pad.getContent() instanceof Fadeable && padSettings.getFade().isFadeOutPause()) { - ((Fadeable) pad.getContent()).fadeOut(() -> - { - ((Pauseable) pad.getContent()).pause(); - }); + ((Fadeable) pad.getContent()).fadeOut(() -> ((Pauseable) pad.getContent()).pause()); } else { ((Pauseable) pad.getContent()).pause(); } } } else if (newValue == PadStatus.STOP) { if (pad.getContent() != null) { - PlayPadPlugin.getInstance().getPadListener().forEach(listener -> listener.onStop(pad)); pad.getProject().updateActivePlayerProperty(); if (pad.getContent() instanceof Fadeable && !pad.isEof() && padSettings.getFade().isFadeOutStop()) { // Fade nur wenn Pad diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java index ec4388da4c5f31ceb8dcd6c91c1a823d04451d1b..4123e2747cfd1befcfbdd424fef4a4f6d30f26b4 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java @@ -1,6 +1,7 @@ package de.tobias.playpad.plugin; import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadStatus; /** * Listener für ein Pad. @@ -11,17 +12,10 @@ import de.tobias.playpad.pad.Pad; public interface PadListener { /** - * Wird aufgerufen, sobald ein Pad wiedergegeben wird. - * - * @param pad Pad + * Call then ever the status of a pad will be changed + * @param pad corresponding pad + * @param newValue new status value */ - void onPlay(Pad pad); - - /** - * Wird aufgerufen, sobald ein Pad gestoppt wird. - * - * @param pad Pad - */ - void onStop(Pad pad); + void onStatusChange(Pad pad, PadStatus newValue); } \ No newline at end of file diff --git a/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java b/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java index 9e8016037682598e64b0a919a43bed915d49194a..95863b33ae8b771ecf677e9230a870ed52157911 100644 --- a/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java +++ b/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java @@ -9,6 +9,7 @@ import de.thecodelabs.utils.ui.NVCStage; import de.thecodelabs.utils.util.Localization; import de.tobias.playpad.equalizerplugin.Equalizer; import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadStatus; import de.tobias.playpad.pad.content.PadContent; import de.tobias.playpad.pad.content.play.Equalizeable; import de.tobias.playpad.plugin.Module; @@ -73,7 +74,15 @@ public class EqualizerPluginImpl implements PlayPadPluginStub, PluginArtifact, W } @Override - public void onPlay(Pad pad) { + public void onStatusChange(Pad pad, PadStatus newValue) { + if (newValue == PadStatus.PLAY) { + onPlay(pad); + } else if (newValue == PadStatus.STOP) { + onStop(pad); + } + } + + private void onPlay(Pad pad) { PadContent content = pad.getContent(); if (content instanceof Equalizeable) { @@ -89,8 +98,7 @@ public class EqualizerPluginImpl implements PlayPadPluginStub, PluginArtifact, W } } - @Override - public void onStop(Pad pad) { + private void onStop(Pad pad) { PadContent content = pad.getContent(); if (content instanceof Equalizeable) { diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala index a971e03651a2f00a875051a94c15195ec74b1714..051a6c3052182340ad692e1e0db8aeb94e59987f 100644 --- a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala +++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala @@ -2,15 +2,19 @@ package de.tobias.playpad.plugin.api import de.thecodelabs.logger.Logger import de.thecodelabs.plugins.{Plugin, PluginDescriptor} +import de.tobias.playpad.PlayPadPlugin import de.tobias.playpad.plugin.api.websocket.WebSocketHandler +import de.tobias.playpad.plugin.api.websocket.listener.PadStatusListener import spark.Spark class WebApiPlugin extends Plugin { override def startup(pluginDescriptor: PluginDescriptor): Unit = { + PlayPadPlugin.getInstance().addPadListener(new PadStatusListener) + Logger.debug("Enable Web API Plugin") Spark.port(9876) - Spark.webSocket("/api", classOf[WebSocketHandler]) + Spark.webSocket("/api", WebSocketHandler.instance) Spark.get("/", (_, _) => "PlayWall API") } diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/WebSocketHandler.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/WebSocketHandler.scala index 08bc4686781602768c665754a6cadb441be946e3..69b48550f1f043cf02bfea30e3116b3d79c11727 100644 --- a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/WebSocketHandler.scala +++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/WebSocketHandler.scala @@ -45,9 +45,21 @@ class WebSocketHandler { @OnWebSocketError def onError(session: Session, error: Throwable): Unit = { Logger.error(error) } + + def sendUpdate(message: String, jsonObject: JsonObject): Unit = { + jsonObject.addProperty("updateType", message) + val payload = WebSocketHandler.gson.toJson(jsonObject) + + sessions.stream() + .filter(session => session.isOpen) + .forEach(session => session.getRemote.sendString(payload)) + } } object WebSocketHandler { + + lazy val instance: WebSocketHandler = new WebSocketHandler + private val gson = new Gson() def sendResponse(session: Session, message: Message, response: JsonObject) = { diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala new file mode 100644 index 0000000000000000000000000000000000000000..ffd31cb462573fa1630bcf9448d4f4eda0b7a387 --- /dev/null +++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala @@ -0,0 +1,18 @@ +package de.tobias.playpad.plugin.api.websocket.listener + +import com.google.gson.JsonObject +import de.tobias.playpad.pad.{Pad, PadStatus} +import de.tobias.playpad.plugin.PadListener +import de.tobias.playpad.plugin.api.websocket.WebSocketHandler + +class PadStatusListener extends PadListener { + + override def onStatusChange(pad: Pad, newValue: PadStatus): Unit = { + val payload = new JsonObject + + payload.addProperty("pad", pad.getUuid.toString) + payload.addProperty("status", newValue.name()) + + WebSocketHandler.instance.sendUpdate("pad-status-changed", payload) + } +}