13
0

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).
This commit is contained in:
Robin Gareus 2018-10-03 20:22:30 +02:00
parent 23220955a5
commit cdc64358ec

View File

@ -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);
}