meterbridge metrics update:
authorRobin Gareus <robin@gareus.org>
Tue, 23 Jul 2013 11:30:23 +0000 (13:30 +0200)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 8 Aug 2013 19:24:15 +0000 (15:24 -0400)
* 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
gtk2_ardour/meter_strip.cc
gtk2_ardour/meter_strip.h
gtk2_ardour/meterbridge.cc
gtk2_ardour/meterbridge.h
gtk2_ardour/route_ui.cc

index ff977c84c3d33a8b0b1a24df1823b9b96b1c73ba..193039b3eb8df0b39df0da45d65e3a16e8f3bdc0 100644 (file)
@@ -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());
        }
 
index 20419de7c7af131a5e99b8c3b6a7b2a0d990673f..4e4ffe11cf13c914e88af58a4cdcae354ab2c31a 100644 (file)
@@ -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
index 60e77eb2ef6b9b3dea8f9e407928125096860866..4c532df5c76555b75054f29dc050b8fc398000e5 100644 (file)
@@ -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;
index cdecb36c7cec1a8e3e92bd937b56e1e804987503..2b51e9a85f77827ed7dd394e97fb06f954460cdf 100644 (file)
@@ -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();
index 32ab2c929d42b80caca24d1f04757622d4c0bd95..cca31d370c21beeab21ca09892f17d4f3b83760d 100644 (file)
@@ -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;
index bf14719d70f7de4d04c982f790c9b2ad3c6cc99e..bbc60ef4259196fa5878cfbb14d827a1c0476a59 100644 (file)
@@ -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 ();
 }