Synchronize on threads on wait/notify
[kaka/cakelight.git] / src / kaka / cakelight / mode / VideoMode.java
index 1f43ffb..41b599a 100644 (file)
@@ -15,6 +15,7 @@ public class VideoMode extends Mode {
     private Thread grabberThread;
     private Consumer<VideoFrame> frameConsumer;
     private VideoDeviceListener deviceListener;
+    private boolean isPaused = false;
 
     public VideoMode() {
         deviceListener = new VideoDeviceListener();
@@ -29,16 +30,15 @@ public class VideoMode extends Mode {
 
     @Override
     public void pause() {
-        try {
-            grabberThread.wait();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
+        isPaused = true;
     }
 
     @Override
     public void resume() {
-        grabberThread.notify();
+        isPaused = false;
+       synchronized (grabberThread) {
+           grabberThread.notify();
+       }
     }
 
     @Override
@@ -54,11 +54,16 @@ public class VideoMode extends Mode {
                 try (FrameGrabber grabber = FrameGrabber.from(videoDevice, config)) {
                     while (!isInterrupted()) {
                         Optional<VideoFrame> frame = grabber.grabFrame();
+                        if (isPaused) {
+                           synchronized (grabberThread) {
+                               wait();
+                           }
+                        }
                         if (frameConsumer != null) frame.ifPresent(frameConsumer);
                         frame.ifPresent(VideoMode.this::onVideoFrame);
 //                        timeIt("frame", grabber::grabFrame);
                     }
-                } catch (IOException e) {
+                } catch (IOException | InterruptedException e) {
                     e.printStackTrace();
                 }
             }