From 23eba1cc392aa5b583ddb4229a227557a88ef1cd Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 2 Aug 2013 23:02:13 +0200 Subject: disallow invalid port-removal do not allow port-removal if the port would be re-added immediately after that again because the main-delivery actually needs it. As a side effect this prevents this crash: * create a stereo-track, then remove one output -> unhandled exception "AudioEngine::PortRegistrationFailure&" The problem: - the port is removed from the RCU ports list, but Port::drop() (which calls jack_port_unregister) is only called from the Port's destructor at some later time. (because a reference to the port still exists elsewhere) - the jack-port is not yet removed. - meanwhile Delivery::configure_io comes along and notices that there are more audio-buffers than ports and tries to re-register the port. - but the port still exists in jack, so it fails and throws an exception ...which is not handled. --- gtk2_ardour/port_matrix.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gtk2_ardour/port_matrix.cc') diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 0df5d2214d..60f86ae888 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -733,7 +733,7 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b) int const r = io->remove_port (p, this); if (r == -1) { ArdourDialog d (_("Port removal not allowed")); - Label l (_("This port cannot be removed, as the first plugin in the track or buss cannot accept the new number of inputs.")); + Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs.")); d.get_vbox()->pack_start (l); d.add_button (Stock::OK, RESPONSE_ACCEPT); d.set_modal (true); -- cgit v1.2.3 From 3ca63cc38c4f2de826e12e8c3b4bb24ff29b9b38 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 3 Aug 2013 13:45:27 +0200 Subject: fix gtk "child->parent == NULL" asserts --- gtk2_ardour/lv2_plugin_ui.cc | 27 ++++++++++++++------------- gtk2_ardour/lv2_plugin_ui.h | 2 +- gtk2_ardour/port_matrix.cc | 13 +++++++++++++ 3 files changed, 28 insertions(+), 14 deletions(-) (limited to 'gtk2_ardour/port_matrix.cc') diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 2fe817a6a0..f9b15714f6 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -184,11 +184,19 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr pi, , _pi(pi) , _lv2(lv2p) , _gui_widget(NULL) - , _ardour_buttons_box(NULL) , _values(NULL) , _external_ui_ptr(NULL) , _inst(NULL) { + _ardour_buttons_box.set_spacing (6); + _ardour_buttons_box.set_border_width (6); + _ardour_buttons_box.pack_end (focus_button, false, false); + _ardour_buttons_box.pack_end (bypass_button, false, false, 10); + _ardour_buttons_box.pack_end (delete_button, false, false); + _ardour_buttons_box.pack_end (save_button, false, false); + _ardour_buttons_box.pack_end (add_button, false, false); + _ardour_buttons_box.pack_end (_preset_combo, false, false); + _ardour_buttons_box.pack_end (_preset_modified, false, false); } void @@ -219,18 +227,11 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title) features[features_count - 1] = &_external_ui_feature; features[features_count] = NULL; } else { - _ardour_buttons_box = manage (new Gtk::HBox); - _ardour_buttons_box->set_spacing (6); - _ardour_buttons_box->set_border_width (6); - _ardour_buttons_box->pack_end (focus_button, false, false); - _ardour_buttons_box->pack_end (bypass_button, false, false, 10); - _ardour_buttons_box->pack_end (delete_button, false, false); - _ardour_buttons_box->pack_end (save_button, false, false); - _ardour_buttons_box->pack_end (add_button, false, false); - _ardour_buttons_box->pack_end (_preset_combo, false, false); - _ardour_buttons_box->pack_end (_preset_modified, false, false); - _ardour_buttons_box->show_all(); - pack_start(*_ardour_buttons_box, false, false); + if (_ardour_buttons_box.get_parent()) { + _ardour_buttons_box.get_parent()->remove(_ardour_buttons_box); + } + pack_start(_ardour_buttons_box, false, false); + _ardour_buttons_box.show_all(); _gui_widget = Gtk::manage((container = new Gtk::Alignment())); pack_start(*_gui_widget, true, true); diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h index 9bf8c3d92b..edb90cb154 100644 --- a/gtk2_ardour/lv2_plugin_ui.h +++ b/gtk2_ardour/lv2_plugin_ui.h @@ -73,7 +73,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox sigc::connection _screen_update_connection; Gtk::Widget* _gui_widget; /** a box containing the focus, bypass, delete, save / add preset buttons etc. */ - Gtk::HBox* _ardour_buttons_box; + Gtk::HBox _ardour_buttons_box; float* _values; std::vector _controllables; struct lv2_external_ui_host _external_ui_host; diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 60f86ae888..2872ad6605 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -336,6 +336,13 @@ PortMatrix::select_arrangement () _vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vspacer, true, true); +#define REMOVE_FROM_GTK_PARENT(WGT) if ((WGT).get_parent()) { (WGT).get_parent()->remove(WGT);} + REMOVE_FROM_GTK_PARENT(*_body) + REMOVE_FROM_GTK_PARENT(_vscroll) + REMOVE_FROM_GTK_PARENT(_hscroll) + REMOVE_FROM_GTK_PARENT(_vbox) + REMOVE_FROM_GTK_PARENT(_hbox) + attach (*_body, 2, 3, 1, 2, FILL | EXPAND, FILL | EXPAND); attach (_vscroll, 3, 4, 1, 2, SHRINK); attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK); @@ -355,6 +362,12 @@ PortMatrix::select_arrangement () _vbox.pack_end (_vnotebook, false, false); _vbox.pack_end (_vlabel, false, false); + REMOVE_FROM_GTK_PARENT(*_body) + REMOVE_FROM_GTK_PARENT(_vscroll) + REMOVE_FROM_GTK_PARENT(_hscroll) + REMOVE_FROM_GTK_PARENT(_vbox) + REMOVE_FROM_GTK_PARENT(_hbox) + attach (*_body, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND); attach (_vscroll, 3, 4, 2, 3, SHRINK); attach (_hscroll, 1, 2, 3, 4, FILL | EXPAND, SHRINK); -- cgit v1.2.3