//sigc::signal<void,RouteGroup*> LevelMeter::ResetGroupPeakDisplays;
-LevelMeter::LevelMeter (boost::shared_ptr<IO> io, Session& s)
- : _io (io),
- _session (s)
+LevelMeter::LevelMeter (Session& s)
+ : _session (s)
{
set_spacing (1);
Config->ParameterChanged.connect (mem_fun (*this, &LevelMeter::parameter_changed));
UI::instance()->theme_changed.connect (mem_fun(*this, &LevelMeter::on_theme_changed));
+ ColorsChanged.connect (mem_fun (*this, &LevelMeter::color_handler));
+ max_peak = minus_infinity();
}
void
}
void
+LevelMeter::set_io (boost::shared_ptr<IO> io)
+{
+ _io = io;
+}
+
+float
LevelMeter::update_meters ()
{
vector<MeterInfo>::iterator i;
peak = _io->peak_input_power (n);
(*i).meter->set (log_meter (peak));
mpeak = _io->max_peak_power(n);
+ if (mpeak > max_peak) {
+ max_peak = mpeak;
+ }
}
}
+ return max_peak;
}
void
}
void
-LevelMeter::setup_meters (int len)
+LevelMeter::setup_meters (int len, int initial_width)
{
+ if (!_io) {
+ return; /* do it later */
+ }
+
+ regular_meter_width = initial_width;
uint32_t nmeters = _io->n_outputs();
guint16 width;
meters.push_back (MeterInfo());
}
+
+ int b = ARDOUR_UI::config()->canvasvar_MeterColorBase.get();
+ int m = ARDOUR_UI::config()->canvasvar_MeterColorMid.get();
+ int t = ARDOUR_UI::config()->canvasvar_MeterColorTop.get();
+ int c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get();
+
+ //cerr << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
+
for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
- if (meters[n].width != width || meters[n].length != len) {
+ if (meters[n].width != width || meters[n].length != len || color_changed) {
delete meters[n].meter;
- meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len);
+ meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, b, m, t, c);
//cerr << "LevelMeter::setup_meters() w:l = " << width << ":" << len << endl;//DEBUG
meters[n].width = width;
meters[n].length = len;
meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK);
+ meters[n].meter->signal_button_release_event().connect (bind (mem_fun(*this, &LevelMeter::meter_button_release), n));
}
- pack_start (*meters[n].meter, false, false);
+ pack_end (*meters[n].meter, false, false);
meters[n].meter->show_all ();
meters[n].packed = true;
}
show();
-}
+ color_changed = false;
+}
+
+gint
+LevelMeter::meter_button_release (GdkEventButton* ev, uint32_t which)
+{
+ if (ev->button == 1) {
+ clear_meters();
+ }
+ return true;
+}
+
void LevelMeter::clear_meters ()
{
for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
(*i).meter->clear();
}
+ max_peak = minus_infinity();
}
void LevelMeter::hide_meters ()
{
hide_all_meters();
}
+
+void
+LevelMeter::color_handler ()
+{
+ color_changed = true;
+}
+