-void
-PeakMeter::meter ()
-{
- if (!_active) {
- return;
- }
-
- // TODO block this thread while PeakMeter::reset_max_channels() is
- // reallocating channels.
- // (may happen with Session > New: old session not yet closed,
- // meter-thread still active while new one is initializing and
- // maybe on other occasions, too)
- if ( (_visible_peak_power.size() != _peak_signal.size())
- || (_max_peak_power.size() != _peak_signal.size())
- || (_max_peak_signal.size() != _peak_signal.size())
- ) {
- return;
- }
-
- const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ());
- const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi());
-
- /* 0.01f ^= 100 Hz update rate */
- const float midi_meter_falloff = Config->get_meter_falloff() * 0.01f;
- /* kmeters: 24dB / 2 sec */
- const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14 | MeterK12)) ? 0.12f : midi_meter_falloff;
-
- for (size_t n = 0; n < limit; ++n) {
-
- /* grab peak since last read */
-
- float new_peak = _peak_signal[n]; /* XXX we should use atomic exchange from here ... */
- _peak_signal[n] = 0; /* ... to here */
-
- if (n < n_midi) {
- _max_peak_power[n] = -std::numeric_limits<float>::infinity(); // std::max (new_peak, _max_peak_power[n]); // XXX
- _max_peak_signal[n] = 0;
- if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
- ;
- } else {
- /* empirical algorithm WRT to audio falloff times */
- new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * midi_meter_falloff * 0.0002f);
- if (new_peak < (1.0 / 512.0)) new_peak = 0;
- }
- _visible_peak_power[n] = new_peak;
- continue;
- }
-
- /* AUDIO */
-
- /* compute new visible value using falloff */
-
- _max_peak_signal[n] = std::max(new_peak, _max_peak_signal[n]);
-
- if (new_peak > 0.0) {
- new_peak = accurate_coefficient_to_dB (new_peak);
- } else {
- new_peak = minus_infinity();
- }
-
- /* update max peak */
-
- _max_peak_power[n] = std::max (new_peak, _max_peak_power[n]);
-
- if (audio_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
- _visible_peak_power[n] = new_peak;
- } else {
- // do falloff
- new_peak = _visible_peak_power[n] - (audio_meter_falloff);
- _visible_peak_power[n] = std::max (new_peak, -std::numeric_limits<float>::infinity());
- }
- }
-}
-