Move event specific ringbuffer stuff to evoral.
[ardour.git] / libs / ardour / meter.cc
index f0575b7621b3167c89cf22b268e4a6f69a43ae2a..5dee1d98451d9089d80c44e1e34ccac3aecad3ce 100644 (file)
@@ -23,7 +23,6 @@
 #include <ardour/peak.h>
 #include <ardour/dB.h>
 #include <ardour/session.h>
-#include <ardour/midi_events.h>
 
 namespace ARDOUR {
 
@@ -34,28 +33,30 @@ namespace ARDOUR {
  * be set to 0.
  */
 void
-PeakMeter::run (BufferSet& bufs, nframes_t nframes, nframes_t offset)
+PeakMeter::run_in_place (BufferSet& bufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset)
 {
-       size_t meterable = std::min(bufs.count().n_total(), _peak_power.size());
+       size_t meterable = std::min((size_t)bufs.count().n_total(), _peak_power.size());
 
        size_t n = 0;
 
        // Meter what we have (midi)
        for ( ; n < meterable && n < bufs.count().n_midi(); ++n) {
-               
+       
                float val = 0;
                
                // GUI needs a better MIDI meter, not much information can be
                // expressed through peaks alone
-               const unsigned n_events = bufs.get_midi(n).size();
-               for (size_t i=0; i < n_events; ++i) {
-                       const MidiEvent& ev = bufs.get_midi(n)[i];
-                       if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
-                               const float normal_vel = ev.buffer[2] / 127.0;
-                               if (normal_vel > val)
-                                       val = normal_vel;
+               for (MidiBuffer::iterator i = bufs.get_midi(n).begin(); i != bufs.get_midi(n).end(); ++i) {
+                       const Evoral::MIDIEvent& ev = *i;
+                       if (ev.is_note_on()) {
+                               const float this_vel = log(ev.buffer()[2] / 127.0 * (M_E*M_E-M_E) + M_E) - 1.0;
+                               //printf("V %d -> %f\n", (int)((Byte)ev.buffer[2]), this_vel);
+                               if (this_vel > val)
+                                       val = this_vel;
                        } else {
                                val += 1.0 / bufs.get_midi(n).capacity();
+                               if (val > 1.0)
+                                       val = 1.0;
                        }
                }
                        
@@ -90,9 +91,14 @@ PeakMeter::reset_max ()
        }
 }
 
-void
-PeakMeter::setup (const ChanCount& in)
+bool
+PeakMeter::configure_io (ChanCount in, ChanCount out)
 {
+       /* we're transparent no matter what.  fight the power. */
+       if (out != in) {
+               return false;
+       }
+
        uint32_t limit = in.n_total();
 
        while (_peak_power.size() > limit) {
@@ -110,6 +116,8 @@ PeakMeter::setup (const ChanCount& in)
        assert(_peak_power.size() == limit);
        assert(_visible_peak_power.size() == limit);
        assert(_max_peak_power.size() == limit);
+
+       return Processor::configure_io (in, out);
 }
 
 /** To be driven by the Meter signal from IO.