diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index 3c049ad079..5b2ba2dfdc 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -207,10 +207,17 @@ OSCRouteObserver::refresh_strip (boost::shared_ptr new_strip, } boost::shared_ptr rt = boost::dynamic_pointer_cast (_strip); - boost::shared_ptr pan_sh = rt->panner_shell(); - current_pan_shell = pan_sh; - pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::panner_changed, this, current_pan_shell), OSC::instance()); - panner_changed (pan_sh); + if (rt) { + boost::shared_ptr pan_sh = rt->panner_shell(); + current_pan_shell = pan_sh; + if (pan_sh) { + + pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::panner_changed, this, current_pan_shell), OSC::instance()); + } + panner_changed (pan_sh); + } else { + current_pan_shell = boost::shared_ptr (); + } } _init = false; @@ -260,7 +267,9 @@ OSCRouteObserver::refresh_send (boost::shared_ptr new_send, bool f boost::shared_ptr pan_sh = _send->panner_shell(); current_pan_shell = pan_sh; - pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::panner_changed, this, current_pan_shell), OSC::instance()); + if (pan_sh) { + pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::panner_changed, this, current_pan_shell), OSC::instance()); + } panner_changed (pan_sh); } @@ -445,36 +454,42 @@ OSCRouteObserver::panner_changed (boost::shared_ptr pan_sh) pan_connections.drop_connections (); if (feedback[1]) { - string pt = pan_sh->current_panner_uri(); - if (pt.size()){ - string ptype = pt.substr(pt.find_last_of ('/') + 1); - _osc.text_message_with_id (X_("/strip/pan_type"), ssid, ptype, in_line, addr); + if (pan_sh){ + string pt = pan_sh->current_panner_uri(); + if (pt.size()){ + string ptype = pt.substr(pt.find_last_of ('/') + 1); + _osc.text_message_with_id (X_("/strip/pan_type"), ssid, ptype, in_line, addr); + } else { + _osc.text_message_with_id (X_("/strip/pan_type"), ssid, "none", in_line, addr); + _osc.float_message_with_id (X_("/strip/pan_stereo_position"), ssid, 0.5, in_line, addr); + _osc.float_message_with_id (X_("/strip/pan_stereo_width"), ssid, 1.0, in_line, addr); + return; + } + boost::shared_ptr pan_controllable = boost::dynamic_pointer_cast(pan_sh->panner()->pannable()->pan_azimuth_control); + if (pan_controllable) { + boost::shared_ptrat = boost::dynamic_pointer_cast (pan_controllable); + + pan_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_position"), current_pan_shell->panner()->pannable()->pan_azimuth_control), OSC::instance()); + at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_automation, this, X_("/strip/pan_stereo_position"), current_pan_shell->panner()->pannable()->pan_azimuth_control), OSC::instance()); + send_change_message (X_("/strip/pan_stereo_position"), pan_controllable); + send_automation (X_("/strip/pan_stereo_position"), pan_controllable); + } else { + _osc.float_message_with_id (X_("/strip/pan_stereo_position"), ssid, 0.5, in_line, addr); + } + boost::shared_ptr width_controllable = boost::dynamic_pointer_cast(pan_sh->panner()->pannable()->pan_width_control); + if (width_controllable) { + boost::shared_ptrat = boost::dynamic_pointer_cast (width_controllable); + width_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_width"), current_pan_shell->panner()->pannable()->pan_width_control), OSC::instance()); + at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_automation, this, X_("/strip/pan_stereo_width"), current_pan_shell->panner()->pannable()->pan_width_control), OSC::instance()); + send_change_message (X_("/strip/pan_stereo_width"), width_controllable); + send_automation (X_("/strip/pan_stereo_width"), width_controllable); + } else { + _osc.float_message_with_id (X_("/strip/pan_stereo_width"), ssid, 1.0, in_line, addr); + } } else { _osc.text_message_with_id (X_("/strip/pan_type"), ssid, "none", in_line, addr); _osc.float_message_with_id (X_("/strip/pan_stereo_position"), ssid, 0.5, in_line, addr); _osc.float_message_with_id (X_("/strip/pan_stereo_width"), ssid, 1.0, in_line, addr); - return; - } - boost::shared_ptr pan_controllable = boost::dynamic_pointer_cast(pan_sh->panner()->pannable()->pan_azimuth_control); - if (pan_controllable) { - boost::shared_ptrat = boost::dynamic_pointer_cast (pan_controllable); - - pan_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_position"), current_pan_shell->panner()->pannable()->pan_azimuth_control), OSC::instance()); - at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_automation, this, X_("/strip/pan_stereo_position"), current_pan_shell->panner()->pannable()->pan_azimuth_control), OSC::instance()); - send_change_message (X_("/strip/pan_stereo_position"), pan_controllable); - send_automation (X_("/strip/pan_stereo_position"), pan_controllable); - } else { - _osc.float_message_with_id (X_("/strip/pan_stereo_position"), ssid, 0.5, in_line, addr); - } - boost::shared_ptr width_controllable = boost::dynamic_pointer_cast(pan_sh->panner()->pannable()->pan_width_control); - if (width_controllable) { - boost::shared_ptrat = boost::dynamic_pointer_cast (width_controllable); - width_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_width"), current_pan_shell->panner()->pannable()->pan_width_control), OSC::instance()); - at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_automation, this, X_("/strip/pan_stereo_width"), current_pan_shell->panner()->pannable()->pan_width_control), OSC::instance()); - send_change_message (X_("/strip/pan_stereo_width"), width_controllable); - send_automation (X_("/strip/pan_stereo_width"), width_controllable); - } else { - _osc.float_message_with_id (X_("/strip/pan_stereo_width"), ssid, 1.0, in_line, addr); } } } diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index 3fb067f791..77583f88fc 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -153,6 +153,13 @@ OSCSelectObserver::refresh_strip (boost::shared_ptr new_strip session->RouteGroupPropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::group_sharing, this, _1), OSC::instance()); group_sharing (rt->route_group ()); + + boost::shared_ptr pan_sh = rt->panner_shell(); + if (pan_sh) { + pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::panner_changed, this), OSC::instance()); + } + panner_changed (); + } else { group_sharing (0); } @@ -218,10 +225,6 @@ OSCSelectObserver::refresh_strip (boost::shared_ptr new_strip send_automation (X_("/select/trimdB"), _strip->trim_control()); } - boost::shared_ptr pan_sh = rt->panner_shell(); - pan_sh->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::panner_changed, this), OSC::instance()); - panner_changed (); - // sends, plugins and eq // detecting processor changes is now in osc.cc @@ -669,49 +672,57 @@ OSCSelectObserver::panner_changed () if (feedback[1]) { boost::shared_ptr rt = boost::dynamic_pointer_cast (_strip); + if (!rt) { + return; + } boost::shared_ptr pan_sh = rt->panner_shell(); - string pt = pan_sh->current_panner_uri(); - if (pt.size()){ - string ptype = pt.substr(pt.find_last_of ('/') + 1); - _osc.text_message (X_("/strip/pan_type"), ptype, addr); + if (pan_sh) { + string pt = pan_sh->current_panner_uri(); + if (pt.size()){ + string ptype = pt.substr(pt.find_last_of ('/') + 1); + _osc.text_message (X_("/strip/pan_type"), ptype, addr); + } else { + _osc.text_message (X_("/select/pan_type"), "none", addr); + _osc.float_message (X_("/strip/pan_stereo_position"), 0.5, addr); + _osc.float_message (X_("/strip/pan_stereo_width"), 1.0, addr); + return; + } + boost::shared_ptr pan_controllable = boost::dynamic_pointer_cast(_strip->pan_azimuth_control()); + if (pan_controllable) { + boost::shared_ptrat = boost::dynamic_pointer_cast (pan_controllable); + pan_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance()); + at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_automation, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance()); + change_message (X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()); + send_automation (X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()); + } + + boost::shared_ptr width_controllable = boost::dynamic_pointer_cast(_strip->pan_width_control()); + if (width_controllable) { + boost::shared_ptrat = boost::dynamic_pointer_cast (width_controllable); + width_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance()); + at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_automation, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance()); + change_message (X_("/select/pan_stereo_width"), _strip->pan_width_control()); + send_automation (X_("/select/pan_stereo_width"), _strip->pan_width_control()); + } + + // Rest of possible pan controls... Untested because I can't find a way to get them in the GUI :) + if (_strip->pan_elevation_control ()) { + _strip->pan_elevation_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_elevation_position"), _strip->pan_elevation_control()), OSC::instance()); + change_message (X_("/select/pan_elevation_position"), _strip->pan_elevation_control()); + } + if (_strip->pan_frontback_control ()) { + _strip->pan_frontback_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_frontback_position"), _strip->pan_frontback_control()), OSC::instance()); + change_message (X_("/select/pan_frontback_position"), _strip->pan_frontback_control()); + } + if (_strip->pan_lfe_control ()) { + _strip->pan_lfe_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_lfe_control"), _strip->pan_lfe_control()), OSC::instance()); + change_message (X_("/select/pan_lfe_control"), _strip->pan_lfe_control()); + } } else { _osc.text_message (X_("/select/pan_type"), "none", addr); _osc.float_message (X_("/strip/pan_stereo_position"), 0.5, addr); _osc.float_message (X_("/strip/pan_stereo_width"), 1.0, addr); - return; } - boost::shared_ptr pan_controllable = boost::dynamic_pointer_cast(_strip->pan_azimuth_control()); - if (pan_controllable) { - boost::shared_ptrat = boost::dynamic_pointer_cast (pan_controllable); - pan_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance()); - at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_automation, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance()); - change_message (X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()); - send_automation (X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()); - } - - boost::shared_ptr width_controllable = boost::dynamic_pointer_cast(_strip->pan_width_control()); - if (width_controllable) { - boost::shared_ptrat = boost::dynamic_pointer_cast (width_controllable); - width_controllable->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance()); - at->alist()->automation_state_changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_automation, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance()); - change_message (X_("/select/pan_stereo_width"), _strip->pan_width_control()); - send_automation (X_("/select/pan_stereo_width"), _strip->pan_width_control()); - } - - // Rest of possible pan controls... Untested because I can't find a way to get them in the GUI :) - if (_strip->pan_elevation_control ()) { - _strip->pan_elevation_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_elevation_position"), _strip->pan_elevation_control()), OSC::instance()); - change_message (X_("/select/pan_elevation_position"), _strip->pan_elevation_control()); - } - if (_strip->pan_frontback_control ()) { - _strip->pan_frontback_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_frontback_position"), _strip->pan_frontback_control()), OSC::instance()); - change_message (X_("/select/pan_frontback_position"), _strip->pan_frontback_control()); - } - if (_strip->pan_lfe_control ()) { - _strip->pan_lfe_control()->Changed.connect (pan_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_lfe_control"), _strip->pan_lfe_control()), OSC::instance()); - change_message (X_("/select/pan_lfe_control"), _strip->pan_lfe_control()); - } - } }