diff --git a/src/main/java/com/mykola2312/mptv/mpv/MPV.java b/src/main/java/com/mykola2312/mptv/mpv/MPV.java index 93a19e2..e247cc4 100644 --- a/src/main/java/com/mykola2312/mptv/mpv/MPV.java +++ b/src/main/java/com/mykola2312/mptv/mpv/MPV.java @@ -18,6 +18,7 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; import com.mykola2312.mptv.task.TaskProcess; +import com.mykola2312.mptv.task.TaskProcessState; public class MPV implements TaskProcess { private static final Logger logger = LoggerFactory.getLogger(MPV.class); @@ -25,6 +26,8 @@ public class MPV implements TaskProcess { private final String url; private Process process; + private TaskProcessState state = TaskProcessState.STOPPED; + public MPV(String url) { this.url = url; } @@ -131,7 +134,10 @@ public class MPV implements TaskProcess { @Override public boolean spawn() { + if (state == TaskProcessState.STARTING) return false; try { + state = TaskProcessState.STARTING; + process = Runtime.getRuntime().exec(new String[] { "mpv", "--vo=gpu", "--ao=pulse", "--fullscreen", "--input-ipc-server=" + MPV_SOCKET_PATH, url }); @@ -147,10 +153,19 @@ public class MPV implements TaskProcess { return false; } - return process.isAlive(); + if (process.isAlive()) { + state = TaskProcessState.RUNNING; + return true; + } else { + state = TaskProcessState.STOPPED; + return false; + } } - private static final float PLAYBACK_TIME_DELAY = 2.5f; + @Override + public TaskProcessState getTaskState() { + return state; + } private boolean checkPlayback() { try { @@ -182,7 +197,7 @@ public class MPV implements TaskProcess { return true; } else { - boolean playbackChanged = (playbackTime - lastPlaybackTime) > PLAYBACK_TIME_DELAY; + boolean playbackChanged = (playbackTime - lastPlaybackTime) > 0.1; lastPlaybackTime = playbackTime; return playbackChanged; @@ -212,6 +227,8 @@ public class MPV implements TaskProcess { @Override public void stop() { + state = TaskProcessState.STOPPING; + if (reader != null) reader.running = false; if (readerThread != null) readerThread.interrupt(); if (socket != null) closeConnection(); @@ -220,6 +237,8 @@ public class MPV implements TaskProcess { readerThread = null; socket = null; process = null; + + state = TaskProcessState.STOPPED; } private int requestIdCounter = 0; diff --git a/src/main/java/com/mykola2312/mptv/piir/PiIR.java b/src/main/java/com/mykola2312/mptv/piir/PiIR.java index 2345acd..e35683a 100644 --- a/src/main/java/com/mykola2312/mptv/piir/PiIR.java +++ b/src/main/java/com/mykola2312/mptv/piir/PiIR.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; import com.mykola2312.mptv.Main; import com.mykola2312.mptv.task.TaskProcess; +import com.mykola2312.mptv.task.TaskProcessState; import com.mykola2312.mptv.ui.MenuAction; public class PiIR implements TaskProcess { @@ -24,6 +25,8 @@ public class PiIR implements TaskProcess { private Process process = null; private InputStream input = null; + private TaskProcessState state; + private class PiIRReader implements Runnable { private final PiIR piir; private final InputStream input; @@ -118,7 +121,10 @@ public class PiIR implements TaskProcess { @Override public boolean spawn() { + if (state == TaskProcessState.STARTING) return false; try { + state = TaskProcessState.STARTING; + process = Runtime.getRuntime().exec(new String[] { "unbuffer", exec, "dump", "--gpio", String.valueOf(gpio) }); @@ -131,7 +137,17 @@ public class PiIR implements TaskProcess { readerThread = new Thread(reader); readerThread.start(); - return isAlive(); + if (process.isAlive()) { + state = TaskProcessState.RUNNING; + return true; + } else { + return false; + } + } + + @Override + public TaskProcessState getTaskState() { + return state; } @Override @@ -141,6 +157,8 @@ public class PiIR implements TaskProcess { @Override public void stop() { + state = TaskProcessState.STOPPING; + if (reader != null) reader.running = false; if (readerThread != null) readerThread.interrupt(); if (input != null) { @@ -154,6 +172,8 @@ public class PiIR implements TaskProcess { reader = null; readerThread = null; process = null; + + state = TaskProcessState.STOPPED; } public void handleDump(PiIRDump dump) { diff --git a/src/main/java/com/mykola2312/mptv/task/ProcessService.java b/src/main/java/com/mykola2312/mptv/task/ProcessService.java index f3e7e81..d79e9f6 100644 --- a/src/main/java/com/mykola2312/mptv/task/ProcessService.java +++ b/src/main/java/com/mykola2312/mptv/task/ProcessService.java @@ -28,7 +28,7 @@ public class ProcessService implements Task { @Override public void dispatch() { for (TaskProcess process : processes) { - if (!process.isAlive()) { + if (process.getTaskState() == TaskProcessState.RUNNING && !process.isAlive()) { logger.info("restarting process " + process.toString()); try { process.stop(); diff --git a/src/main/java/com/mykola2312/mptv/task/TaskProcess.java b/src/main/java/com/mykola2312/mptv/task/TaskProcess.java index 2cfb074..734184d 100644 --- a/src/main/java/com/mykola2312/mptv/task/TaskProcess.java +++ b/src/main/java/com/mykola2312/mptv/task/TaskProcess.java @@ -2,6 +2,7 @@ package com.mykola2312.mptv.task; public interface TaskProcess { public boolean spawn(); + public TaskProcessState getTaskState(); public boolean isAlive(); public void stop(); } diff --git a/src/main/java/com/mykola2312/mptv/task/TaskProcessState.java b/src/main/java/com/mykola2312/mptv/task/TaskProcessState.java new file mode 100644 index 0000000..4ff5c6c --- /dev/null +++ b/src/main/java/com/mykola2312/mptv/task/TaskProcessState.java @@ -0,0 +1,8 @@ +package com.mykola2312.mptv.task; + +public enum TaskProcessState { + STOPPED, + STARTING, + RUNNING, + STOPPING +}