diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index e99d74e2f0..037123d169 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -496,7 +496,12 @@ RedirectBox::choose_send () /* XXX need redirect lock on route */ - send->ensure_io (0, _route->max_redirect_outs(), false, this); + try { + send->ensure_io (0, _route->max_redirect_outs(), false, this); + } catch (AudioEngine::PortRegistrationFailure& err) { + error << string_compose (_("Cannot set up new send: %1"), err.what()) << endmsg; + return; + } IOSelectorWindow *ios = new IOSelectorWindow (_session, send, false, true); @@ -854,6 +859,13 @@ RedirectBox::idle_delete_redirect (boost::weak_ptr weak_redirect) /* NOT copied to _mixer.selection() */ no_redirect_redisplay = true; + + void* gui = redirect->get_gui (); + + if (gui) { + static_cast(gui)->hide (); + } + _route->remove_redirect (redirect, this); no_redirect_redisplay = false; redisplay_redirects (this); diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc index 8faa315848..bb0923db12 100644 --- a/gtk2_ardour/send_ui.cc +++ b/gtk2_ardour/send_ui.cc @@ -44,7 +44,7 @@ SendUI::SendUI (boost::shared_ptr s, Session& se) vbox.pack_start (hbox, false, false, false); vbox.pack_start (panners, false,false); - io = new IOSelector (se, s, false); + io = manage (new IOSelector (se, s, false)); pack_start (vbox, false, false); @@ -70,7 +70,7 @@ SendUI::SendUI (boost::shared_ptr s, Session& se) SendUI::~SendUI () { _send->set_metering (false); - + /* XXX not clear that we need to do this */ screen_update_connection.disconnect(); @@ -121,8 +121,8 @@ SendUIWindow::SendUIWindow (boost::shared_ptr s, Session& ss) add (vpacker); set_name ("SendUIWindow"); - - s->GoingAway.connect (mem_fun (*this, &SendUIWindow::send_going_away)); + + going_away_connection = s->GoingAway.connect (mem_fun (*this, &SendUIWindow::send_going_away)); signal_delete_event().connect (bind (ptr_fun (just_hide_it), reinterpret_cast (this))); @@ -138,5 +138,6 @@ SendUIWindow::send_going_away () { ENSURE_GUI_THREAD (mem_fun (*this, &SendUIWindow::send_going_away)); delete_when_idle (this); + going_away_connection.disconnect (); } diff --git a/gtk2_ardour/send_ui.h b/gtk2_ardour/send_ui.h index 2d041bb4fe..3d6e9c7fa9 100644 --- a/gtk2_ardour/send_ui.h +++ b/gtk2_ardour/send_ui.h @@ -42,6 +42,8 @@ class SendUI : public Gtk::HBox IOSelector* io; + boost::shared_ptr& send() { return _send; } + private: boost::shared_ptr _send; ARDOUR::Session& _session; @@ -70,6 +72,7 @@ class SendUIWindow : public Gtk::Window Gtk::HBox hpacker; void send_going_away (); + sigc::connection going_away_connection; }; #endif /* __ardour_gtk_send_ui_h__ */ diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 7b645b5d49..f055543fe5 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -1092,19 +1092,18 @@ Route::remove_redirect (boost::shared_ptr redirect, void *src, uint32_ return -1; } - bool foo = false; + _have_internal_generator = false; for (i = _redirects.begin(); i != _redirects.end(); ++i) { boost::shared_ptr pi; if ((pi = boost::dynamic_pointer_cast(*i)) != 0) { if (pi->is_generator()) { - foo = true; + _have_internal_generator = true; + break; } } } - - _have_internal_generator = foo; } if (old_rmo != redirect_max_outs) {