X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Flevel_meter.cc;h=75cd5e60eb2635caf3939b08c34e12d41b00c7e1;hb=62a2d6a0647cd636f8711acceccc22142bb899aa;hp=ecfffa6ae9596ca094a9bc867b381788e2f1b431;hpb=64fa63212f7e79bab16147817211a33a3f7c8fba;p=ardour.git diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index ecfffa6ae9..75cd5e60eb 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -49,19 +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()); - UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeterBase::on_theme_changed)); + ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun(*this, &LevelMeterBase::parameter_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 () @@ -82,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()); @@ -154,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) { @@ -211,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); } @@ -219,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); } @@ -238,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 */ } @@ -253,6 +251,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) guint16 width; if (nmeters == 0) { + hide_all_meters (); return; } @@ -262,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()); } @@ -376,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()) { @@ -424,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 @@ -436,7 +478,7 @@ LevelMeterBase::set_type(MeterType t) bool LevelMeterBase::meter_button_press (GdkEventButton* ev) { - return !!ButtonPress (ev); /* EMIT SIGNAL */ + return static_cast(ButtonPress (ev)); /* EMIT SIGNAL */ } bool