diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index b17d9c6079..09b3a32408 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -327,18 +327,14 @@ PluginSelector::au_refiller (const std::string& filterstr) #endif } -void -PluginSelector::use_plugin (PluginInfoPtr pi) +PluginPtr +PluginSelector::load_plugin (PluginInfoPtr pi) { if (session == 0) { - return; + return PluginPtr(); } - PluginPtr plugin = pi->load (*session); - - if (plugin) { - PluginCreated (plugin); - } + return pi->load (*session); } void @@ -404,6 +400,7 @@ PluginSelector::run () { ResponseType r; TreeModel::Children::iterator i; + SelectedPlugins plugins; r = (ResponseType) Dialog::run (); @@ -411,24 +408,26 @@ PluginSelector::run () case RESPONSE_APPLY: for (i = amodel->children().begin(); i != amodel->children().end(); ++i) { PluginInfoPtr pp = (*i)[acols.plugin]; - use_plugin (pp); + PluginPtr p = load_plugin (pp); + if (p) { + plugins.push_back (p); + } } + if (interested_object && !plugins.empty()) { + interested_object->use_plugins (plugins); + } + break; default: break; } - cleanup (); - - return (int) r; -} - -void -PluginSelector::cleanup () -{ hide(); amodel->clear(); + interested_object = 0; + + return (int) r; } void @@ -551,7 +550,15 @@ PluginSelector::plugin_menu() void PluginSelector::plugin_chosen_from_menu (const PluginInfoPtr& pi) { - use_plugin (pi); + PluginPtr p = load_plugin (pi); + + if (p && interested_object) { + SelectedPlugins plugins; + plugins.push_back (p); + interested_object->use_plugins (plugins); + } + + interested_object = 0; } void @@ -596,3 +603,9 @@ PluginSelector::show_manager () show_all(); run (); } + +void +PluginSelector::set_interested_object (PluginInterestedObject& obj) +{ + interested_object = &obj; +} diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h index 77d8c462a6..c2f657679f 100644 --- a/gtk2_ardour/plugin_selector.h +++ b/gtk2_ardour/plugin_selector.h @@ -26,6 +26,7 @@ #include #include +#include "plugin_interest.h" namespace ARDOUR { class Session; @@ -36,8 +37,9 @@ class PluginSelector : public ArdourDialog { public: PluginSelector (ARDOUR::PluginManager *); - sigc::signal > PluginCreated; + void set_interested_object (PluginInterestedObject&); + int run (); // XXX should we try not to overload the non-virtual Gtk::Dialog::run() ? void set_session (ARDOUR::Session*); @@ -46,8 +48,10 @@ class PluginSelector : public ArdourDialog Gtk::Menu& plugin_menu (); private: + PluginInterestedObject* interested_object; + ARDOUR::Session* session; - Gtk::ScrolledWindow scroller; // Available plugins + Gtk::ScrolledWindow scroller; // Available plugins Gtk::ScrolledWindow ascroller; // Added plugins Gtk::ComboBoxText filter_mode; @@ -112,8 +116,7 @@ class PluginSelector : public ArdourDialog void added_list_selection_changed(); void display_selection_changed(); void btn_apply_clicked(); - void use_plugin (ARDOUR::PluginInfoPtr); - void cleanup (); + ARDOUR::PluginPtr load_plugin (ARDOUR::PluginInfoPtr); bool show_this_plugin (const ARDOUR::PluginInfoPtr&, const std::string&); void setup_filter_string (std::string&); diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index c2ffaf0e0c..e99d74e2f0 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -147,10 +147,6 @@ RedirectBox::RedirectBox (Placement pcmnt, Session& sess, boost::shared_ptr plugin) +RedirectBox::use_plugins (const SelectedPlugins& plugins) { - if (plugin) { + for (SelectedPlugins::const_iterator p = plugins.begin(); p != plugins.end(); ++p) { + + boost::shared_ptr redirect (new PluginInsert (_session, *p, _placement)); - boost::shared_ptr redirect (new PluginInsert (_session, plugin, _placement)); - uint32_t err_streams; - + if (_route->add_redirect (redirect, this, &err_streams)) { - weird_plugin_dialog (*plugin, err_streams, _route); + weird_plugin_dialog (**p, err_streams, _route); } else { + if (Profile->get_sae()) { redirect->set_active (true, 0); } redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect))); } } - - if (!using_plugin_selector) { - newplug_connection.disconnect(); - } } void @@ -1413,15 +1404,3 @@ RedirectBox::generate_redirect_title (boost::shared_ptr pi) return string_compose(_("%1: %2 (by %3)"), _route->name(), pi->name(), maker); } -void -RedirectBox::plugin_selector_hidden () -{ - newplug_connection.disconnect(); - using_plugin_selector = false; -} - -void -RedirectBox::plugin_selector_shown () -{ - using_plugin_selector = true; -} diff --git a/gtk2_ardour/redirect_box.h b/gtk2_ardour/redirect_box.h index 5c4c566f93..74a0832152 100644 --- a/gtk2_ardour/redirect_box.h +++ b/gtk2_ardour/redirect_box.h @@ -42,6 +42,7 @@ #include +#include "plugin_interest.h" #include "route_ui.h" #include "io_selector.h" #include "enums.h" @@ -62,7 +63,7 @@ namespace ARDOUR { class Session; } -class RedirectBox : public Gtk::HBox +class RedirectBox : public Gtk::HBox, public PluginInterestedObject { public: RedirectBox (ARDOUR::Placement, ARDOUR::Session&, @@ -144,11 +145,7 @@ class RedirectBox : public Gtk::HBox void send_io_finished (IOSelector::Result, boost::weak_ptr, IOSelectorWindow*); void choose_insert (); void choose_plugin (); - void insert_plugin_chosen (boost::shared_ptr); - sigc::connection newplug_connection; - bool using_plugin_selector; - void plugin_selector_hidden (); - void plugin_selector_shown (); + void use_plugins (const SelectedPlugins&); bool no_redirect_redisplay; bool ignore_delete;