]> git.parisson.com Git - timeside.git/commitdiff
feature(ProcessPipe): Add a method for a processor to overwrite the source samplerate
authorThomas Fillon <thomas@parisson.com>
Mon, 30 Jun 2014 10:33:49 +0000 (12:33 +0200)
committerThomas Fillon <thomas@parisson.com>
Mon, 30 Jun 2014 10:33:49 +0000 (12:33 +0200)
tests/test_graphers_render_analyzers.py
timeside/analyzer/limsi_sad.py
timeside/analyzer/spectrogram.py
timeside/core.py

index 9fa7ea557702e90a8d8d683f3ec16cd3ce409710..1819f64e07977ef2fae40a087a9ad8102a3ba055 100644 (file)
@@ -38,7 +38,8 @@ class Test_graphers_analyzers(unittest.TestCase):
 
     def tearDown(self):
         # Clean-up : delete temp file
-        os.unlink(self.temp_file.name)
+        if not PLOT:
+            os.unlink(self.temp_file.name)
 
 
 def _tests_factory(grapher_analyzers):
index dff1b02b802953090572a04352ed7d9277b5ed9d..a0ab0cdbab87ef25e48a640fa49f1ce3354c0652 100644 (file)
@@ -115,11 +115,11 @@ class LimsiSad(Analyzer):
         # return the unit of the data dB, St, ...
         return "Log Probability difference"
 
+    @property
+    def force_samplerate(self):
+        return 16000
+
     def process(self, frames, eod=False):
-        if self.input_samplerate != 16000:
-            raise Exception(
-                '%s requires 16000 input sample rate: %d provided' %
-                (self.__class__.__name__, self.input_samplerate))
         return frames, eod
 
     def post_process(self):
index f96064ac284f2089384699374ed1b78fbab48faf..a2c241e344d2733212a201e376ace56e9ced8757 100644 (file)
@@ -77,7 +77,8 @@ class Spectrogram(Analyzer):
         spectrogram = self.new_result(data_mode='value', time_mode='framewise')
         spectrogram.parameters = {'FFT_SIZE': self.FFT_SIZE}
         spectrogram.data_object.value = self.values
-        spectrogram.data_object.y_value = np.arange(0, self.samplerate() / 2,
-                                                    self.samplerate() /
-                                                    self.FFT_SIZE)
+        nb_freq = spectrogram.data_object.value.shape[1]
+        spectrogram.data_object.y_value = (np.arange(0, nb_freq) *
+                                           self.samplerate() / self.FFT_SIZE)
+
         self.process_pipe.results.add(spectrogram)
index d821225405d99e7457874a789273edd32aaf882d..dfd9c2331aacfafebb5d328ce026337a0232941e 100644 (file)
@@ -109,6 +109,14 @@ class Processor(Component):
         if not hasattr(self, 'input_stepsize'):
             self.input_stepsize = self.source_blocksize
 
+        # Check samplerate specification if any
+        if self.force_samplerate:
+            if self.input_samplerate != self.force_samplerate:
+                raise ValueError(
+                    '%s requires %d input sample rate: %d provided' %
+                    (self.__class__.__name__, self.force_samplerate,
+                     self.input_samplerate))
+
     # default channels(), samplerate() and blocksize() implementations returns
     # the source characteristics, but processors may change this behaviour by
     # overloading those methods
@@ -148,6 +156,10 @@ class Processor(Component):
     def uuid(self):
         return str(self.UUID)
 
+    @property
+    def force_samplerate(self):
+        return None
+
     def __del__(self):
         self.release()
 
@@ -302,6 +314,21 @@ class ProcessPipe(object):
 
         source = self.processors[0]
         items = self.processors[1:]
+
+        # Check if any processor in items need to force the asmplerate
+        force_samplerate = set([item.force_samplerate for item in items
+                                if item.force_samplerate])
+        if force_samplerate:
+            if len(force_samplerate) > 1:
+                raise(ValueError,
+                      "Some processors specify different samplerate")
+            force_samplerate = force_samplerate.pop()
+
+            if samplerate and samplerate != force_samplerate:
+                raise(ValueError, "A processor try to force the samplerate")
+
+            samplerate = force_samplerate
+
         source.setup(channels=channels, samplerate=samplerate,
                      blocksize=blocksize)
         source.SIG_STOP = False