package kaka.cakelight;
+import java.io.File;
import java.io.IOException;
import java.util.Optional;
+import java.util.function.Consumer;
-import static kaka.cakelight.Main.log;
-import static kaka.cakelight.Main.timeIt;
-
-public class VideoMode implements Mode {
+public class VideoMode extends Mode {
private Configuration config;
private Thread thread;
+ private Consumer<Frame> frameConsumer;
+ private VideoDeviceListener deviceListener;
+
+ public VideoMode() {
+ deviceListener = new VideoDeviceListener();
+ deviceListener.onVideoDeviceChange(this::onVideoDeviceChange);
+ }
@Override
public void enter(Configuration config) {
this.config = config;
- startGrabberThread();
+ deviceListener.startListening();
}
@Override
public void exit() {
thread.interrupt();
+ deviceListener.stopListening();
}
- private void startGrabberThread() {
+ private void startGrabberThread(File videoDevice) {
+ assert frameConsumer != null;
thread = new Thread() {
public void run() {
- try (FrameGrabber grabber = FrameGrabber.from(config)) {
+ try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) {
while (!isInterrupted()) {
-// Optional<Frame> frame = grabber.grabFrame();
- timeIt("frame", grabber::grabFrame);
+ Optional<Frame> frame = grabber.grabFrame();
+ if (frameConsumer != null) frame.ifPresent(frameConsumer);
+ frame.ifPresent(VideoMode.this::onFrame);
+// timeIt("frame", grabber::grabFrame);
// TODO: process frame
// TODO: save where the LedController can access it
}
};
thread.start();
}
+
+ public void onVideoFrame(Consumer<Frame> consumer) {
+ frameConsumer = consumer;
+ }
+
+ private void onFrame(Frame frame) {
+ assert frameListener != null;
+ frameListener.accept(frame.getLedFrame());
+ }
+
+ public void onVideoDeviceChange(Optional<File> videoDevice) {
+ // Should only happen when this mode is active!
+ if (thread != null) {
+ thread.interrupt();
+ }
+ videoDevice.ifPresent(this::startGrabberThread);
+ }
}