diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-05 22:18:04 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-10 15:27:11 +0200 |
commit | 62d5585e34d410c9c5feb7cf7b4742360c2187b0 (patch) | |
tree | 3ca7125166d46d2205187867a8f499aa009fcda8 | |
parent | 09be35c5cbfc218f9a83842e10f41db14ba4abea (diff) |
prepare meter configuration..
- 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
-rw-r--r-- | gtk2_ardour/gain_meter.cc | 17 | ||||
-rw-r--r-- | gtk2_ardour/gain_meter.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.cc | 33 | ||||
-rw-r--r-- | gtk2_ardour/meter_patterns.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/meter_patterns.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.cc | 15 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.cc | 16 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 14 | ||||
-rw-r--r-- | libs/ardour/ardour/rc_configuration_vars.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 9 | ||||
-rw-r--r-- | libs/ardour/enums.cc | 21 |
13 files changed, 126 insertions, 17 deletions
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 5ddfdc18f4..a398c7c833 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -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 } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 19e03b82ee..c48d250947 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -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; diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 04bfdb8fd6..7a32b473f3 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -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(); diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 9b90931e73..c34c492f75 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -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(); } diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index ae89a7866d..b793a9cc3c 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -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); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 011bbe554e..faaa07b566 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -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(); +} diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 454a3af6f1..c50c810fcf 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -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__ */ diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 99b80fb668..782a8f84fc 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -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(); } diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 56ace71aa9..faa107c14e 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -116,6 +116,7 @@ class Meterbridge : void on_size_request (Gtk::Requisition*); void parameter_changed (std::string const & p); + void on_theme_changed (); }; #endif diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index da0e55c7a2..f447589398 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -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 diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index d8440f24f3..fa1e23db4d 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -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 */ diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 5bd03d2788..c41c599f1c 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -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); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index b96394d16f..2bf8ded866 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -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; |