with RMS meters: use "peak indicator" as DPM
[ardour.git] / gtk2_ardour / meter_strip.cc
index fcb3561eaa192aa5fbdc4dda79539f2d0175183f..759bdef16aa4ccc3d38d23633eb81ba0135ad4f2 100644 (file)
@@ -112,6 +112,9 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
        level_meter->set_meter (_route->shared_peak_meter().get());
        level_meter->clear_meters();
        level_meter->setup_meters (220, meter_width, 6);
+       level_meter->set_type (_route->meter_type());
+       level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1));
+       level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1));
 
        meter_align.set(0.5, 0.5, 0.0, 1.0);
        meter_align.add(*level_meter);
@@ -192,6 +195,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
        UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed));
        ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
        DPIReset.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
+       Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MeterStrip::parameter_changed, this, _1), gui_context());
 }
 
 MeterStrip::~MeterStrip ()
@@ -417,3 +421,65 @@ MeterStrip::redraw_metrics ()
        meter_ticks1_area.queue_draw();
        meter_ticks2_area.queue_draw();
 }
+
+void
+MeterStrip::parameter_changed (std::string const & p)
+{
+       if (p == "meter-peak") {
+               max_peak = -INFINITY;
+       }
+}
+
+
+bool
+MeterStrip::level_meter_button_press (GdkEventButton* ev)
+{
+       if (ev->button == 3) {
+               popup_level_meter_menu (ev);
+               return true;
+       }
+
+       return false;
+}
+
+void
+MeterStrip::popup_level_meter_menu (GdkEventButton* ev)
+{
+       using namespace Gtk::Menu_Helpers;
+
+       Gtk::Menu* m = manage (new Menu);
+       MenuList& items = m->items ();
+
+       RadioMenuItem::Group group;
+
+       _suspend_menu_callbacks = true;
+       add_level_meter_item (items, group, _("Peak"), MeterPeak);
+       add_level_meter_item (items, group, _("RMS + Peak"), MeterKrms);
+
+       m->popup (ev->button, ev->time);
+       _suspend_menu_callbacks = false;
+}
+
+void
+MeterStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
+{
+       using namespace Menu_Helpers;
+
+       items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MeterStrip::set_meter_type), type)));
+       RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+       i->set_active (_route->meter_type() == type);
+}
+
+void
+MeterStrip::set_meter_type (MeterType m)
+{
+       if (_suspend_menu_callbacks) return;
+       level_meter->set_type (m);
+}
+
+void
+MeterStrip::meter_type_changed (MeterType t)
+{
+       _route->set_meter_type(t);
+}
+