X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2FVideoMode.java;h=134fa2d33ff574f837af3b68dbd7b0e967ddf4ed;hb=adc29b9a70fa1d03ac67b0b3f397fed7a75f4d7b;hp=be2ee4121526939ed4054e3941403b8db0b271d9;hpb=4a2d60564647052562fad28644904298ba83667b;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/VideoMode.java b/src/kaka/cakelight/VideoMode.java index be2ee41..134fa2d 100644 --- a/src/kaka/cakelight/VideoMode.java +++ b/src/kaka/cakelight/VideoMode.java @@ -1,41 +1,65 @@ 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 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; - startGrabberThread(); + deviceListener.startListening(); } @Override public void exit() { - thread.interrupt(); + grabberThread.interrupt(); + deviceListener.stopListening(); } - private void startGrabberThread() { - thread = new Thread() { + private void startGrabberThread(File videoDevice) { + assert frameConsumer != null; + grabberThread = new Thread() { public void run() { - try (FrameGrabber grabber = FrameGrabber.from(config)) { + try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) { while (!isInterrupted()) { -// Optional frame = grabber.grabFrame(); - timeIt("frame", grabber::grabFrame); - // TODO: process frame - // TODO: save where the LedController can access it + Optional frame = grabber.grabFrame(); + if (frameConsumer != null) frame.ifPresent(frameConsumer); + frame.ifPresent(VideoMode.this::onVideoFrame); +// timeIt("frame", grabber::grabFrame); } } catch (IOException e) { e.printStackTrace(); } } }; - thread.start(); + 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); } }