+float
+PeakMeter::meter_level(uint32_t n, MeterType type) {
+ switch (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());
+ }
+ return minus_infinity();
+ }
+ case MeterPeak:
+ return peak_power(n);
+ case MeterMaxSignal:
+ if (n < _max_peak_signal.size()) {
+ return _max_peak_signal[n];
+ } else {
+ return minus_infinity();
+ }
+ default:
+ case MeterMaxPeak:
+ return max_peak_power(n);
+ }
+}
+void
+PeakMeter::set_type(MeterType t)
+{
+ _meter_type = t;
+
+ if (t & MeterKrms) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _kmeter[n]->reset();
+ }
+ }
+}
+