Package: telemeta
 Architecture: any
-Depends: ${python:Depends}, python-xml, python-mutagen, python-django (>= 0.96.2), sox, vorbis-tools, flac, normalize-audio, python-mysqldb, mysql-server, octave2.9, python-tk, libgd2-xpm, libsndfile1, python-numpy
+Depends: ${python:Depends}, python-xml, python-mutagen, python-django (>= 0.96.2), sox, vorbis-tools, flac, normalize-audio, python-mysqldb, mysql-server, octave2.9, python-tk, libgd2-xpm, libsndfile1, python-numpy, python-ctypes (>= 1.0.1), libsndfile1
 Recommends: lame
 Suggests: ecasound, festival, par2
 Description: web frontend to backup, transcode and tag any audio content with metadata
 
 from telemeta.analysis.api import *
 from telemeta.analysis.core import *
+from telemeta.analysis.channels import *
+from telemeta.analysis.length import *
+from telemeta.analysis.samplerate import *
 from telemeta.analysis.max_level import *
 from telemeta.analysis.mean_level import *
-from telemeta.analysis.length import *
 
--- /dev/null
+# Copyright (C) 2008 Parisson SARL
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
+#
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from telemeta.analysis.core import *
+from telemeta.analysis.api import IMediaItemAnalyzer
+import numpy
+
+class ChannelAnalyser(AudioProcessor):
+    """Media item analyzer driver interface"""
+
+    implements(IMediaItemAnalyzer)
+
+    def get_id(self):
+        return "nb_channels"
+
+    def get_name(self):
+        return "Number of channels"
+
+    def get_unit(self):
+        return ""
+
+    def render(self, media_item, options=None):
+        self.pre_process(media_item)
+        return self.channels
 
         # convert to mono by selecting left channel only
         if self.channels > 1:
             samples = samples[:,0]
-        return samples    
+        return samples
+
+    def get_samples(self):
+        samples = self.audio_file.read_frames(self.frames)
+        return samples  
         
     def read(self, start, size, resize_if_less=False):
         """ read size samples starting at start, if resize_if_less is True and less than size
 
 
     implements(IMediaItemAnalyzer)
 
-    def __init__(self):
-        self.fft_size = 2048
-        self.window_function = numpy.hanning
-        self.window = self.window_function(self.fft_size)
-        
     def get_id(self):
         return "length"
 
 
     def render(self, media_item, options=None):
         self.pre_process(media_item)
-        return numpy.round(numpy.divide(self.frames, self.samplerate),2)
+        return numpy.round(float(self.frames)/float(self.samplerate),2)
 
 
     implements(IMediaItemAnalyzer)
 
-    def __init__(self):
-        self.fft_size = 2048
-        self.window_function = numpy.hanning
-        self.window = self.window_function(self.fft_size)
-        
     def get_id(self):
         return "max_level"
 
     def get_name(self):
-        return "Maximum level"
+        return "Maximum peak level"
 
     def get_unit(self):
         return "dB"
 
     def render(self, media_item, options=None):
         self.pre_process(media_item)
-        samples = self.get_mono_samples()
-        print str(numpy.max(samples))
+        samples = self.get_samples()
         return numpy.round(20*numpy.log10(numpy.max(samples)),2)
\ No newline at end of file
 
 
     implements(IMediaItemAnalyzer)
 
-    def __init__(self):
-        self.fft_size = 2048
-        self.window_function = numpy.hanning
-        self.window = self.window_function(self.fft_size)
-        
     def get_id(self):
         return "mean_level"
 
     def get_name(self):
-        return "Mean level"
+        return "Mean RMS level"
 
     def get_unit(self):
         return "dB"
 
--- /dev/null
+# Copyright (C) 2008 Parisson SARL
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
+#
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from telemeta.analysis.core import *
+from telemeta.analysis.api import IMediaItemAnalyzer
+import numpy
+
+class SampleRateAnalyzer(AudioProcessor):
+    """Media item analyzer driver interface"""
+
+    implements(IMediaItemAnalyzer)
+
+    def get_id(self):
+        return "samplerate"
+
+    def get_name(self):
+        return "Samplerate"
+
+    def get_unit(self):
+        return "Hz"
+
+    def render(self, media_item, options=None):
+        self.pre_process(media_item)
+        return self.samplerate
 
     border: 1px solid #adadad;\r
     text-align: center;\r
 }\r
-.item_visualization select { width: 210px; }\r
+.item_visualization select { width: 240px; }\r
 .item_visualization .viewport { width: 305px; border: 1px solid #adadad; overflow: auto; margin-top: 5px; background-color: #fff;}\r
 \r
 .exporter {\r
     padding: 2px;\r
     height: 17px;\r
     margin: 5px 0 0;\r
-    overflow: auto;\r
+    /* overflow: auto; */\r
     font-size: 1em;\r
 }\r
 \r
-.analyser {\r
+.analyzer {\r
     background-color: #fff;\r
     color: #555;\r
     border: 1px solid #adadad;\r
     width: 301px;\r
     padding: 2px;\r
     margin: 5px 0 0;\r
-    overflow: auto;\r
+    /* overflow: auto; */\r
     font-size: 1em;\r
 }\r
 \r
 
             <input type="submit" value="OK" />\r
         </form>\r
     </div>\r
-    <div class="exporter">\r
-        <p>Download:\r
-        {% for format in export_formats %}\r
-        <a href="{% url telemeta-item-export item.id|urlencode,format.extension %}">{{ format.name }}</a>\r
-        {% endfor %}</p>\r
-    </div>\r
-    <div class="analyser">\r
-        <p>Analysis:</p>\r
-        <br>\r
-        <table>\r
+    <div class="analyzer">\r
+        <table width="100%">\r
+         <tr>\r
+          <td>Parameter</td>\r
+          <td>Value</td>\r
+          <td>Unit</td>\r
+         <tr>\r
         {% for analyser in analysers %}\r
          <tr>\r
           <td>\r
             {{ analyser.name }}\r
           </td>\r
-          <td> =\r
+          <td> \r
             {{ analyser.value }}\r
           </td>\r
           <td>\r
         {% endfor %}\r
        </table>\r
     </div>\r
+    <div class="exporter">\r
+        <p>Download:\r
+        {% for format in export_formats %}\r
+        <a href="{% url telemeta-item-export item.id|urlencode,format.extension %}">{{ format.name }}</a>\r
+        {% endfor %}</p>\r
+    </div>\r
+\r
 </div>\r
 {% endif %}\r
     <div id="leftcol">\r
 
         
         if alpha > 0.0 and alpha < 1.0 and y_max_int + 1 < self.image_height:
             current_pix = self.pix[x, y_max_int + 1]
-                
+            
             r = int((1-alpha)*current_pix[0] + alpha*color[0])
             g = int((1-alpha)*current_pix[1] + alpha*color[1])
             b = int((1-alpha)*current_pix[2] + alpha*color[2])
 
         pngFile_w = NamedTemporaryFile(suffix='.png')
         pngFile_s = NamedTemporaryFile(suffix='.png')
         image_width = 305
-        image_height = 152
+        image_height = 150
         fft_size = 2048
         args = (wav_file, pngFile_w.name, pngFile_s.name, image_width, image_height, fft_size)
         create_png(*args)