X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2FVideoMode.java;h=e0dc386417a58802c02b4adaca08f389646f3bd3;hb=03670958a5eab132a4f1a6ae5ae58b88f55bfe2f;hp=53cf09b5f8076562a2a1f78fcf4525ffbd08b17f;hpb=100b82fe1c5ada6ef2ce768bf7b9f6f469650e11;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/VideoMode.java b/src/kaka/cakelight/VideoMode.java index 53cf09b..e0dc386 100644 --- a/src/kaka/cakelight/VideoMode.java +++ b/src/kaka/cakelight/VideoMode.java @@ -1,33 +1,38 @@ 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 implements Mode, Consumer> { private Configuration config; private Thread thread; private Consumer frameConsumer; + private VideoDeviceListener deviceListener; + + public VideoMode() { + deviceListener = new VideoDeviceListener(); + deviceListener.onVideoDeviceChange(this); + } @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 = grabber.grabFrame(); grabber.grabFrame().ifPresent(frameConsumer); @@ -46,4 +51,13 @@ public class VideoMode implements Mode { public void onFrame(Consumer consumer) { frameConsumer = consumer; } + + @Override + public void accept(Optional videoDevice) { + // Should only happen when this mode is active! + if (thread != null) { + thread.interrupt(); + } + videoDevice.ifPresent(this::startGrabberThread); + } }