summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-10-03 20:22:30 +0200
committerRobin Gareus <robin@gareus.org>2018-10-03 20:22:30 +0200
commitcdc64358ec250aee5f76e361c48ae580bcf7003c (patch)
tree980c8f1156de0ea7ad7ee7bada633f985753b44f
parent23220955a5af8751258197b7f36fb7631b33429b (diff)
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).
-rw-r--r--libs/ardour/meter.cc13
1 files changed, 12 insertions, 1 deletions
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<float>::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<float>::infinity());
+ if (_peak_power.size() < current_meters.n_midi()) {
+ _peak_power.push_back(0);
+ } else {
+ _peak_power.push_back(-std::numeric_limits<float>::infinity());
+ }
_max_peak_signal.push_back(0);
}