implement lv2:designation processing#enable (for bypass ports)
[ardour.git] / libs / ardour / meter.cc
index 60d8b694a8c349a55fd68fdd0e7ae327d4e570bc..bb6e3eb29ce67356c1e6982f7fb3e50ca8335d42 100644 (file)
@@ -46,6 +46,8 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
        _meter_type = MeterPeak;
        _reset_dpm = true;
        _reset_max = true;
+       _bufcnt = 0;
+       _combined_peak = 0;
 }
 
 PeakMeter::~PeakMeter ()
@@ -76,7 +78,7 @@ PeakMeter::~PeakMeter ()
  * (runs in jack realtime context)
  */
 void
-PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
 {
        if (!_active && !_pending_active) {
                return;
@@ -85,6 +87,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
        const bool do_reset_dpm = _reset_dpm;
        _reset_max = false;
        _reset_dpm = false;
+       _combined_peak = 0;
 
        // cerr << "meter " << name() << " runs with " << bufs.available() << " inputs\n";
 
@@ -94,14 +97,14 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
        uint32_t n = 0;
 
        const float falloff_dB = Config->get_meter_falloff() * nframes / _session.nominal_frame_rate();
-       const int zoh = _session.nominal_frame_rate() * .021;
+       const uint32_t zoh = _session.nominal_frame_rate() * .021;
        _bufcnt += nframes;
 
        // Meter MIDI in to the first n_midi peaks
        for (uint32_t i = 0; i < n_midi; ++i, ++n) {
                float val = 0.0f;
                const MidiBuffer& buf (bufs.get_midi(i));
-               
+
                for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) {
                        const Evoral::MIDIEvent<framepos_t> ev(*e, false);
                        if (ev.is_note_on()) {
@@ -109,6 +112,11 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
                                if (this_vel > val) {
                                        val = this_vel;
                                }
+                               if (val > 0.01) {
+                                       if (_combined_peak < 0.01) {
+                                               _combined_peak = 0.01;
+                                       }
+                               }
                        } else {
                                val += 1.0 / bufs.get_midi(n).capacity();
                                if (val > 1.0) {
@@ -133,6 +141,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
                } else {
                        _peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]);
                        _max_peak_signal[n] = std::max(_peak_buffer[n], _max_peak_signal[n]); // todo sync reset
+                       _combined_peak =std::max(_peak_buffer[n], _combined_peak);
                }
 
                if (do_reset_max) {
@@ -309,6 +318,7 @@ PeakMeter::set_max_channels (const ChanCount& chn)
 
 float
 PeakMeter::meter_level(uint32_t n, MeterType type) {
+       float mcptmp;
        switch (type) {
                case MeterKrms:
                case MeterK20:
@@ -353,6 +363,9 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
                                return _peak_power[n];
                        }
                        break;
+               case MeterMCP:
+                       mcptmp = _combined_peak;
+                       return accurate_coefficient_to_dB(mcptmp);
                case MeterMaxSignal:
                        assert(0);
                        break;