X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=libs%2Fardour%2Fwindows_vst_plugin.cc;h=82304a9f9332c5c042cf331ea2a145ee4d2db0d6;hb=379ad3357df6cba267b7005aac572d6821487269;hp=e8afb67c1df6ed616975bde0d74fae40407858be;hpb=fac93f7a82833b094c36164d733bb3c352a7223e;p=ardour.git diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc index e8afb67c1d..82304a9f93 100644 --- a/libs/ardour/windows_vst_plugin.cc +++ b/libs/ardour/windows_vst_plugin.cc @@ -19,25 +19,30 @@ #include "fst.h" +#include +#include + +#include "ardour/filesystem_paths.h" #include "ardour/windows_vst_plugin.h" #include "ardour/session.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; using namespace PBD; -WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h) +WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int unique_id) : VSTPlugin (e, session, h) { - Session::vst_current_loading_id = 0; // TODO + Session::vst_current_loading_id = unique_id; if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + open_plugin (); Session::vst_current_loading_id = 0; - set_plugin (_state->plugin); + init_plugin (); } WindowsVSTPlugin::WindowsVSTPlugin (const WindowsVSTPlugin &other) @@ -49,9 +54,16 @@ WindowsVSTPlugin::WindowsVSTPlugin (const WindowsVSTPlugin &other) if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + open_plugin (); Session::vst_current_loading_id = 0; - - _plugin = _state->plugin; + + XMLNode* root = new XMLNode (other.state_node_name ()); + LocaleGuard lg; + other.add_state (root); + set_state (*root, Stateful::loading_state_version); + delete root; + + init_plugin (); } WindowsVSTPlugin::~WindowsVSTPlugin () @@ -71,10 +83,10 @@ WindowsVSTPluginInfo::load (Session& session) handle = fst_load(path.c_str()); - if ((int) handle == -1) { + if (!handle) { error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg; } else { - plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle)); + plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle, PBD::atoi(unique_id))); } } else { error << _("You asked ardour to not use any VST plugins") << endmsg; @@ -90,6 +102,39 @@ WindowsVSTPluginInfo::load (Session& session) } } +std::vector +WindowsVSTPluginInfo::get_presets (bool user_only) const +{ + std::vector p; +#ifndef NO_PLUGIN_STATE + if (!Config->get_use_lxvst()) { + return p; + } + + if (!user_only) { + // TODO cache and load factory-preset names + } + + /* user presets */ + XMLTree* t = new XMLTree; + std::string pf = Glib::build_filename (ARDOUR::user_config_directory (), "presets", string_compose ("vst-%1", unique_id)); + if (Glib::file_test (pf, Glib::FILE_TEST_EXISTS)) { + t->set_filename (pf); + if (t->read ()) { + XMLNode* root = t->root (); + for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) { + XMLProperty const * uri = (*i)->property (X_("uri")); + XMLProperty const * label = (*i)->property (X_("label")); + p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true)); + } + } + } + delete t; +#endif + + return p; +} + WindowsVSTPluginInfo::WindowsVSTPluginInfo() { type = ARDOUR::Windows_VST;