X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2Fmode%2FVideoMode.java;fp=src%2Fkaka%2Fcakelight%2Fmode%2FVideoMode.java;h=91a9f04bb444f952dfec0f6f3b0e44f104c5b7f3;hb=67b0a75891f19e91cc35e23fa56915cfd7cd52de;hp=0000000000000000000000000000000000000000;hpb=8304abc8107c4c4d7334ddc7276e95b8f535ee55;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/mode/VideoMode.java b/src/kaka/cakelight/mode/VideoMode.java new file mode 100644 index 0000000..91a9f04 --- /dev/null +++ b/src/kaka/cakelight/mode/VideoMode.java @@ -0,0 +1,70 @@ +package kaka.cakelight.mode; + +import kaka.cakelight.Configuration; +import kaka.cakelight.FrameGrabber; +import kaka.cakelight.VideoDeviceListener; +import kaka.cakelight.VideoFrame; + +import java.io.File; +import java.io.IOException; +import java.util.Optional; +import java.util.function.Consumer; + +public class VideoMode extends Mode { + private Configuration config; + private Thread grabberThread; + private Consumer frameConsumer; + private VideoDeviceListener deviceListener; + + public VideoMode() { + deviceListener = new VideoDeviceListener(); + deviceListener.onVideoDeviceChange(this::onVideoDeviceChange); + } + + @Override + public void enter(Configuration config) { + this.config = config; + deviceListener.startListening(); + } + + @Override + public void exit() { + grabberThread.interrupt(); + deviceListener.stopListening(); + } + + private void startGrabberThread(File videoDevice) { + assert frameConsumer != null; + grabberThread = new Thread() { + public void run() { + try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) { + while (!isInterrupted()) { + Optional frame = grabber.grabFrame(); + if (frameConsumer != null) frame.ifPresent(frameConsumer); + frame.ifPresent(VideoMode.this::onVideoFrame); +// timeIt("frame", grabber::grabFrame); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + grabberThread.start(); + } + + public void onVideoFrame(Consumer consumer) { + frameConsumer = consumer; + } + + private void onVideoFrame(VideoFrame frame) { + updateWithFrame(frame.getLedFrame()); + } + + public void onVideoDeviceChange(Optional videoDevice) { + // Should only happen when this mode is active! + if (grabberThread != null) { + grabberThread.interrupt(); + } + videoDevice.ifPresent(this::startGrabberThread); + } +}