[pitivi] previewers: Flush previewers when shutting down projects



commit e3a55e9961dc8d33ba8dd58a37fb523a5fb91ef6
Author: Thibault Saunier <tsaunier gnome org>
Date:   Wed Aug 16 17:00:52 2017 -0300

    previewers: Flush previewers when shutting down projects
    
    And avoid doing any activity on them until the project has been
    completely teared down.
    
    Without that we will go crazy about starting/stoping preview generation
    while tearing down projects.
    
    Reviewed-by: Alex Băluț <<alexandru balut gmail com>>
    Differential Revision: https://phabricator.freedesktop.org/D1843

 pitivi/timeline/previewers.py |   23 +++++++++++++++++++++--
 pitivi/timeline/timeline.py   |    5 +++++
 2 files changed, 26 insertions(+), 2 deletions(-)
---
diff --git a/pitivi/timeline/previewers.py b/pitivi/timeline/previewers.py
index 7a2e8a9..331adad 100644
--- a/pitivi/timeline/previewers.py
+++ b/pitivi/timeline/previewers.py
@@ -308,6 +308,7 @@ class PreviewGeneratorManager():
             GES.TrackType.AUDIO: [],
             GES.TrackType.VIDEO: []
         }
+        self._running = True
 
     def add_previewer(self, previewer):
         """Adds the specified previewer to the queue.
@@ -332,12 +333,30 @@ class PreviewGeneratorManager():
         previewer.connect("done", self.__previewer_done_cb)
         previewer.startGeneration()
 
+    def start_flushing(self):
+        """Flushes all previewers and start ignoring any update."""
+        if self._running:
+            self._running = False
+            for previewer in list(self._current_previewers.values()):
+                previewer.stopGeneration()
+
+            for previewers in self._previewers.values():
+                for previewer in previewers:
+                    previewer.stopGeneration()
+
+    def stop_flushing(self):
+        """Stop ignoring managed previewers updates."""
+        self._running = True
+
     def __previewer_done_cb(self, previewer):
         track_type = previewer.track_type
         next_previewer = self._current_previewers.pop(track_type, None)
         if next_previewer:
             next_previewer.disconnect_by_func(self.__previewer_done_cb)
 
+        if not self._running:
+            return
+
         if self._previewers[track_type]:
             self._start_previewer(self._previewers[track_type].pop())
 
@@ -350,7 +369,7 @@ class Previewer(Gtk.Layout):
     """
 
     # We only need one PreviewGeneratorManager to manage all previewers.
-    __manager = PreviewGeneratorManager()
+    manager = PreviewGeneratorManager()
 
     def __init__(self, track_type):
         Gtk.Layout.__init__(self)
@@ -367,7 +386,7 @@ class Previewer(Gtk.Layout):
 
     def becomeControlled(self):
         """Lets the PreviewGeneratorManager control our execution."""
-        Previewer.__manager.add_previewer(self)
+        Previewer.manager.add_previewer(self)
 
     def setSelected(self, selected):
         """Marks this instance as being selected."""
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 6747564..6d02d1a 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -38,6 +38,7 @@ from pitivi.timeline.elements import TrimHandle
 from pitivi.timeline.layer import Layer
 from pitivi.timeline.layer import LayerControls
 from pitivi.timeline.layer import SpacedSeparator
+from pitivi.timeline.previewers import Previewer
 from pitivi.timeline.ruler import ScaleRuler
 from pitivi.undo.timeline import CommitTimelineFinalizingAction
 from pitivi.utils.loggable import Loggable
@@ -436,6 +437,8 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
 
     def setProject(self, project):
         """Connects to the GES.Timeline holding the project."""
+        # Avoid starting/closing preview generation like crazy while tearing down project
+        Previewer.manager.start_flushing()
         if self.ges_timeline is not None:
             self.disconnect_by_func(self._button_press_event_cb)
             self.disconnect_by_func(self._button_release_event_cb)
@@ -454,6 +457,8 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
 
         if self._project:
             self._project.pipeline.disconnect_by_func(self._positionCb)
+        Previewer.manager.stop_flushing()
+
         self._project = project
         if self._project:
             self._project.pipeline.connect('position', self._positionCb)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]