invalidate meter-color cache when midi channel count changes
authorRobin Gareus <robin@gareus.org>
Fri, 22 Jul 2016 10:57:14 +0000 (12:57 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 22 Jul 2016 10:57:24 +0000 (12:57 +0200)
This fixes a bug of midi-colors being used for audio-meters or
vice versa when when the total channel count remained identical

gtk2_ardour/level_meter.cc
gtk2_ardour/level_meter.h

index 2ab2cf567c2d65dd085db7f6832708705a122c44..c8c2133230a20672cf2878a105757e1087e1c0a1 100644 (file)
@@ -51,6 +51,7 @@ LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord*
        , max_peak (minus_infinity())
        , meter_type (MeterPeak)
        , visible_meter_type (MeterType(0))
+       , midi_count (0)
        , meter_count (0)
        , max_visible_meters (0)
        , color_changed (false)
@@ -254,7 +255,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
                return; /* do it later or never */
        }
 
-       int32_t nmidi = _meter->input_streams().n_midi();
+       uint32_t nmidi = _meter->input_streams().n_midi();
        uint32_t nmeters = _meter->input_streams().n_total();
        regular_meter_width = initial_width;
        thin_meter_width = thin_width;
@@ -276,6 +277,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
        width = rint (width * UIConfiguration::instance().get_ui_scale());
 
        if (   meters.size() > 0
+           && nmidi == midi_count
            && nmeters == meter_count
            && meters[0].width == width
            && meters[0].length == len
@@ -450,7 +452,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
                                }
                        }
                }
-               if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
+               if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type || nmidi != midi_count) {
                        bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
                        meters[n].packed = false;
                        delete meters[n].meter;
@@ -481,6 +483,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
        //show();
        color_changed = false;
        visible_meter_type = meter_type;
+       midi_count = nmidi;
        meter_count = nmeters;
 }
 
index 758b94c37bd310e72a9468176dc9c225ecea9ed4..d5fb62c6ac63cf027a0a21ecac3ef8dfe13a0677 100644 (file)
@@ -109,6 +109,7 @@ class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::tra
        float                  max_peak;
        ARDOUR::MeterType      meter_type;
        ARDOUR::MeterType      visible_meter_type;
+       uint32_t               midi_count;
        uint32_t               meter_count;
        uint32_t               max_visible_meters;