stabilize MPV playback, adjust some intervals and timeouts. Make TaskProcess give more proper process state - so ProcessService wont kill process in state of starting or shutdowning

This commit is contained in:
mykola2312 2024-04-29 12:47:52 +03:00
parent b80f8f4b29
commit 59801a6ddd
5 changed files with 53 additions and 5 deletions

View file

@ -18,6 +18,7 @@ import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.mykola2312.mptv.task.TaskProcess; import com.mykola2312.mptv.task.TaskProcess;
import com.mykola2312.mptv.task.TaskProcessState;
public class MPV implements TaskProcess { public class MPV implements TaskProcess {
private static final Logger logger = LoggerFactory.getLogger(MPV.class); private static final Logger logger = LoggerFactory.getLogger(MPV.class);
@ -25,6 +26,8 @@ public class MPV implements TaskProcess {
private final String url; private final String url;
private Process process; private Process process;
private TaskProcessState state = TaskProcessState.STOPPED;
public MPV(String url) { public MPV(String url) {
this.url = url; this.url = url;
} }
@ -131,7 +134,10 @@ public class MPV implements TaskProcess {
@Override @Override
public boolean spawn() { public boolean spawn() {
if (state == TaskProcessState.STARTING) return false;
try { try {
state = TaskProcessState.STARTING;
process = Runtime.getRuntime().exec(new String[] { process = Runtime.getRuntime().exec(new String[] {
"mpv", "--vo=gpu", "--ao=pulse", "--fullscreen", "--input-ipc-server=" + MPV_SOCKET_PATH, url "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 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() { private boolean checkPlayback() {
try { try {
@ -182,7 +197,7 @@ public class MPV implements TaskProcess {
return true; return true;
} else { } else {
boolean playbackChanged = (playbackTime - lastPlaybackTime) > PLAYBACK_TIME_DELAY; boolean playbackChanged = (playbackTime - lastPlaybackTime) > 0.1;
lastPlaybackTime = playbackTime; lastPlaybackTime = playbackTime;
return playbackChanged; return playbackChanged;
@ -212,6 +227,8 @@ public class MPV implements TaskProcess {
@Override @Override
public void stop() { public void stop() {
state = TaskProcessState.STOPPING;
if (reader != null) reader.running = false; if (reader != null) reader.running = false;
if (readerThread != null) readerThread.interrupt(); if (readerThread != null) readerThread.interrupt();
if (socket != null) closeConnection(); if (socket != null) closeConnection();
@ -220,6 +237,8 @@ public class MPV implements TaskProcess {
readerThread = null; readerThread = null;
socket = null; socket = null;
process = null; process = null;
state = TaskProcessState.STOPPED;
} }
private int requestIdCounter = 0; private int requestIdCounter = 0;

View file

@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.mykola2312.mptv.Main; import com.mykola2312.mptv.Main;
import com.mykola2312.mptv.task.TaskProcess; import com.mykola2312.mptv.task.TaskProcess;
import com.mykola2312.mptv.task.TaskProcessState;
import com.mykola2312.mptv.ui.MenuAction; import com.mykola2312.mptv.ui.MenuAction;
public class PiIR implements TaskProcess { public class PiIR implements TaskProcess {
@ -24,6 +25,8 @@ public class PiIR implements TaskProcess {
private Process process = null; private Process process = null;
private InputStream input = null; private InputStream input = null;
private TaskProcessState state;
private class PiIRReader implements Runnable { private class PiIRReader implements Runnable {
private final PiIR piir; private final PiIR piir;
private final InputStream input; private final InputStream input;
@ -118,7 +121,10 @@ public class PiIR implements TaskProcess {
@Override @Override
public boolean spawn() { public boolean spawn() {
if (state == TaskProcessState.STARTING) return false;
try { try {
state = TaskProcessState.STARTING;
process = Runtime.getRuntime().exec(new String[] { process = Runtime.getRuntime().exec(new String[] {
"unbuffer", exec, "dump", "--gpio", String.valueOf(gpio) "unbuffer", exec, "dump", "--gpio", String.valueOf(gpio)
}); });
@ -131,7 +137,17 @@ public class PiIR implements TaskProcess {
readerThread = new Thread(reader); readerThread = new Thread(reader);
readerThread.start(); readerThread.start();
return isAlive(); if (process.isAlive()) {
state = TaskProcessState.RUNNING;
return true;
} else {
return false;
}
}
@Override
public TaskProcessState getTaskState() {
return state;
} }
@Override @Override
@ -141,6 +157,8 @@ public class PiIR implements TaskProcess {
@Override @Override
public void stop() { public void stop() {
state = TaskProcessState.STOPPING;
if (reader != null) reader.running = false; if (reader != null) reader.running = false;
if (readerThread != null) readerThread.interrupt(); if (readerThread != null) readerThread.interrupt();
if (input != null) { if (input != null) {
@ -154,6 +172,8 @@ public class PiIR implements TaskProcess {
reader = null; reader = null;
readerThread = null; readerThread = null;
process = null; process = null;
state = TaskProcessState.STOPPED;
} }
public void handleDump(PiIRDump dump) { public void handleDump(PiIRDump dump) {

View file

@ -28,7 +28,7 @@ public class ProcessService implements Task {
@Override @Override
public void dispatch() { public void dispatch() {
for (TaskProcess process : processes) { for (TaskProcess process : processes) {
if (!process.isAlive()) { if (process.getTaskState() == TaskProcessState.RUNNING && !process.isAlive()) {
logger.info("restarting process " + process.toString()); logger.info("restarting process " + process.toString());
try { try {
process.stop(); process.stop();

View file

@ -2,6 +2,7 @@ package com.mykola2312.mptv.task;
public interface TaskProcess { public interface TaskProcess {
public boolean spawn(); public boolean spawn();
public TaskProcessState getTaskState();
public boolean isAlive(); public boolean isAlive();
public void stop(); public void stop();
} }

View file

@ -0,0 +1,8 @@
package com.mykola2312.mptv.task;
public enum TaskProcessState {
STOPPED,
STARTING,
RUNNING,
STOPPING
}