diff options
-rw-r--r-- | gtk2_ardour/meter_patterns.cc | 274 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.cc | 26 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.h | 8 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.cc | 86 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/route_ui.cc | 5 |
6 files changed, 230 insertions, 171 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<ARDOUR::DataType> types) { @@ -247,38 +245,39 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map<int,float> points; + // tick-maker position in dBFS, line-thickness + std::map<float,float> points; switch (*i) { case DataType::AUDIO: switch (type) { case MeterK14: - points.insert (std::pair<int,float>(-54.0f, 1.0)); - points.insert (std::pair<int,float>(-44.0f, 1.0)); - points.insert (std::pair<int,float>(-34.0f, 1.0)); - points.insert (std::pair<int,float>(-24.0f, 1.0)); - points.insert (std::pair<int,float>(-20.0f, 1.0)); - points.insert (std::pair<int,float>(-17.0f, 1.0)); - points.insert (std::pair<int,float>(-14.0f, 1.0)); - points.insert (std::pair<int,float>(-11.0f, 1.0)); - points.insert (std::pair<int,float>( -8.0f, 1.0)); - points.insert (std::pair<int,float>( -4.0f, 1.0)); - points.insert (std::pair<int,float>( 0.0f, 1.0)); + points.insert (std::pair<float,float>(-54.0f, 1.0)); + points.insert (std::pair<float,float>(-44.0f, 1.0)); + points.insert (std::pair<float,float>(-34.0f, 1.0)); + points.insert (std::pair<float,float>(-24.0f, 1.0)); + points.insert (std::pair<float,float>(-20.0f, 1.0)); + points.insert (std::pair<float,float>(-17.0f, 1.0)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-11.0f, 1.0)); + points.insert (std::pair<float,float>( -8.0f, 1.0)); + points.insert (std::pair<float,float>( -4.0f, 1.0)); + points.insert (std::pair<float,float>( 0.0f, 1.0)); break; case MeterK20: - points.insert (std::pair<int,float>(-60.0f, 1.0)); - points.insert (std::pair<int,float>(-50.0f, 1.0)); - points.insert (std::pair<int,float>(-40.0f, 1.0)); - points.insert (std::pair<int,float>(-30.0f, 1.0)); - points.insert (std::pair<int,float>(-26.0f, 1.0)); - points.insert (std::pair<int,float>(-23.0f, 1.0)); - points.insert (std::pair<int,float>(-20.0f, 1.0)); - points.insert (std::pair<int,float>(-17.0f, 1.0)); - points.insert (std::pair<int,float>(-14.0f, 1.0)); - points.insert (std::pair<int,float>(-10.0f, 1.0)); - points.insert (std::pair<int,float>( -5.0f, 1.0)); - points.insert (std::pair<int,float>( 0.0f, 1.0)); + points.insert (std::pair<float,float>(-60.0f, 1.0)); + points.insert (std::pair<float,float>(-50.0f, 1.0)); + points.insert (std::pair<float,float>(-40.0f, 1.0)); + points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-26.0f, 1.0)); + points.insert (std::pair<float,float>(-23.0f, 1.0)); + points.insert (std::pair<float,float>(-20.0f, 1.0)); + points.insert (std::pair<float,float>(-17.0f, 1.0)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-10.0f, 1.0)); + points.insert (std::pair<float,float>( -5.0f, 1.0)); + points.insert (std::pair<float,float>( 0.0f, 1.0)); break; case MeterIEC2EBU: points.insert (std::pair<float,float>(-30.0f, 1.0)); @@ -357,64 +356,64 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ break; default: - points.insert (std::pair<int,float>(-60, 0.5)); - points.insert (std::pair<int,float>(-50, 1.0)); - points.insert (std::pair<int,float>(-40, 1.0)); - points.insert (std::pair<int,float>(-30, 1.0)); + points.insert (std::pair<float,float>(-60, 0.5)); + points.insert (std::pair<float,float>(-50, 1.0)); + points.insert (std::pair<float,float>(-40, 1.0)); + points.insert (std::pair<float,float>(-30, 1.0)); if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair<int,float>(-24, 1.0)); + points.insert (std::pair<float,float>(-24, 1.0)); } else { - points.insert (std::pair<int,float>(-25, 1.0)); + points.insert (std::pair<float,float>(-25, 1.0)); } - points.insert (std::pair<int,float>(-20, 1.0)); - - points.insert (std::pair<int,float>(-19, 0.5)); - points.insert (std::pair<int,float>(-18, 1.0)); - points.insert (std::pair<int,float>(-17, 0.5)); - points.insert (std::pair<int,float>(-16, 0.5)); - points.insert (std::pair<int,float>(-15, 1.0)); - - points.insert (std::pair<int,float>(-14, 0.5)); - points.insert (std::pair<int,float>(-13, 0.5)); - points.insert (std::pair<int,float>(-12, 0.5)); - points.insert (std::pair<int,float>(-11, 0.5)); - points.insert (std::pair<int,float>(-10, 1.0)); - - points.insert (std::pair<int,float>( -9, 1.0)); - points.insert (std::pair<int,float>( -8, 0.5)); - points.insert (std::pair<int,float>( -7, 0.5)); - points.insert (std::pair<int,float>( -6, 0.5)); - points.insert (std::pair<int,float>( -5, 1.0)); - points.insert (std::pair<int,float>( -4, 0.5)); - points.insert (std::pair<int,float>( -3, 1.0)); - points.insert (std::pair<int,float>( -2, 0.5)); - points.insert (std::pair<int,float>( -1, 0.5)); - - points.insert (std::pair<int,float>( 0, 1.0)); - points.insert (std::pair<int,float>( 1, 0.5)); - points.insert (std::pair<int,float>( 2, 0.5)); - points.insert (std::pair<int,float>( 3, 1.0)); - points.insert (std::pair<int,float>( 4, 0.5)); - points.insert (std::pair<int,float>( 5, 0.5)); + points.insert (std::pair<float,float>(-20, 1.0)); + + points.insert (std::pair<float,float>(-19, 0.5)); + points.insert (std::pair<float,float>(-18, 1.0)); + points.insert (std::pair<float,float>(-17, 0.5)); + points.insert (std::pair<float,float>(-16, 0.5)); + points.insert (std::pair<float,float>(-15, 1.0)); + + points.insert (std::pair<float,float>(-14, 0.5)); + points.insert (std::pair<float,float>(-13, 0.5)); + points.insert (std::pair<float,float>(-12, 0.5)); + points.insert (std::pair<float,float>(-11, 0.5)); + points.insert (std::pair<float,float>(-10, 1.0)); + + points.insert (std::pair<float,float>( -9, 1.0)); + points.insert (std::pair<float,float>( -8, 0.5)); + points.insert (std::pair<float,float>( -7, 0.5)); + points.insert (std::pair<float,float>( -6, 0.5)); + points.insert (std::pair<float,float>( -5, 1.0)); + points.insert (std::pair<float,float>( -4, 0.5)); + points.insert (std::pair<float,float>( -3, 1.0)); + points.insert (std::pair<float,float>( -2, 0.5)); + points.insert (std::pair<float,float>( -1, 0.5)); + + points.insert (std::pair<float,float>( 0, 1.0)); + points.insert (std::pair<float,float>( 1, 0.5)); + points.insert (std::pair<float,float>( 2, 0.5)); + points.insert (std::pair<float,float>( 3, 1.0)); + points.insert (std::pair<float,float>( 4, 0.5)); + points.insert (std::pair<float,float>( 5, 0.5)); break; } break; case DataType::MIDI: - points.insert (std::pair<int,float>( 0, 1.0)); - points.insert (std::pair<int,float>( 16, 0.5)); - points.insert (std::pair<int,float>( 32, 0.5)); - points.insert (std::pair<int,float>( 48, 0.5)); - points.insert (std::pair<int,float>( 64, 1.0)); - points.insert (std::pair<int,float>( 80, 0.5)); - points.insert (std::pair<int,float>( 96, 0.5)); - points.insert (std::pair<int,float>(100, 1.0)); - points.insert (std::pair<int,float>(112, 0.5)); - points.insert (std::pair<int,float>(127, 1.0)); + points.insert (std::pair<float,float>( 0, 1.0)); + points.insert (std::pair<float,float>( 16, 0.5)); + points.insert (std::pair<float,float>( 32, 0.5)); + points.insert (std::pair<float,float>( 48, 0.5)); + points.insert (std::pair<float,float>( 64, 1.0)); + points.insert (std::pair<float,float>( 80, 0.5)); + points.insert (std::pair<float,float>( 96, 0.5)); + points.insert (std::pair<float,float>(100, 1.0)); + points.insert (std::pair<float,float>(112, 0.5)); + points.insert (std::pair<float,float>(127, 1.0)); break; } - for (std::map<int,float>::const_iterator j = points.begin(); j != points.end(); ++j) { + for (std::map<float,float>::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<DataType> types) } + // label-pos in dBFS, label-text std::map<float,string> points; switch (*i) { @@ -540,53 +540,53 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) layout->set_attributes (audio_font_attributes); switch (type) { case MeterK14: - points.insert (std::pair<int,string>(-54.0f, "-40")); - points.insert (std::pair<int,string>(-44.0f, "-30")); - points.insert (std::pair<int,string>(-34.0f, "-20")); - points.insert (std::pair<int,string>(-24.0f, "-10")); - points.insert (std::pair<int,string>(-20.0f, "-6")); - points.insert (std::pair<int,string>(-17.0f, "-3")); - points.insert (std::pair<int,string>(-14.0f, "0")); - points.insert (std::pair<int,string>(-11.0f, "+3")); - points.insert (std::pair<int,string>( -8.0f, "+6")); - points.insert (std::pair<int,string>( -4.0f, "+10")); - points.insert (std::pair<int,string>( 0.0f, "+14")); + points.insert (std::pair<float,string>(-54.0f, "-40")); + points.insert (std::pair<float,string>(-44.0f, "-30")); + points.insert (std::pair<float,string>(-34.0f, "-20")); + points.insert (std::pair<float,string>(-24.0f, "-10")); + points.insert (std::pair<float,string>(-20.0f, "-6")); + points.insert (std::pair<float,string>(-17.0f, "-3")); + points.insert (std::pair<float,string>(-14.0f, "0")); + points.insert (std::pair<float,string>(-11.0f, "+3")); + points.insert (std::pair<float,string>( -8.0f, "+6")); + points.insert (std::pair<float,string>( -4.0f, "+10")); + points.insert (std::pair<float,string>( 0.0f, "+14")); break; case MeterK20: - points.insert (std::pair<int,string>(-60.0f, "-40")); - points.insert (std::pair<int,string>(-50.0f, "-30")); - points.insert (std::pair<int,string>(-40.0f, "-20")); - points.insert (std::pair<int,string>(-30.0f, "-10")); - points.insert (std::pair<int,string>(-26.0f, "-6")); - points.insert (std::pair<int,string>(-23.0f, "-3")); - points.insert (std::pair<int,string>(-20.0f, "0")); - points.insert (std::pair<int,string>(-17.0f, "+3")); - points.insert (std::pair<int,string>(-14.0f, "+6")); - points.insert (std::pair<int,string>(-10.0f, "+10")); - points.insert (std::pair<int,string>( -5.0f, "+15")); - points.insert (std::pair<int,string>( 0.0f, "+20")); + points.insert (std::pair<float,string>(-60.0f, "-40")); + points.insert (std::pair<float,string>(-50.0f, "-30")); + points.insert (std::pair<float,string>(-40.0f, "-20")); + points.insert (std::pair<float,string>(-30.0f, "-10")); + points.insert (std::pair<float,string>(-26.0f, "-6")); + points.insert (std::pair<float,string>(-23.0f, "-3")); + points.insert (std::pair<float,string>(-20.0f, "0")); + points.insert (std::pair<float,string>(-17.0f, "+3")); + points.insert (std::pair<float,string>(-14.0f, "+6")); + points.insert (std::pair<float,string>(-10.0f, "+10")); + points.insert (std::pair<float,string>( -5.0f, "+15")); + points.insert (std::pair<float,string>( 0.0f, "+20")); break; default: case MeterPeak: case MeterKrms: - points.insert (std::pair<int,string>(-50.0f, "-50")); - points.insert (std::pair<int,string>(-40.0f, "-40")); - points.insert (std::pair<int,string>(-30.0f, "-30")); - points.insert (std::pair<int,string>(-20.0f, "-20")); + points.insert (std::pair<float,string>(-50.0f, "-50")); + points.insert (std::pair<float,string>(-40.0f, "-40")); + points.insert (std::pair<float,string>(-30.0f, "-30")); + points.insert (std::pair<float,string>(-20.0f, "-20")); if (types.size() == 1) { if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair<int,string>(-24.0f, "-24")); + points.insert (std::pair<float,string>(-24.0f, "-24")); } else { - points.insert (std::pair<int,string>(-25.0f, "-25")); + points.insert (std::pair<float,string>(-25.0f, "-25")); } - points.insert (std::pair<int,string>(-15.0f, "-15")); + points.insert (std::pair<float,string>(-15.0f, "-15")); } - points.insert (std::pair<int,string>(-18.0f, "-18")); - points.insert (std::pair<int,string>(-10.0f, "-10")); - points.insert (std::pair<int,string>( -5.0f, "-5")); - points.insert (std::pair<int,string>( -3.0f, "-3")); - points.insert (std::pair<int,string>( 0.0f, "+0")); - points.insert (std::pair<int,string>( 3.0f, "+3")); + points.insert (std::pair<float,string>(-18.0f, "-18")); + points.insert (std::pair<float,string>(-10.0f, "-10")); + points.insert (std::pair<float,string>( -5.0f, "-5")); + points.insert (std::pair<float,string>( -3.0f, "-3")); + points.insert (std::pair<float,string>( 0.0f, "+0")); + points.insert (std::pair<float,string>( 3.0f, "+3")); break; case MeterIEC2EBU: @@ -600,13 +600,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case MeterIEC2BBC: - points.insert (std::pair<float,string>(-30.0f, "1")); - points.insert (std::pair<float,string>(-26.0f, "2")); - points.insert (std::pair<float,string>(-22.0f, "3")); - points.insert (std::pair<float,string>(-18.0f, "4")); - points.insert (std::pair<float,string>(-14.0f, "5")); - points.insert (std::pair<float,string>(-10.0f, "6")); - points.insert (std::pair<float,string>( -6.0f, "7")); + points.insert (std::pair<float,string>(-30.0f, " 1 ")); + points.insert (std::pair<float,string>(-26.0f, " 2 ")); + points.insert (std::pair<float,string>(-22.0f, " 3 ")); + points.insert (std::pair<float,string>(-18.0f, " 4 ")); + points.insert (std::pair<float,string>(-14.0f, " 5 ")); + points.insert (std::pair<float,string>(-10.0f, " 6 ")); + points.insert (std::pair<float,string>( -6.0f, " 7 ")); break; case MeterIEC1NOR: @@ -661,23 +661,23 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair<int,string>( 0, "0")); + points.insert (std::pair<float,string>( 0, "0")); if (types.size() == 1) { - points.insert (std::pair<int,string>( 16, "16")); - points.insert (std::pair<int,string>( 32, "32")); - points.insert (std::pair<int,string>( 48, "48")); - points.insert (std::pair<int,string>( 64, "64")); - points.insert (std::pair<int,string>( 80, "80")); - points.insert (std::pair<int,string>( 96, "96")); - points.insert (std::pair<int,string>(100, "100")); - points.insert (std::pair<int,string>(112, "112")); + points.insert (std::pair<float,string>( 16, "16")); + points.insert (std::pair<float,string>( 32, "32")); + points.insert (std::pair<float,string>( 48, "48")); + points.insert (std::pair<float,string>( 64, "64")); + points.insert (std::pair<float,string>( 80, "80")); + points.insert (std::pair<float,string>( 96, "96")); + points.insert (std::pair<float,string>(100, "100")); + points.insert (std::pair<float,string>(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair<int,string>( 24, "24")); - points.insert (std::pair<int,string>( 48, "48")); - points.insert (std::pair<int,string>( 72, "74")); + points.insert (std::pair<float,string>( 24, "24")); + points.insert (std::pair<float,string>( 48, "48")); + points.insert (std::pair<float,string>( 72, "74")); } - points.insert (std::pair<int,string>(127, "127")); + points.insert (std::pair<float,string>(127, "127")); break; } @@ -685,6 +685,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) for (std::map<float,string>::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<DataType> 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<DataType> 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<DataType> 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<void,MeterStrip*> MeterStrip::CatchDeletion; PBD::Signal0<void> 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<ARDOUR::Route>); - 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<ARDOUR::Route> _route; @@ -106,6 +107,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI ArdourButton peak_display; std::vector<ARDOUR::DataType> _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<MeterBridgeStrip>::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<MeterBridgeStrip>::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<MeterStrip *> _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<Route> 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 (); } |