From 8013160eb369ae8a97392284602e41cc77617b79 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 13:30:23 +0200 Subject: [PATCH] meterbridge metrics update: * display metrics for every used meter-type * show metrics between meters with differnet types * update text and label alignment for meterbridge * fix crash when deleting metrics-strip (zero route) * clean up metric pattern code (use float for dBFS) --- gtk2_ardour/meter_patterns.cc | 266 ++++++++++++++++++---------------- gtk2_ardour/meter_strip.cc | 26 +++- gtk2_ardour/meter_strip.h | 8 +- gtk2_ardour/meterbridge.cc | 86 +++++++---- gtk2_ardour/meterbridge.h | 2 +- gtk2_ardour/route_ui.cc | 5 + 6 files changed, 226 insertions(+), 167 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ff977c84c3..193039b3eb 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -108,7 +108,6 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } - static inline float mtr_col_and_fract( cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) { @@ -198,7 +197,6 @@ static inline float mtr_col_and_fract( } - static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) { @@ -247,38 +245,39 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map points; + // tick-maker position in dBFS, line-thickness + std::map points; switch (*i) { case DataType::AUDIO: switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, 1.0)); - points.insert (std::pair(-44.0f, 1.0)); - points.insert (std::pair(-34.0f, 1.0)); - points.insert (std::pair(-24.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-11.0f, 1.0)); - points.insert (std::pair( -8.0f, 1.0)); - points.insert (std::pair( -4.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-44.0f, 1.0)); + points.insert (std::pair(-34.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-11.0f, 1.0)); + points.insert (std::pair( -8.0f, 1.0)); + points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterK20: - points.insert (std::pair(-60.0f, 1.0)); - points.insert (std::pair(-50.0f, 1.0)); - points.insert (std::pair(-40.0f, 1.0)); - points.insert (std::pair(-30.0f, 1.0)); - points.insert (std::pair(-26.0f, 1.0)); - points.insert (std::pair(-23.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-10.0f, 1.0)); - points.insert (std::pair( -5.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-60.0f, 1.0)); + points.insert (std::pair(-50.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -5.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterIEC2EBU: points.insert (std::pair(-30.0f, 1.0)); @@ -357,64 +356,64 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ break; default: - points.insert (std::pair(-60, 0.5)); - points.insert (std::pair(-50, 1.0)); - points.insert (std::pair(-40, 1.0)); - points.insert (std::pair(-30, 1.0)); + points.insert (std::pair(-60, 0.5)); + points.insert (std::pair(-50, 1.0)); + points.insert (std::pair(-40, 1.0)); + points.insert (std::pair(-30, 1.0)); if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 1.0)); + points.insert (std::pair(-24, 1.0)); } else { - points.insert (std::pair(-25, 1.0)); + points.insert (std::pair(-25, 1.0)); } - points.insert (std::pair(-20, 1.0)); + points.insert (std::pair(-20, 1.0)); - points.insert (std::pair(-19, 0.5)); - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-17, 0.5)); - points.insert (std::pair(-16, 0.5)); - points.insert (std::pair(-15, 1.0)); + points.insert (std::pair(-19, 0.5)); + points.insert (std::pair(-18, 1.0)); + points.insert (std::pair(-17, 0.5)); + points.insert (std::pair(-16, 0.5)); + points.insert (std::pair(-15, 1.0)); - points.insert (std::pair(-14, 0.5)); - points.insert (std::pair(-13, 0.5)); - points.insert (std::pair(-12, 0.5)); - points.insert (std::pair(-11, 0.5)); - points.insert (std::pair(-10, 1.0)); + points.insert (std::pair(-14, 0.5)); + points.insert (std::pair(-13, 0.5)); + points.insert (std::pair(-12, 0.5)); + points.insert (std::pair(-11, 0.5)); + points.insert (std::pair(-10, 1.0)); - points.insert (std::pair( -9, 1.0)); - points.insert (std::pair( -8, 0.5)); - points.insert (std::pair( -7, 0.5)); - points.insert (std::pair( -6, 0.5)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -4, 0.5)); - points.insert (std::pair( -3, 1.0)); - points.insert (std::pair( -2, 0.5)); - points.insert (std::pair( -1, 0.5)); + points.insert (std::pair( -9, 1.0)); + points.insert (std::pair( -8, 0.5)); + points.insert (std::pair( -7, 0.5)); + points.insert (std::pair( -6, 0.5)); + points.insert (std::pair( -5, 1.0)); + points.insert (std::pair( -4, 0.5)); + points.insert (std::pair( -3, 1.0)); + points.insert (std::pair( -2, 0.5)); + points.insert (std::pair( -1, 0.5)); - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 1.0)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); break; } break; case DataType::MIDI: - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 16, 0.5)); - points.insert (std::pair( 32, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 64, 1.0)); - points.insert (std::pair( 80, 0.5)); - points.insert (std::pair( 96, 0.5)); - points.insert (std::pair(100, 1.0)); - points.insert (std::pair(112, 0.5)); - points.insert (std::pair(127, 1.0)); + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 16, 0.5)); + points.insert (std::pair( 32, 0.5)); + points.insert (std::pair( 48, 0.5)); + points.insert (std::pair( 64, 1.0)); + points.insert (std::pair( 80, 0.5)); + points.insert (std::pair( 96, 0.5)); + points.insert (std::pair(100, 1.0)); + points.insert (std::pair(112, 0.5)); + points.insert (std::pair(127, 1.0)); break; } - for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { + for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { cairo_set_line_width (cr, (j->second)); float fraction = 0; @@ -533,6 +532,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) } + // label-pos in dBFS, label-text std::map points; switch (*i) { @@ -540,53 +540,53 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->set_attributes (audio_font_attributes); switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, "-40")); - points.insert (std::pair(-44.0f, "-30")); - points.insert (std::pair(-34.0f, "-20")); - points.insert (std::pair(-24.0f, "-10")); - points.insert (std::pair(-20.0f, "-6")); - points.insert (std::pair(-17.0f, "-3")); - points.insert (std::pair(-14.0f, "0")); - points.insert (std::pair(-11.0f, "+3")); - points.insert (std::pair( -8.0f, "+6")); - points.insert (std::pair( -4.0f, "+10")); - points.insert (std::pair( 0.0f, "+14")); + points.insert (std::pair(-54.0f, "-40")); + points.insert (std::pair(-44.0f, "-30")); + points.insert (std::pair(-34.0f, "-20")); + points.insert (std::pair(-24.0f, "-10")); + points.insert (std::pair(-20.0f, "-6")); + points.insert (std::pair(-17.0f, "-3")); + points.insert (std::pair(-14.0f, "0")); + points.insert (std::pair(-11.0f, "+3")); + points.insert (std::pair( -8.0f, "+6")); + points.insert (std::pair( -4.0f, "+10")); + points.insert (std::pair( 0.0f, "+14")); break; case MeterK20: - points.insert (std::pair(-60.0f, "-40")); - points.insert (std::pair(-50.0f, "-30")); - points.insert (std::pair(-40.0f, "-20")); - points.insert (std::pair(-30.0f, "-10")); - points.insert (std::pair(-26.0f, "-6")); - points.insert (std::pair(-23.0f, "-3")); - points.insert (std::pair(-20.0f, "0")); - points.insert (std::pair(-17.0f, "+3")); - points.insert (std::pair(-14.0f, "+6")); - points.insert (std::pair(-10.0f, "+10")); - points.insert (std::pair( -5.0f, "+15")); - points.insert (std::pair( 0.0f, "+20")); + points.insert (std::pair(-60.0f, "-40")); + points.insert (std::pair(-50.0f, "-30")); + points.insert (std::pair(-40.0f, "-20")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-26.0f, "-6")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-14.0f, "+6")); + points.insert (std::pair(-10.0f, "+10")); + points.insert (std::pair( -5.0f, "+15")); + points.insert (std::pair( 0.0f, "+20")); break; default: case MeterPeak: case MeterKrms: - points.insert (std::pair(-50.0f, "-50")); - points.insert (std::pair(-40.0f, "-40")); - points.insert (std::pair(-30.0f, "-30")); - points.insert (std::pair(-20.0f, "-20")); + points.insert (std::pair(-50.0f, "-50")); + points.insert (std::pair(-40.0f, "-40")); + points.insert (std::pair(-30.0f, "-30")); + points.insert (std::pair(-20.0f, "-20")); if (types.size() == 1) { if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24.0f, "-24")); + points.insert (std::pair(-24.0f, "-24")); } else { - points.insert (std::pair(-25.0f, "-25")); + points.insert (std::pair(-25.0f, "-25")); } - points.insert (std::pair(-15.0f, "-15")); + points.insert (std::pair(-15.0f, "-15")); } - points.insert (std::pair(-18.0f, "-18")); - points.insert (std::pair(-10.0f, "-10")); - points.insert (std::pair( -5.0f, "-5")); - points.insert (std::pair( -3.0f, "-3")); - points.insert (std::pair( 0.0f, "+0")); - points.insert (std::pair( 3.0f, "+3")); + points.insert (std::pair(-18.0f, "-18")); + points.insert (std::pair(-10.0f, "-10")); + points.insert (std::pair( -5.0f, "-5")); + points.insert (std::pair( -3.0f, "-3")); + points.insert (std::pair( 0.0f, "+0")); + points.insert (std::pair( 3.0f, "+3")); break; case MeterIEC2EBU: @@ -600,13 +600,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case MeterIEC2BBC: - points.insert (std::pair(-30.0f, "1")); - points.insert (std::pair(-26.0f, "2")); - points.insert (std::pair(-22.0f, "3")); - points.insert (std::pair(-18.0f, "4")); - points.insert (std::pair(-14.0f, "5")); - points.insert (std::pair(-10.0f, "6")); - points.insert (std::pair( -6.0f, "7")); + points.insert (std::pair(-30.0f, " 1 ")); + points.insert (std::pair(-26.0f, " 2 ")); + points.insert (std::pair(-22.0f, " 3 ")); + points.insert (std::pair(-18.0f, " 4 ")); + points.insert (std::pair(-14.0f, " 5 ")); + points.insert (std::pair(-10.0f, " 6 ")); + points.insert (std::pair( -6.0f, " 7 ")); break; case MeterIEC1NOR: @@ -661,23 +661,23 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair( 0, "0")); + points.insert (std::pair( 0, "0")); if (types.size() == 1) { - points.insert (std::pair( 16, "16")); - points.insert (std::pair( 32, "32")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 64, "64")); - points.insert (std::pair( 80, "80")); - points.insert (std::pair( 96, "96")); - points.insert (std::pair(100, "100")); - points.insert (std::pair(112, "112")); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 32, "32")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 64, "64")); + points.insert (std::pair( 80, "80")); + points.insert (std::pair( 96, "96")); + points.insert (std::pair(100, "100")); + points.insert (std::pair(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair( 24, "24")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 72, "74")); + points.insert (std::pair( 24, "24")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 72, "74")); } - points.insert (std::pair(127, "127")); + points.insert (std::pair(127, "127")); break; } @@ -685,6 +685,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; + bool align_center = background; // this is true for meterbridge meters w/ fixed background switch (*i) { case DataType::AUDIO: fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); @@ -703,6 +704,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: + align_center = false; // don't bleed into legend fraction = (j->first) / 127.0; pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); @@ -725,7 +727,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) p = min (p, height - th); p = max (p, 0); - cairo_move_to (cr, width-3-tw, p); + if (align_center) { + cairo_move_to (cr, (width-tw)/2.0, p); + } else { + cairo_move_to (cr, width-3-tw, p); + } pango_cairo_show_layout (cr, layout->gobj()); } } @@ -767,13 +773,17 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->get_pixel_size(tw, th); break; case DataType::MIDI: - layout->set_text("vel"); + layout->set_text("mid"); layout->get_pixel_size(tw, th); break; } Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_move_to (cr, 2, height - th - 0.5); + if (tickleft) { + cairo_move_to (cr, width - 2 - tw, height - th - 0.5); + } else { + cairo_move_to (cr, 2, height - th - 0.5); + } pango_cairo_show_layout (cr, layout->gobj()); } diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 20419de7c7..4e4ffe11cf 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -57,7 +57,7 @@ using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; -MeterStrip::MeterStrip (int metricmode) +MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) , RouteUI(0) { @@ -67,7 +67,7 @@ MeterStrip::MeterStrip (int metricmode) peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); - set_metric_mode(metricmode); + set_metric_mode(metricmode, mt); meter_metric_area.set_size_request(25, 10); meter_metric_area.signal_expose_event().connect ( @@ -394,13 +394,17 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { - // TODO meter-type - set with set_metric_mode() - return meter_expose_metrics(ev, /*XXX*/ MeterPeak, _types, &meter_metric_area); + if (_route) { + return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); + } else { + return meter_expose_metrics(ev, metric_type, _types, &meter_metric_area); + } } void -MeterStrip::set_metric_mode (int metricmode) +MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) { + metric_type = mt; _types.clear (); switch(metricmode) { case 0: @@ -425,9 +429,12 @@ MeterStrip::set_metric_mode (int metricmode) meter_metric_area.queue_draw (); } -void -MeterStrip::set_pos (int pos) +MeterType +MeterStrip::meter_type() { + assert((!_route && _strip_type == 0) || (_route && _strip_type != 0)); + if (!_route) return metric_type; + return _route->meter_type(); } gint @@ -619,7 +626,10 @@ MeterStrip::set_meter_type (MeterType type) void MeterStrip::meter_type_changed (MeterType type) { - _route->set_meter_type(type); + if (_route->meter_type() != type) { + _route->set_meter_type(type); + } + MetricChanged(); } void diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 60e77eb2ef..4c532df5c7 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -47,7 +47,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); - MeterStrip (int); + MeterStrip (int, ARDOUR::MeterType); ~MeterStrip (); void set_session (ARDOUR::Session* s); @@ -63,9 +63,10 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType); - void set_metric_mode (int); - void set_pos(int); + void set_metric_mode (int, ARDOUR::MeterType); bool has_midi() { return _has_midi; } + bool is_metric_display() { return _strip_type == 0; } + ARDOUR::MeterType meter_type(); protected: boost::shared_ptr _route; @@ -106,6 +107,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI ArdourButton peak_display; std::vector _types; + ARDOUR::MeterType metric_type; float max_peak; bool _has_midi; diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index cdecb36c7c..2b51e9a85f 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -101,8 +101,8 @@ Meterbridge::Meterbridge () , VisibilityTracker (*((Gtk::Window*) this)) , _visible (false) , _show_busses (false) - , metrics_left (1) - , metrics_right (2) + , metrics_left (1, MeterPeak) + , metrics_right (2, MeterPeak) , cur_max_width (-1) { set_name ("Meter Bridge"); @@ -140,7 +140,7 @@ Meterbridge::Meterbridge () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); - MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this)); + MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -192,6 +192,10 @@ Meterbridge::Meterbridge () Meterbridge::~Meterbridge () { + while (_metrics.size() > 0) { + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -550,7 +554,6 @@ Meterbridge::add_strips (RouteList& routes) } resync_order(); - update_metrics(); } void @@ -567,24 +570,6 @@ Meterbridge::remove_strip (MeterStrip* strip) break; } } - update_metrics(); -} - -void -Meterbridge::update_metrics () -{ - bool have_midi = false; - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - if ( (*i).s->has_midi() && (*i).visible) { - have_midi = true; - break; - } - } - if (have_midi) { - metrics_right.set_metric_mode(2); - } else { - metrics_right.set_metric_mode(3); - } } void @@ -598,6 +583,11 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) int pos = 0; int vis = 0; + unsigned int metrics = 0; + MeterType lmt = MeterPeak; + bool have_midi = false; + metrics_left.set_metric_mode(1, lmt); + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { if (! (*i).s->route()->active()) { @@ -642,9 +632,55 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) (*i).visible = true; vis++; } - (*i).s->set_pos(vis); + + MeterType nmt = (*i).s->meter_type(); + if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics + + if ((*i).visible && nmt != lmt && pos == 0) { + lmt = nmt; + metrics_left.set_metric_mode(1, lmt); + } else if ((*i).visible && nmt != lmt) { + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + + lmt = nmt; + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(1, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(1, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + have_midi = false; + } + + if ((*i).visible && (*i).s->has_midi()) { + have_midi = true; + } + meterarea.reorder_child(*((*i).s), pos++); } + + metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); + + while (_metrics.size() > metrics) { + meterarea.remove(*_metrics.back()); + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -659,21 +695,17 @@ Meterbridge::parameter_changed (std::string const & p) if (p == "show-busses-on-meterbridge") { _show_busses = _session->config.get_show_busses_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-master-on-meterbridge") { _show_master = _session->config.get_show_master_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-midi-on-meterbridge") { _show_midi = _session->config.get_show_midi_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "meter-line-up-level") { meter_clear_pattern_cache(); - update_metrics(); } else if (p == "show-rec-on-meterbridge") { scroller.queue_resize(); diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 32ab2c929d..cca31d370c 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -78,7 +78,6 @@ class Meterbridge : void add_strips (ARDOUR::RouteList&); void remove_strip (MeterStrip *); - void update_metrics (); void session_going_away (); void sync_order_keys (ARDOUR::RouteSortOrderKey src); @@ -116,6 +115,7 @@ class Meterbridge : MeterStrip metrics_left; MeterStrip metrics_right; + std::vector _metrics; Gtk::VBox metrics_vpacker_left; Gtk::VBox metrics_vpacker_right; diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index bf14719d70..bbc60ef425 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -66,6 +66,11 @@ boost::weak_ptr RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) : AxisView(sess) + , mute_menu(0) + , solo_menu(0) + , sends_menu(0) + , record_menu(0) + , _invert_menu(0) { if (sess) init (); }