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:
parent
b80f8f4b29
commit
59801a6ddd
5 changed files with 53 additions and 5 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.mykola2312.mptv.task;
|
|||
|
||||
public interface TaskProcess {
|
||||
public boolean spawn();
|
||||
public TaskProcessState getTaskState();
|
||||
public boolean isAlive();
|
||||
public void stop();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
package com.mykola2312.mptv.task;
|
||||
|
||||
public enum TaskProcessState {
|
||||
STOPPED,
|
||||
STARTING,
|
||||
RUNNING,
|
||||
STOPPING
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue