prepare meter configuration..
authorRobin Gareus <robin@gareus.org>
Fri, 5 Jul 2013 20:18:04 +0000 (22:18 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 10 Jul 2013 13:27:11 +0000 (15:27 +0200)
- rework metric/tick image cache invalidation
  - flush cache
  - send signal to queue redraws
  (TODO) selectively flush cache // cache per size, style
- add four common line up levels

13 files changed:
gtk2_ardour/gain_meter.cc
gtk2_ardour/gain_meter.h
gtk2_ardour/level_meter.cc
gtk2_ardour/meter_patterns.cc
gtk2_ardour/meter_patterns.h
gtk2_ardour/meter_strip.cc
gtk2_ardour/meter_strip.h
gtk2_ardour/meterbridge.cc
gtk2_ardour/meterbridge.h
gtk2_ardour/rc_option_editor.cc
libs/ardour/ardour/rc_configuration_vars.h
libs/ardour/ardour/types.h
libs/ardour/enums.cc

index 5ddfdc18f4a8d5d8a8c68481ce4dc2608bd951ec..a398c7c8332ae0d658318c3d61fd2e423dd289ba 100644 (file)
@@ -130,6 +130,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_peak_display));
        ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_route_peak_display));
        ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_group_peak_display));
+       RedrawMetrics.connect (sigc::mem_fun(*this, &GainMeterBase::redraw_metrics));
 
        UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &GainMeterBase::on_theme_changed));
        ColorsChanged.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), false));
@@ -851,11 +852,7 @@ GainMeterBase::update_meters()
 
 void GainMeterBase::color_handler(bool dpi)
 {
-       meter_clear_pattern_cache();
        setup_meters();
-       meter_metric_area.queue_draw ();
-       meter_ticks1_area.queue_draw ();
-       meter_ticks2_area.queue_draw ();
 }
 
 void
@@ -873,7 +870,11 @@ GainMeterBase::set_width (Width w, int len)
 void
 GainMeterBase::on_theme_changed()
 {
-       meter_clear_pattern_cache();
+}
+
+void
+GainMeterBase::redraw_metrics()
+{
        meter_metric_area.queue_draw ();
        meter_ticks1_area.queue_draw ();
        meter_ticks2_area.queue_draw ();
@@ -1062,10 +1063,6 @@ GainMeter::meter_configuration_changed (ChanCount c)
                        set_meter_strip_name ("AudioMidiTrackMetricsInactive");
                }
        }
-
-       meter_clear_pattern_cache();
-       meter_metric_area.queue_draw ();
-       meter_ticks1_area.queue_draw ();
-       meter_ticks2_area.queue_draw ();
+       meter_clear_pattern_cache(); // XXX only once
 }
 
index 19e03b82ee2355f37072871ffcb61ab06878fea3..c48d250947995367fba0a4023aa279bd9858d9a5 100644 (file)
@@ -184,6 +184,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
        void reset_route_peak_display (ARDOUR::Route*);
        void reset_group_peak_display (ARDOUR::RouteGroup*);
 
+       void redraw_metrics ();
        void on_theme_changed ();
        void color_handler(bool);
        ARDOUR::DataType _data_type;
index 04bfdb8fd6ef1553a01c183ac46f1fdafa0bdc82..7a32b473f3c065cdb3c083e874b0b2a992b9065a 100644 (file)
@@ -133,6 +133,10 @@ LevelMeter::parameter_changed (string p)
                        (*i).meter->set_hold_count ((uint32_t) floor(Config->get_meter_hold()));
                }
        }
+       else if (p == "meter-line-up-level") {
+               color_changed = true;
+               setup_meters (meter_length, regular_meter_width, thin_meter_width);
+       }
 }
 
 void
@@ -188,7 +192,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
 
        for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
                uint32_t c[10];
