fix verbose plugin scan
[ardour.git] / gtk2_ardour / level_meter.cc
index 6ae8c98df1376a303539dbab311e55522a06e671..75cd5e60eb2635caf3939b08c34e12d41b00c7e1 100644 (file)
@@ -49,20 +49,17 @@ LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord*
        , regular_meter_width (6)
        , meter_length (0)
        , thin_meter_width(2)
+       , max_peak (minus_infinity())
+       , meter_type (MeterPeak)
+       , visible_meter_type (MeterType(0))
+       , visible_meter_count (0)
+       , color_changed (false)
 {
        set_session (s);
+
        Config->ParameterChanged.connect (_parameter_connection, parent_invalidator, boost::bind (&LevelMeterBase::parameter_changed, this, _1), gui_context());
        ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun(*this, &LevelMeterBase::parameter_changed));
-       UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeterBase::on_theme_changed));
        ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeterBase::color_handler));
-       max_peak = minus_infinity();
-       meter_type = MeterPeak;
-}
-
-void
-LevelMeterBase::on_theme_changed()
-{
-       style_changed = true;
 }
 
 LevelMeterBase::~LevelMeterBase ()
@@ -83,7 +80,7 @@ LevelMeterBase::set_meter (PeakMeter* meter)
        _meter_type_connection.disconnect();
 
        _meter = meter;
-       color_changed = true;
+       color_changed = true; // force update
 
        if (_meter) {
                _meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context());
@@ -155,6 +152,8 @@ LevelMeterBase::update_meters ()
                                const float peak = _meter->meter_level (n, meter_type);
                                if (meter_type == MeterPeak) {
                                        (*i).meter->set (log_meter (peak));
+                               } else if (meter_type == MeterPeak0dB) {
+                                       (*i).meter->set (log_meter0dB (peak));
                                } else if (meter_type == MeterIEC1NOR) {
                                        (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
                                } else if (meter_type == MeterIEC1DIN) {
@@ -212,7 +211,6 @@ LevelMeterBase::parameter_changed (string p)
 void
 LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
 {
-       color_changed = true;
        setup_meters (meter_length, regular_meter_width, thin_meter_width);
 }
 
@@ -220,7 +218,6 @@ void
 LevelMeterBase::meter_type_changed (MeterType t)
 {
        meter_type = t;
-       color_changed = true;
        setup_meters (meter_length, regular_meter_width, thin_meter_width);
        MeterTypeChanged(t);
 }
@@ -239,9 +236,9 @@ LevelMeterBase::hide_all_meters ()
 void
 LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 {
-       hide_all_meters ();
 
        if (!_meter) {
+               hide_all_meters ();
                return; /* do it later or never */
        }
 
@@ -254,6 +251,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
        guint16 width;
 
        if (nmeters == 0) {
+               hide_all_meters ();
                return;
        }
 
@@ -263,6 +261,29 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
                width = thin_meter_width;
        }
 
+       width = rint (width * ARDOUR_UI::ui_scale);
+
+       if (   meters.size() > 0
+           && nmeters == visible_meter_count
+           && meters[0].width == width
+           && meters[0].length == len
+           && !color_changed
+           && meter_type == visible_meter_type) {
+               return;
+       }
+
+#if 0
+       printf("Meter redraw: %s %s %s %s %s %s\n",
+                       (meters.size() > 0) ? "yes" : "no",
+                       (meters.size() > 0 &&  meters[0].width == width) ? "yes" : "no",
+                       (meters.size() > 0 &&  meters[0].length == len) ? "yes" : "no",
+                       (nmeters == visible_meter_count) ? "yes" : "no",
+                       (meter_type == visible_meter_type) ? "yes" : "no",
+                       !color_changed ? "yes" : "no"
+                       );
+#endif
+
+       hide_all_meters ();
        while (meters.size() < nmeters) {
                meters.push_back (MeterInfo());
        }
@@ -377,8 +398,27 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
                                        c[0] = c[2] = c[3] = c[4] = c[5] = c[1];
                                        c[7] = c[8] = c[9] = c[6];
                                        break;
+                               case MeterPeak0dB:
+                                        stp[1] =  89.125; // 115.0 * log_meter0dB(-9);
+                                        stp[2] = 106.375; // 115.0 * log_meter0dB(-3);
+                                        stp[3] = 115.0;   // 115.0 * log_meter0dB(0);
+                                       switch (ARDOUR_UI::config()->get_meter_line_up_level()) {
+                                       case MeteringLineUp24:
+                                               stp[0] = 115.0 * log_meter0dB(-24);
+                                               break;
+                                       case MeteringLineUp20:
+                                               stp[0] = 115.0 * log_meter0dB(-20);
+                                               break;
+                                       default:
+                                       case MeteringLineUp18:
+                                               stp[0] = 115.0 * log_meter0dB(-18);
+                                               break;
+                                       case MeteringLineUp15:
+                                               stp[0] = 115.0 * log_meter0dB(-15);
+                                       }
+                                       break;
                                default: // PEAK, RMS
-                                       stp[1] = 77.5;  // 115 * log_meter(-10)
+                                       stp[1] = 77.5;  // 115 * log_meter(-9)
                                        stp[2] = 92.5;  // 115 * log_meter(-3)
                                        stp[3] = 100.0; // 115 * log_meter(0)
                                        switch (ARDOUR_UI::config()->get_meter_line_up_level()) {
@@ -425,6 +465,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
        //show();
        color_changed = false;
        visible_meter_type = meter_type;
+       visible_meter_count = nmeters;
 }
 
 void
@@ -437,7 +478,7 @@ LevelMeterBase::set_type(MeterType t)
 bool
 LevelMeterBase::meter_button_press (GdkEventButton* ev)
 {
-       return !!ButtonPress (ev); /* EMIT SIGNAL */
+       return static_cast<bool>(ButtonPress (ev)); /* EMIT SIGNAL */
 }
 
 bool