From cdc64358ec250aee5f76e361c48ae580bcf7003c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 3 Oct 2018 20:22:30 +0200 Subject: [PATCH] Properly initialize midi-meters Midi meters are using linear 0..1 range, (not decibels, no log-scale falloff). If a track is deactivated, run() is never called. the queued reset never executed and the meter remained at the initialization default -inf (visually it looked like a pegged meter). --- libs/ardour/meter.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index da97041657..945dec7f73 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -103,6 +103,9 @@ PeakMeter::run (BufferSet& bufs, samplepos_t /*start_sample*/, samplepos_t /*end // Meter MIDI in to the first n_midi peaks for (uint32_t i = 0; i < n_midi; ++i, ++n) { float val = 0.0f; + if (do_reset_dpm) { + _peak_power[n] = 0; + } const MidiBuffer& buf (bufs.get_midi(i)); for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) { @@ -203,6 +206,10 @@ PeakMeter::reset () _peak_power[i] = -std::numeric_limits::infinity(); _peak_buffer[i] = 0; } + const uint32_t n_midi = min (current_meters.n_midi(), (uint32_t)_peak_power.size()); + for (size_t i = 0; i < n_midi; ++i) { + _peak_power[i] = 0; + } } // these are handled async just fine. @@ -285,7 +292,11 @@ PeakMeter::set_max_channels (const ChanCount& chn) while (_peak_power.size() < limit) { _peak_buffer.push_back(0); - _peak_power.push_back(-std::numeric_limits::infinity()); + if (_peak_power.size() < current_meters.n_midi()) { + _peak_power.push_back(0); + } else { + _peak_power.push_back(-std::numeric_limits::infinity()); + } _max_peak_signal.push_back(0); } -- 2.30.2