[pitivi] pitivi: Make sure to release all pipelines



commit d86f7fe6465831666d4be2bcfbfb40e6a4d0acda
Author: Thibault Saunier <tsaunier gnome org>
Date:   Sat Jul 18 13:33:39 2015 +0200

    pitivi: Make sure to release all pipelines
    
    Summary: Depends on D264
    
    Reviewers: Mathieu_Du, aleb
    
    Differential Revision: https://phabricator.freedesktop.org/D265

 pitivi/mediafilespreviewer.py |    2 +-
 pitivi/timeline/elements.py   |   12 +++++++++---
 pitivi/timeline/layer.py      |    1 +
 pitivi/timeline/previewers.py |    1 -
 pitivi/utils/pipeline.py      |    2 +-
 pitivi/viewer.py              |    5 +++++
 6 files changed, 17 insertions(+), 6 deletions(-)
---
diff --git a/pitivi/mediafilespreviewer.py b/pitivi/mediafilespreviewer.py
index b828590..08af4c0 100644
--- a/pitivi/mediafilespreviewer.py
+++ b/pitivi/mediafilespreviewer.py
@@ -453,7 +453,7 @@ class PreviewWidget(Gtk.Grid, Loggable):
             dialog.destroy()
 
     def _destroy_cb(self, widget):
-        self.player.setState(Gst.State.NULL)
+        self.player.release()
         self.is_playing = False
 
     def __get_best_size(self, width_in, height_in):
diff --git a/pitivi/timeline/elements.py b/pitivi/timeline/elements.py
index 52f8de1..76d4828 100644
--- a/pitivi/timeline/elements.py
+++ b/pitivi/timeline/elements.py
@@ -318,6 +318,10 @@ class TimelineElement(Gtk.Layout, timelineUtils.Zoomable, Loggable):
         if self.__controlledProperty:
             self.__createControlBinding(self._bElement)
 
+    def release(self):
+        if self.__previewer:
+            self.__previewer.cleanup()
+
     # Public API
     def setSize(self, width, height):
         width = max(0, width)
@@ -794,9 +798,11 @@ class Clip(Gtk.EventBox, timelineUtils.Zoomable, Loggable):
             self.layer = bLayer.ui
 
     def __disconnectFromChild(self, child):
-        if child.ui and hasattr(child.ui, "__clip_curve_enter_id") and child.ui.__clip_curve_enter_id:
-            child.ui.disconnect_by_func(child.ui.__clip_curve_enter_id)
-            child.ui.disconnect_by_func(child.ui.__clip_curve_leave_id)
+        if child.ui:
+            if hasattr(child.ui, "__clip_curve_enter_id") and child.ui.__clip_curve_enter_id:
+                child.ui.disconnect_by_func(child.ui.__clip_curve_enter_id)
+                child.ui.disconnect_by_func(child.ui.__clip_curve_leave_id)
+            child.ui.release()
 
     def __connectToChild(self, child):
         if child.ui:
diff --git a/pitivi/timeline/layer.py b/pitivi/timeline/layer.py
index 0cc3621..3582a89 100644
--- a/pitivi/timeline/layer.py
+++ b/pitivi/timeline/layer.py
@@ -561,6 +561,7 @@ class Layer(Gtk.EventBox, timelineUtils.Zoomable, Loggable):
             self.error("Implement UI for type %s?" % bClip.__gtype__)
             return
 
+        bClip.ui.release()
         self._layout.remove(bClip.ui)
 
     def __childWidgetRemovedCb(self, layout, clip):
diff --git a/pitivi/timeline/previewers.py b/pitivi/timeline/previewers.py
index e74f85e..6f09a45 100644
--- a/pitivi/timeline/previewers.py
+++ b/pitivi/timeline/previewers.py
@@ -917,5 +917,4 @@ class AudioPreviewer(Gtk.Layout, PreviewGenerator, Zoomable, Loggable):
 
     def cleanup(self):
         self.stopGeneration()
-        self.timeline.disconnect_by_func(self._scrolledCb)
         Zoomable.__del__(self)
diff --git a/pitivi/utils/pipeline.py b/pitivi/utils/pipeline.py
index 87cdd71..bcf02e1 100644
--- a/pitivi/utils/pipeline.py
+++ b/pitivi/utils/pipeline.py
@@ -216,7 +216,7 @@ class SimplePipeline(GObject.Object, Loggable):
         self._bus.disconnect_by_func(self._busMessageCb)
         self._bus.remove_signal_watch()
 
-        self._pipeline.setState(Gst.State.NULL)
+        self._pipeline.set_state(Gst.State.NULL)
         self._bus = None
 
     def flushSeek(self):
diff --git a/pitivi/viewer.py b/pitivi/viewer.py
index 271542b..d6eb9e8 100644
--- a/pitivi/viewer.py
+++ b/pitivi/viewer.py
@@ -100,6 +100,7 @@ class ViewerContainer(Gtk.Box, Loggable):
 
         self._createUi()
 
+        self.__owning_pipeline = False
         if not self.settings.viewerDocked:
             self.undock()
 
@@ -135,6 +136,7 @@ class ViewerContainer(Gtk.Box, Loggable):
         self.internal.sink = self.sink
         self.external.sink = self.sink
 
+        self.__owning_pipeline = False
         self._switch_output_window()
         self._setUiActive()
 
@@ -148,6 +150,8 @@ class ViewerContainer(Gtk.Box, Loggable):
         self.pipeline.disconnect_by_func(self._positionCb)
         self.pipeline.disconnect_by_func(self._durationChangedCb)
 
+        if self.__owning_pipeline:
+            self.pipeline.release()
         self.pipeline = None
 
     def _setUiActive(self, active=True):
@@ -428,6 +432,7 @@ class ViewerContainer(Gtk.Box, Loggable):
             self._oldTimelinePos = self.pipeline.getPosition(True)
             self.pipeline.set_state(Gst.State.NULL)
             self.setPipeline(AssetPipeline(clip))
+            self.__owning_pipeline = True
             self._lastClipTrimTime = cur_time
 
         if (cur_time - self._lastClipTrimTime) > 0.2 and self.pipeline.getState() == Gst.State.PAUSED:


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