OSC Panner feedback crash with no panner

both select and route feedback now test for both
	route and panner (not VCA)
This commit is contained in:
Len Ovens 2020-08-29 17:08:56 -07:00
parent 151ca86fd6
commit 87f7dcc5f6
2 changed files with 98 additions and 72 deletions

View File

@ -207,10 +207,17 @@ OSCRouteObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip,
}
boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (_strip);
boost::shared_ptr<PannerShell> 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<PannerShell> 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<PannerShell> ();
}
}
_init = false;
@ -260,7 +267,9 @@ OSCRouteObserver::refresh_send (boost::shared_ptr<ARDOUR::Send> new_send, bool f
boost::shared_ptr<PannerShell> 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<ARDOUR::PannerShell> 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<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(pan_sh->panner()->pannable()->pan_azimuth_control);
if (pan_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(pan_sh->panner()->pannable()->pan_width_control);
if (width_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(pan_sh->panner()->pannable()->pan_azimuth_control);
if (pan_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(pan_sh->panner()->pannable()->pan_width_control);
if (width_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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);
}
}
}

View File

@ -153,6 +153,13 @@ OSCSelectObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> 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<PannerShell> 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<ARDOUR::Stripable> new_strip
send_automation (X_("/select/trimdB"), _strip->trim_control());
}
boost::shared_ptr<PannerShell> 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<Route> rt = boost::dynamic_pointer_cast<Route> (_strip);
if (!rt) {
return;
}
boost::shared_ptr<PannerShell> 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<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
if (pan_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_width_control());
if (width_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
if (pan_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_width_control());
if (width_controllable) {
boost::shared_ptr<AutomationControl>at = boost::dynamic_pointer_cast<AutomationControl> (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());
}
}
}