Various fixes to multiple-2D panner signal handling. Should fix some or all of ...
[ardour.git] / gtk2_ardour / panner_ui.cc
index 88bd2b5ccabbac2a472923a501e372328b3e0b6d..1a48353e0beee49b7b39296191e0df1ec418c0ac 100644 (file)
@@ -155,10 +155,6 @@ PannerUI::set_panner (boost::shared_ptr<Panner> p)
        _panner->LinkStateChanged.connect (connections, invalidator (*this), boost::bind (&PannerUI::update_pan_linkage, this), gui_context());
        _panner->StateChanged.connect (connections, invalidator (*this), boost::bind (&PannerUI::update_pan_state, this), gui_context());
 
-       for (uint32_t i = 0; i < _panner->npanners(); ++i) {
-               connect_to_pan_control (i);
-       }
-
        setup_pan ();
 
        pan_changed (0);
@@ -334,6 +330,11 @@ PannerUI::setup_pan ()
                return;
        }
 
+       _pan_control_connections.drop_connections ();
+       for (uint32_t i = 0; i < _panner->npanners(); ++i) {
+               connect_to_pan_control (i);
+       }
+
        _current_nouts = nouts;
        _current_npans = npans;
 
@@ -646,7 +647,17 @@ PannerUI::pan_value_changed (uint32_t which)
 {
        ENSURE_GUI_THREAD (*this, &PannerUI::pan_value_changed, which)
 
-       if (_panner->npanners() > 0 && which < _panner->npanners()) {
+       if (twod_panner) {
+
+               float x;
+               float y;
+               _panner->streampanner(which).get_position (x, y);
+
+               in_pan_update = true;
+               twod_panner->move_puck (which, x, y);
+               in_pan_update = false;
+
+       } else if (_panner->npanners() > 0 && which < _panner->npanners()) {
                float xpos;
                float val = pan_adjustments[which]->get_value ();
 
@@ -891,5 +902,7 @@ PannerUI::set_mono (bool yn)
 void
 PannerUI::connect_to_pan_control (uint32_t i)
 {
-       _panner->pan_control(i)->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::pan_value_changed, this, i), gui_context ());
+       _panner->pan_control(i)->Changed.connect (
+               _pan_control_connections, invalidator (*this), boost::bind (&PannerUI::pan_value_changed, this, i), gui_context ()
+               );
 }