diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-07 02:00:43 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-10 15:27:12 +0200 |
commit | 6e1781e5e33d6d97233a2e46aa98fd570d09e31f (patch) | |
tree | 92d236a8a82c9ba33687e2abc3988f2d7f5c7720 /gtk2_ardour | |
parent | a181009caefd5fe9efb73fff7c0c663dc8415e0a (diff) |
experimental RMS-meter and peak-signal (vs peak-power) query
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/level_meter.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.cc | 45 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.h | 6 |
4 files changed, 65 insertions, 2 deletions
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 34d34608c6..cc45e45f70 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -59,6 +59,7 @@ LevelMeter::LevelMeter (Session* s) UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeter::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeter::color_handler)); max_peak = minus_infinity(); + meter_type = MeterPeak; } void @@ -100,7 +101,7 @@ LevelMeter::update_meters () for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) { if ((*i).packed) { - mpeak = _meter->max_peak_power(n); + mpeak = _meter->meter_level(n, MeterMaxPeak); if (mpeak > (*i).max_peak) { (*i).max_peak = mpeak; (*i).meter->set_highlight(mpeak > Config->get_meter_peak()); @@ -109,7 +110,7 @@ LevelMeter::update_meters () max_peak = mpeak; } - peak = _meter->peak_power (n); + peak = _meter->meter_level (n, meter_type); if (n < nmidi) { (*i).meter->set (peak); } else { @@ -280,6 +281,13 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) color_changed = false; } +void +LevelMeter::set_type(MeterType t) +{ + meter_type = t; + _meter->set_type(t); +} + bool LevelMeter::meter_button_press (GdkEventButton* ev) { diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index 0792872755..0fa8388428 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -67,6 +67,9 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr void hide_meters (); void setup_meters (int len=0, int width=3, int thin=2); + void set_type (ARDOUR::MeterType); + ARDOUR::MeterType get_type () { return meter_type; } + /** Emitted in the GUI thread when a button is pressed over the meter */ PBD::Signal1<bool, GdkEventButton *> ButtonPress; @@ -96,6 +99,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr guint16 thin_meter_width; std::vector<MeterInfo> meters; float max_peak; + ARDOUR::MeterType meter_type; PBD::ScopedConnection _configuration_connection; PBD::ScopedConnection _parameter_connection; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index a2872063d4..1b4938694d 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -112,6 +112,7 @@ 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->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1)); meter_align.set(0.5, 0.5, 0.0, 1.0); meter_align.add(*level_meter); @@ -426,3 +427,47 @@ MeterStrip::parameter_changed (std::string const & p) 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; + + add_level_meter_item (items, group, _("Peak"), MeterPeak); + add_level_meter_item (items, group, _("RMS"), MeterKrms); + + m->popup (ev->button, ev->time); +} + +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_point), type))); + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ()); + i->set_active (level_meter->get_type() == type); +} + +void +MeterStrip::set_meter_point (MeterType m) +{ + level_meter->set_type (m); +} diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4589742916..7bbed6370a 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -66,6 +66,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI protected: boost::shared_ptr<ARDOUR::Route> _route; PBD::ScopedConnectionList route_connections; + PBD::ScopedConnectionList level_meter_connection; void self_delete (); gint meter_metrics_expose (GdkEventExpose *); @@ -114,6 +115,11 @@ class MeterStrip : public Gtk::VBox, public RouteUI void parameter_changed (std::string const & p); void redraw_metrics (); + + bool level_meter_button_press (GdkEventButton* ev); + void popup_level_meter_menu (GdkEventButton* ev); + void add_level_meter_item (Gtk::Menu_Helpers::MenuList& items, Gtk::RadioMenuItem::Group& group, std::string const & name, ARDOUR::MeterType mode); + void set_meter_point (ARDOUR::MeterType mode); }; #endif /* __ardour_mixer_strip__ */ |