[pitivi] previewers: add saving and loading for the waveforms.



commit 50546b07667617168ba6ee060e16a37f70fde156
Author: Mathieu Duponchelle <mathieu duponchelle epitech eu>
Date:   Fri Jun 21 00:03:13 2013 +0200

    previewers: add saving and loading for the waveforms.
    
        + They are pickled in ~/.cache/pitivi/waves

 pitivi/timeline/previewers.py |   58 +++++++++++++++++++++++++++++------------
 1 files changed, 41 insertions(+), 17 deletions(-)
---
diff --git a/pitivi/timeline/previewers.py b/pitivi/timeline/previewers.py
index 9677a70..5254a83 100644
--- a/pitivi/timeline/previewers.py
+++ b/pitivi/timeline/previewers.py
@@ -42,6 +42,8 @@ from math import log1p, log10
 
 import resource
 
+import pickle
+
 from renderer import *
 
 
@@ -569,11 +571,24 @@ class AudioPreviewer(Clutter.Actor, Zoomable):
         self._callback_id = 0
 
     def startLevelsDiscovery(self, uri):
-        self.peaks = None
-        self.pipeline = Gst.parse_launch("uridecodebin uri=" + uri + " ! audioconvert ! level 
interval=10000000 post-messages=true ! fakesink qos=false")
+        filename = hash_file(Gst.uri_get_location(uri)) + ".wave"
+        cache_dir = get_dir(os.path.join(xdg_dirs.xdg_cache_home, os.path.join("pitivi/waves")), autocreate)
+        filename = cache_dir + "/" + filename
 
         self.adapter = None
 
+        if os.path.exists(filename):
+            self.samples = pickle.load(open(filename, "rb"))
+            self._startRendering()
+
+        else:
+            self.wavefile = filename
+            self._launchPipeline(uri)
+
+    def _launchPipeline(self, uri):
+        self.peaks = None
+        self.pipeline = Gst.parse_launch("uridecodebin uri=" + uri + " ! audioconvert ! level 
interval=10000000 post-messages=true ! fakesink qos=false")
+
         bus = self.pipeline.get_bus()
         bus.add_signal_watch()
 
@@ -625,6 +640,28 @@ class AudioPreviewer(Clutter.Actor, Zoomable):
         self.set_position(start, self.props.y)
         self.canvas.invalidate()
 
+    def _prepareSamples(self):
+        # Let's go mono.
+        if (len(self.peaks) > 1):
+            samples = (numpy.array(self.peaks[0]) + numpy.array(self.peaks[1])) / 2
+        else:
+            samples = numpy.array(self.peaks[0])
+
+        self.samples = samples.tolist()
+
+        f = open(self.wavefile, 'w')
+
+        pickle.dump(self.samples, f)
+
+    def _startRendering(self):
+        self.nbSamples = len(self.samples)
+        self.discovered = True
+        self.start = 0
+        self.end = self.nbSamples
+        self._compute_geometry()
+        if self.adapter:
+            self.adapter.stop()
+
     def _messageCb(self, bus, message):
         s = message.get_structure()
         p = None
@@ -650,22 +687,9 @@ class AudioPreviewer(Clutter.Actor, Zoomable):
                     self.peaks[i][pos] = self.peaks[i][pos - 1]
 
         if message.type == Gst.MessageType.EOS:
-            # Let's go mono.
-            if (len(self.peaks) > 1):
-                samples = (numpy.array(self.peaks[0]) + numpy.array(self.peaks[1])) / 2
-            else:
-                samples = numpy.array(self.peaks[0])
-
-            self.samples = samples.tolist()
-            self.nbSamples = len(self.samples)
-
-            self.discovered = True
-            self.start = 0
-            self.end = self.nbSamples
-            self._compute_geometry()
-            if self.adapter:
-                self.adapter.stop()
             self.pipeline.set_state(Gst.State.NULL)
+            self._prepareSamples()
+            self._startRendering()
 
         elif message.type == Gst.MessageType.ERROR:
             if self.adapter:


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