_meter_type = MeterPeak;
_reset_dpm = true;
_reset_max = true;
+ _bufcnt = 0;
+ _combined_peak = 0;
}
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;
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";
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()) {
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) {
} 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) {
float
PeakMeter::meter_level(uint32_t n, MeterType type) {
+ float mcptmp;
switch (type) {
case MeterKrms:
case MeterK20:
return _peak_power[n];
}
break;
+ case MeterMCP:
+ mcptmp = _combined_peak;
+ return accurate_coefficient_to_dB(mcptmp);
case MeterMaxSignal:
assert(0);
break;