Added a LED controller that consumes LED frames from the modes
[kaka/cakelight.git] / src / kaka / cakelight / VideoMode.java
... / ...
CommitLineData
1package kaka.cakelight;
2
3import java.io.File;
4import java.io.IOException;
5import java.util.Optional;
6import java.util.function.Consumer;
7
8public class VideoMode extends Mode implements Consumer<Optional<File>> {
9 private Configuration config;
10 private Thread thread;
11 private Consumer<Frame> frameConsumer;
12 private VideoDeviceListener deviceListener;
13
14 public VideoMode() {
15 deviceListener = new VideoDeviceListener();
16 deviceListener.onVideoDeviceChange(this);
17 }
18
19 @Override
20 public void enter(Configuration config) {
21 this.config = config;
22 deviceListener.startListening();
23 }
24
25 @Override
26 public void exit() {
27 thread.interrupt();
28 deviceListener.stopListening();
29 }
30
31 private void startGrabberThread(File videoDevice) {
32 assert frameConsumer != null;
33 thread = new Thread() {
34 public void run() {
35 try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) {
36 while (!isInterrupted()) {
37 Optional<Frame> frame = grabber.grabFrame();
38 if (frameConsumer != null) frame.ifPresent(frameConsumer);
39 frame.ifPresent(VideoMode.this::onFrame);
40// timeIt("frame", grabber::grabFrame);
41 // TODO: process frame
42 // TODO: save where the LedController can access it
43 }
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48 };
49 thread.start();
50 }
51
52 public void onVideoFrame(Consumer<Frame> consumer) {
53 frameConsumer = consumer;
54 }
55
56 private void onFrame(Frame frame) {
57 assert frameListener != null;
58 frameListener.accept(frame.getLedFrame());
59 }
60
61 @Override
62 public void accept(Optional<File> videoDevice) {
63 // Should only happen when this mode is active!
64 if (thread != null) {
65 thread.interrupt();
66 }
67 videoDevice.ifPresent(this::startGrabberThread);
68 }
69}