X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmeter.cc;h=f239a1c4b7025075009d33e568443bd4bee643d0;hb=9cb678ebcc2ca0c7993bdd182c9e6ad1f8adf09a;hp=c33214332472f2d25b64a7f4be89f7638cffb53b;hpb=58b325de319ab1d807511783f55a7fe3748e8614;p=ardour.git diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index c332143324..f239a1c4b7 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -55,6 +55,8 @@ PeakMeter::~PeakMeter () * Input acceptance is lenient - the first n buffers from @a bufs will * be metered, where n was set by the last call to setup(), excess meters will * be set to 0. + * + * (runs in jack realtime context) */ void PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool) @@ -95,7 +97,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { _peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]); - if (/* TODO use separate bit-flags for mixer,meterbridge,.. */ /* 1 || */ _meter_type & MeterKrms) { + if (_meter_type & MeterKrms) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } } @@ -239,11 +241,7 @@ PeakMeter::meter () ; } else { /* empirical WRT to falloff times , 0.01f ^= 100 Hz update rate */ -#if 1 - new_peak = _visible_peak_power[n] - _visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.05f; -#else new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.0002f); -#endif if (new_peak < (1.0 / 512.0)) new_peak = 0; } _visible_peak_power[n] = new_peak; @@ -257,7 +255,7 @@ PeakMeter::meter () _max_peak_signal[n] = std::max(new_peak, _max_peak_signal[n]); if (new_peak > 0.0) { - new_peak = fast_coefficient_to_dB (new_peak); + new_peak = accurate_coefficient_to_dB (new_peak); } else { new_peak = minus_infinity(); } @@ -282,8 +280,12 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterKrms: { const uint32_t n_midi = current_meters.n_midi(); - if ((n - n_midi) < _kmeter.size()) { - return fast_coefficient_to_dB(_kmeter[n]->read()); + if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { +#if 0 + return fast_coefficient_to_dB (_kmeter[n-n_midi]->read()); +#else + return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read()); +#endif } return minus_infinity(); } @@ -304,9 +306,14 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { } } } + void PeakMeter::set_type(MeterType t) { + if (t == _meter_type) { + return; + } + _meter_type = t; if (t & MeterKrms) { @@ -325,5 +332,3 @@ PeakMeter::state (bool full_state) node.add_property("type", "meter"); return node; } - -