remove odd namespacing typo
[ardour.git] / libs / ardour / meter.cc
index 26e865bec33f5397e506b803f629fb7db2c4ead7..490b75dcb2092b77e4bf6d537f0c6a0a959d87cd 100644 (file)
@@ -44,7 +44,7 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
        Iec2ppmdsp::init(s.nominal_frame_rate());
        Vumeterdsp::init(s.nominal_frame_rate());
        _pending_active = true;
-       _active = true;
+       _meter_type = MeterPeak;
 }
 
 PeakMeter::~PeakMeter ()
@@ -270,7 +270,17 @@ PeakMeter::meter ()
                return;
        }
 
-       assert(_visible_peak_power.size() == _peak_signal.size());
+       // 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());
@@ -327,6 +337,8 @@ PeakMeter::meter ()
        }
 }
 
+#define CHECKSIZE(MTR) (n < MTR.size() + n_midi && n >= n_midi)
+
 float
 PeakMeter::meter_level(uint32_t n, MeterType type) {
        switch (type) {
@@ -334,8 +346,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
                case MeterK20:
                case MeterK14:
                        {
-                               const int n_midi = current_meters.n_midi();
-                               if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) {
+                               const uint32_t n_midi = current_meters.n_midi();
+                               if (CHECKSIZE(_kmeter)) {
                                        return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read());
                                }
                        }
@@ -343,8 +355,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
                case MeterIEC1DIN:
                case MeterIEC1NOR:
                        {
-                               const int n_midi = current_meters.n_midi();
-                               if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) {
+                               const uint32_t n_midi = current_meters.n_midi();
+                               if (CHECKSIZE(_iec1meter)) {
                                        return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read());
                                }
                        }
@@ -352,16 +364,16 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
                case MeterIEC2BBC:
                case MeterIEC2EBU:
                        {
-                               const int n_midi = current_meters.n_midi();
-                               if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) {
+                               const uint32_t n_midi = current_meters.n_midi();
+                               if (CHECKSIZE(_iec2meter)) {
                                        return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read());
                                }
                        }
                        break;
                case MeterVU:
                        {
-                               const int n_midi = current_meters.n_midi();
-                               if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) {
+                               const uint32_t n_midi = current_meters.n_midi();
+                               if (CHECKSIZE(_vumeter)) {
                                        return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read());
                                }
                        }