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.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;

View file

@ -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) {

View file

@ -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();

View file

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

View file

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