summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-07 02:00:43 +0200
committerRobin Gareus <robin@gareus.org>2013-07-10 15:27:12 +0200
commit6e1781e5e33d6d97233a2e46aa98fd570d09e31f (patch)
tree92d236a8a82c9ba33687e2abc3988f2d7f5c7720 /gtk2_ardour
parenta181009caefd5fe9efb73fff7c0c663dc8415e0a (diff)
experimental RMS-meter and peak-signal (vs peak-power) query
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/level_meter.cc12
-rw-r--r--gtk2_ardour/level_meter.h4
-rw-r--r--gtk2_ardour/meter_strip.cc45
-rw-r--r--gtk2_ardour/meter_strip.h6
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__ */