, 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 ()
_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());
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) {
void
LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
{
- color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
LevelMeterBase::meter_type_changed (MeterType t)
{
meter_type = t;
- color_changed = true;
setup_meters (meter_length, regular_meter_width, thin_meter_width);
MeterTypeChanged(t);
}
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 */
}
guint16 width;
if (nmeters == 0) {
+ hide_all_meters ();
return;
}
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());
}
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()) {
//show();
color_changed = false;
visible_meter_type = meter_type;
+ visible_meter_count = nmeters;
}
void
bool
LevelMeterBase::meter_button_press (GdkEventButton* ev)
{
- return !!ButtonPress (ev); /* EMIT SIGNAL */
+ return static_cast<bool>(ButtonPress (ev)); /* EMIT SIGNAL */
}
bool