-               float stp[4] =  {55.0, 77.5, 92.5, 100.0};
+               float stp[4];
                if (n < nmidi) {
                        c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get();
                        c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get();
@@ -205,6 +209,33 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width)
                        stp[2] = 115.0 * 100.0 / 128.0;
                        stp[3] = 115.0 * 112.0 / 128.0;
                } else {
+                       switch (Config->get_meter_line_up_level()) {
+                               case MeteringLineUp24:
+                                       stp[0] = 42.0;
+                                       stp[1] = 77.5;
+                                       stp[2] = 92.5;
+                                       stp[3] = 100.0;
+                                       break;
+                               case MeteringLineUp20:
+                                       stp[0] = 50.0;
+                                       stp[1] = 77.5;
+                                       stp[2] = 92.5;
+                                       stp[3] = 100.0;
+                                       break;
+                               default:
+                               case MeteringLineUp18:
+                                       stp[0] = 55.0;
+                                       stp[1] = 77.5;
+                                       stp[2] = 92.5;
+                                       stp[3] = 100.0;
+                                       break;
+                               case MeteringLineUp15:
+                                       stp[0] = 62.5;
+                                       stp[1] = 77.5;
+                                       stp[2] = 92.5;
+                                       stp[3] = 100.0;
+                                       break;
+                       }
                        c[0] = ARDOUR_UI::config()->canvasvar_MeterColor0.get();
                        c[1] = ARDOUR_UI::config()->canvasvar_MeterColor1.get();
                        c[2] = ARDOUR_UI::config()->canvasvar_MeterColor2.get();
index 9b90931e73eacb881e99846ba2b5a6113f44489a..c34c492f757ba3bf01663271538dc93b9cfbe052 100644 (file)
@@ -22,6 +22,7 @@
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/rgb_macros.h>
 
+#include <ardour/rc_configuration.h>
 #include "ardour_ui.h"
 #include "utils.h"
 #include "logmeter.h"
@@ -41,6 +42,7 @@ static const int max_pattern_metric_size = 1026;
 sigc::signal<void> ResetAllPeakDisplays;
 sigc::signal<void,ARDOUR::Route*> ResetRoutePeakDisplays;
 sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
+sigc::signal<void> RedrawMetrics;
 
 cairo_pattern_t*
 meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
@@ -98,6 +100,9 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
                        points.insert (std::pair<int,float>(-50, 0.5));
                        points.insert (std::pair<int,float>(-40, 0.5));
                        points.insert (std::pair<int,float>(-30, 0.5));
+                       if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+                               points.insert (std::pair<int,float>(-24, 0.5));
+                       }
                        points.insert (std::pair<int,float>(-25, 0.5));
                        points.insert (std::pair<int,float>(-20, 1.0));
 
@@ -276,7 +281,11 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                        points.insert (std::pair<int,float>(-30, 0.5));
                        points.insert (std::pair<int,float>(-20, 1.0));
                        if (types.size() == 1) {
-                               points.insert (std::pair<int,float>(-25, 0.5));
+                               if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+                                       points.insert (std::pair<int,float>(-24, 0.5));
+                               } else {
+                                       points.insert (std::pair<int,float>(-25, 0.5));
+                               }
                                points.insert (std::pair<int,float>(-15, 1.0));
                        }
                        points.insert (std::pair<int,float>(-18, 1.0));
@@ -476,4 +485,5 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> typ
 void meter_clear_pattern_cache() {
        metric_patterns.clear();
        ticks_patterns.clear();
+       RedrawMetrics();
 }
index ae89a7866df32d2d5fac708df0189e4a08e5ee22..b793a9cc3c0372a68618fd7a1db0238f2a825879 100644 (file)
@@ -30,6 +30,7 @@
 extern sigc::signal<void> ResetAllPeakDisplays;
 extern sigc::signal<void,ARDOUR::Route*> ResetRoutePeakDisplays;
 extern sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
+extern sigc::signal<void> RedrawMetrics;
 
 cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, std::vector<ARDOUR::DataType> types);
 cairo_pattern_t* meter_render_metrics (Gtk::Widget& w, std::vector<ARDOUR::DataType> types);
