1 package kaka.cakelight;
4 import java.io.IOException;
5 import java.util.Optional;
6 import java.util.function.Consumer;
8 public class VideoMode extends Mode {
9 private Configuration config;
10 private Thread grabberThread;
11 private Consumer<VideoFrame> frameConsumer;
12 private VideoDeviceListener deviceListener;
15 deviceListener = new VideoDeviceListener();
16 deviceListener.onVideoDeviceChange(this::onVideoDeviceChange);
20 public void enter(Configuration config) {
22 deviceListener.startListening();
27 grabberThread.interrupt();
28 deviceListener.stopListening();
31 private void startGrabberThread(File videoDevice) {
32 assert frameConsumer != null;
33 grabberThread = new Thread() {
35 try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) {
36 while (!isInterrupted()) {
37 Optional<VideoFrame> frame = grabber.grabFrame();
38 if (frameConsumer != null) frame.ifPresent(frameConsumer);
39 frame.ifPresent(VideoMode.this::onVideoFrame);
40 // timeIt("frame", grabber::grabFrame);
42 } catch (IOException e) {
47 grabberThread.start();
50 public void onVideoFrame(Consumer<VideoFrame> consumer) {
51 frameConsumer = consumer;
54 private void onVideoFrame(VideoFrame frame) {
55 updateWithFrame(frame.getLedFrame());
58 public void onVideoDeviceChange(Optional<File> videoDevice) {
59 // Should only happen when this mode is active!
60 if (grabberThread != null) {
61 grabberThread.interrupt();
63 videoDevice.ifPresent(this::startGrabberThread);