From d7b8546868ade1aec919dcbcdf2b0bf3ab1a227d Mon Sep 17 00:00:00 2001
From: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Date: Tue, 10 Nov 2015 17:14:29 -0500
Subject: [PATCH] video: disconnect preview

lambda registered for frameUpdated was still alive after closing the window.
It was consuming frames, preventing the call to get them.
It's a limitation of our implementetation: there is only one possible receiver
of frameUpdated for a given renderer.

Tuleap: #130
Change-Id: Ic8f5b8efea60e3409c77e4510320e3eba11fe21d
---
 src/VideoPrefsVC.mm | 53 ++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 25 deletions(-)

diff --git a/src/VideoPrefsVC.mm b/src/VideoPrefsVC.mm
index f86ed47f..c99f4ac9 100644
--- a/src/VideoPrefsVC.mm
+++ b/src/VideoPrefsVC.mm
@@ -99,17 +99,12 @@ QMetaObject::Connection previewStopped;
 
     }
 
-    // check if preview has to be started/stopped by this controller
-    self.shouldHandlePreview = !Video::PreviewManager::instance().isPreviewing();
-
     [previewView setWantsLayer:YES];
     [previewView setLayer:[CALayer layer]];
     [previewView.layer setBackgroundColor:[NSColor blackColor].CGColor];
     [previewView.layer setContentsGravity:kCAGravityResizeAspect];
     [previewView.layer setFrame:previewView.frame];
     [previewView.layer setBounds:previewView.frame];
-
-    [self connectPreviewSignals];
 }
 
 - (IBAction)chooseDevice:(id)sender {
@@ -135,32 +130,33 @@ QMetaObject::Connection previewStopped;
     QObject::disconnect(frameUpdated);
     QObject::disconnect(previewStopped);
     QObject::disconnect(previewStarted);
+
     previewStarted = QObject::connect(&Video::PreviewManager::instance(),
-                                             &Video::PreviewManager::previewStarted,
-                                             [=](Video::Renderer* renderer) {
-                                                 NSLog(@"Preview started");
-                                                 QObject::disconnect(frameUpdated);
-                                                 frameUpdated = QObject::connect(renderer,
-                                                                                 &Video::Renderer::frameUpdated,
-                                                                                 [=]() {
-                                                                                     [self renderer:Video::PreviewManager::instance().previewRenderer() renderFrameForView:previewView];
-                                                                                 });
-                                             });
+                                      &Video::PreviewManager::previewStarted,
+                                      [=](Video::Renderer* renderer) {
+                                          NSLog(@"Preview started");
+                                          QObject::disconnect(frameUpdated);
+                                          frameUpdated = QObject::connect(renderer,
+                                                                          &Video::Renderer::frameUpdated,
+                                                                          [=]() {
+                                                                              [self renderer:Video::PreviewManager::instance().previewRenderer() renderFrameForView:previewView];
+                                                                          });
+                                      });
 
     previewStopped = QObject::connect(&Video::PreviewManager::instance(),
-                                             &Video::PreviewManager::previewStopped,
-                                             [=](Video::Renderer* renderer) {
-                                                 NSLog(@"Preview stopped");
-                                                 QObject::disconnect(frameUpdated);
-                                                 [previewView.layer setContents:nil];
-                                             });
+                                      &Video::PreviewManager::previewStopped,
+                                      [=](Video::Renderer* renderer) {
+                                          NSLog(@"Preview stopped");
+                                          QObject::disconnect(frameUpdated);
+                                          [previewView.layer setContents:nil];
+                                      });
 
     frameUpdated = QObject::connect(Video::PreviewManager::instance().previewRenderer(),
-                                                  &Video::Renderer::frameUpdated,
-                                                  [=]() {
-                                                      [self renderer:Video::PreviewManager::instance().previewRenderer()
+                                    &Video::Renderer::frameUpdated,
+                                    [=]() {
+                                        [self renderer:Video::PreviewManager::instance().previewRenderer()
                                                   renderFrameForView:previewView];
-                                                  });
+                                    });
 }
 
 -(void) renderer: (Video::Renderer*)renderer renderFrameForView:(NSView*) view
@@ -197,6 +193,10 @@ QMetaObject::Connection previewStopped;
 
 - (void) viewWillAppear
 {
+    // check if preview has to be started/stopped by this controller
+    self.shouldHandlePreview = !Video::PreviewManager::instance().previewRenderer()->isRendering();
+
+    [self connectPreviewSignals];
     if (self.shouldHandlePreview) {
         Video::PreviewManager::instance().startPreview();
     }
@@ -204,6 +204,9 @@ QMetaObject::Connection previewStopped;
 
 - (void)viewWillDisappear
 {
+    QObject::disconnect(frameUpdated);
+    QObject::disconnect(previewStopped);
+    QObject::disconnect(previewStarted);
     if (self.shouldHandlePreview) {
         Video::PreviewManager::instance().stopPreview();
     }
-- 
GitLab