index 011bbe554e16d9c9429b3507f9288d868cdcd16a..faaa07b566c70e4c00391d6703da4c1185ec3018 100644 (file)
@@ -71,6 +71,7 @@ MeterStrip::MeterStrip (int metricmode)
        set_size_request_to_display_given_text (meter_metric_area, "-8888", 1, 0);
        meter_metric_area.signal_expose_event().connect (
                        sigc::mem_fun(*this, &MeterStrip::meter_metrics_expose));
+       RedrawMetrics.connect (sigc::mem_fun(*this, &MeterStrip::redraw_metrics));
 
        meterbox.pack_start(meter_metric_area, true, false);
 
@@ -174,6 +175,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
        ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_peak_display));
        ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_route_peak_display));
        ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_group_peak_display));
+       RedrawMetrics.connect (sigc::mem_fun(*this, &MeterStrip::redraw_metrics));
 
        meter_configuration_changed (_route->shared_peak_meter()->input_streams ());
 
@@ -249,8 +251,6 @@ MeterStrip::fast_update ()
 void
 MeterStrip::on_theme_changed()
 {
-       meter_clear_pattern_cache();
-
        if (level_meter && _route) {
                int meter_width = 6;
                if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
@@ -258,9 +258,6 @@ MeterStrip::on_theme_changed()
                }
                level_meter->setup_meters (220, meter_width, 6);
        }
-       meter_metric_area.queue_draw();
-       meter_ticks1_area.queue_draw();
-       meter_ticks2_area.queue_draw();
 }
 
 void
@@ -412,3 +409,11 @@ MeterStrip::peak_button_release (GdkEventButton* ev)
        }
        return true;
 }
+
+void
+MeterStrip::redraw_metrics ()
+{
+       meter_metric_area.queue_draw();
+       meter_ticks1_area.queue_draw();
+       meter_ticks2_area.queue_draw();
+}
index 454a3af6f1ebc65abe01900d72520a13a0e431cd..c50c810fcfaa35fdacb5238c2957cdd0a9d9c0fd 100644 (file)
@@ -111,6 +111,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI
        static int max_pattern_metric_size; // == FastMeter::max_pattern_metric_size
 
        bool peak_button_release (GdkEventButton*);
+
+       void redraw_metrics ();
 };
 
 #endif /* __ardour_mixer_strip__ */
index 99b80fb668fe93e4204f126cf64f43fe94a6e4e5..782a8f84fcc38972a7bba35cc9a4ba3e6ec95360 100644 (file)
@@ -51,6 +51,8 @@
 #include "route_sorter.h"
 #include "actions.h"
 #include "gui_thread.h"
+#include "global_signals.h"
+#include "meter_patterns.h"
 
 #include "i18n.h"
 
@@ -200,6 +202,10 @@ Meterbridge::Meterbridge ()
        Gtk::Viewport* viewport = (Gtk::Viewport*) scroller.get_child();
        viewport->set_shadow_type(Gtk::SHADOW_NONE);
        viewport->set_border_width(0);
+
+       UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &Meterbridge::on_theme_changed));
+       ColorsChanged.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
+       DPIReset.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
 }
 
 Meterbridge::~Meterbridge ()
@@ -398,6 +404,7 @@ Meterbridge::set_session (Session* s)
        _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
        _session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
        _session->config.ParameterChanged.connect (*this, invalidator (*this), ui_bind (&Meterbridge::parameter_changed, this, _1), gui_context());
+       Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&Meterbridge::parameter_changed, this, _1), gui_context());
 
        if (_visible) {
                show_window();
@@ -654,4 +661,13 @@ Meterbridge::parameter_changed (std::string const & p)
                _show_midi = _session->config.get_show_midi_on_meterbridge();
                sync_order_keys(MixerSort);
        }
+       else if (p == "meter-line-up-level") {
+               meter_clear_pattern_cache();
+       }
+}
+
+void
+Meterbridge::on_theme_changed ()
+{
+       meter_clear_pattern_cache();
 }
index 56ace71aa959ddcbb3b62c3285ea14752ba2a225..faa107c14e9b9f8192f8adc00a380ef897de6b6e 100644 (file)
@@ -116,6 +116,7 @@ class Meterbridge :
        void on_size_request (Gtk::Requisition*);
 
        void parameter_changed (std::string const & p);
+       void on_theme_changed ();
 };
 
 #endif
index da0e55c7a2e8f849bb6f8ad54b653375c74ce266..f44758939833cf6cd01a04969cb64e3f0cd18d0f 100644 (file)
@@ -1923,6 +1923,20 @@ RCOptionEditor::RCOptionEditor ()
        mfo->add (METER_FALLOFF_FASTEST, _("fastest"));
 
        add_option (S_("Preferences|GUI"), mfo);
+
+       ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
+               "meter-line-up-level",
+               _("Meter Line Up Level"),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
+               );
+
+       mlu->add (MeteringLineUp24, _("-24dB"));
+       mlu->add (MeteringLineUp20, _("-20dB"));
+       mlu->add (MeteringLineUp18, _("-18dB"));
+       mlu->add (MeteringLineUp15, _("-15dB"));
+
+       add_option (S_("Preferences|GUI"), mlu);
 }
 
 void
index d8440f24f3c5e5acf20351a0b6f25c5959f6add5..fa1e23db4de3ad2fb8eec838f0e531b275d9a45b 100644 (file)
@@ -149,6 +149,7 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal
 
 CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f)
 CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f)
+CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18)
 
 /* miscellany */
 
index 5bd03d2788d628394626a88a489784cee9f43296..c41c599f1c2dfdeb9907af834130b2f8639d00be 100644 (file)
@@ -367,6 +367,13 @@ namespace ARDOUR {
                MeteringRoute  ///< meter what is going through the route
        };
 
+       enum MeterLineUp {
+               MeteringLineUp24,
+               MeteringLineUp20,
+               MeteringLineUp18,
+               MeteringLineUp15
+       };
+
        enum PFLPosition {
                /** PFL signals come from before pre-fader processors */
                PFLFromBeforeProcessors,
@@ -567,6 +574,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
@@ -588,6 +596,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
index b96394d16fe36d459feff6c698dfee4b0924e96c..2bf8ded866181c97c6367b664942c757e161199f 100644 (file)
@@ -61,6 +61,7 @@ setup_enum_writer ()
        ColorMode _ColorMode;
        MeterFalloff _MeterFalloff;
        MeterHold _MeterHold;
+       MeterLineUp _MeterLineUp;
        EditMode _EditMode;
        RegionPoint _RegionPoint;
        Placement _Placement;
@@ -205,6 +206,12 @@ setup_enum_writer ()
        REGISTER_ENUM (MeterHoldLong);
        REGISTER (_MeterHold);
 
+       REGISTER_ENUM (MeteringLineUp24);
+       REGISTER_ENUM (MeteringLineUp20);
+       REGISTER_ENUM (MeteringLineUp18);
+       REGISTER_ENUM (MeteringLineUp15);
+       REGISTER (_MeterLineUp);
+
        REGISTER_ENUM (Slide);
        REGISTER_ENUM (Splice);
        REGISTER_ENUM (Lock);
@@ -652,6 +659,20 @@ std::ostream& operator<<(std::ostream& o, const MonitorModel& var)
        return o << s;
 }
 
+std::istream& operator>>(std::istream& o, MeterLineUp& var)
+{
+       std::string s;
+       o >> s;
+       var = (MeterLineUp) string_2_enum (s, var);
+       return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const MeterLineUp& var)
+{
+       std::string s = enum_2_string (var);
+       return o << s;
+}
+
 std::istream& operator>>(std::istream& o, PFLPosition& var)
 {
        std::string s;