X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flxvst_plugin.cc;h=259c5e646153b76679f18351637558b74f588f7b;hb=2b320d51dd080909a0e305116f1396dd1356200b;hp=c3074d65adb72e6502aaa55905d528b412de3c0c;hpb=2e0c98c48903c67fcef7abd77a7c53f3f2d41e2f;p=ardour.git diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc index c3074d65ad..259c5e6461 100644 --- a/libs/ardour/lxvst_plugin.cc +++ b/libs/ardour/lxvst_plugin.cc @@ -17,11 +17,15 @@ */ +#include +#include + +#include "ardour/filesystem_paths.h" #include "ardour/linux_vst_support.h" #include "ardour/session.h" #include "ardour/lxvst_plugin.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -36,9 +40,10 @@ LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int un if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) { throw failed_constructor(); } + open_plugin (); Session::vst_current_loading_id = 0; - set_plugin (_state->plugin); + init_plugin (); } LXVSTPlugin::LXVSTPlugin (const LXVSTPlugin &other) @@ -50,11 +55,16 @@ LXVSTPlugin::LXVSTPlugin (const LXVSTPlugin &other) if ((_state = vstfx_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; - // Plugin::setup_controls (); + init_plugin (); } LXVSTPlugin::~LXVSTPlugin () @@ -62,7 +72,7 @@ LXVSTPlugin::~LXVSTPlugin () vstfx_close (_state); } -PluginPtr +PluginPtr LXVSTPluginInfo::load (Session& session) { try { @@ -94,6 +104,71 @@ LXVSTPluginInfo::load (Session& session) } } +std::vector +LXVSTPluginInfo::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, instantiating the plugin can be heavy + /* Built-in presets */ + VSTHandle* handle = vstfx_load(path.c_str()); + Session::vst_current_loading_id = atoi (unique_id); + AEffect* plugin = handle->main_entry (Session::vst_callback); + Session::vst_current_loading_id = 0; + plugin->user = NULL; + + plugin->dispatcher (plugin, effOpen, 0, 0, 0, 0); // :( + int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, NULL, 0); + + for (int i = 0; i < plugin->numPrograms; ++i) { + Plugin::PresetRecord r (string_compose (X_("VST:%1:%2"), unique_id, i), "", false); + if (vst_version >= 2) { + char buf[256]; + if (plugin->dispatcher (plugin, 29, i, 0, buf, 0) == 1) { + r.label = buf; + } else { + r.label = string_compose (_("Preset %1"), i); + } + } else { + r.label = string_compose (_("Preset %1"), i); + } + p.push_back (r); + } + + plugin->dispatcher (plugin, effMainsChanged, 0, 0, 0, 0); + plugin->dispatcher (plugin, effClose, 0, 0, 0, 0); // :( + + if (handle->plugincnt) { + handle->plugincnt--; + } + vstfx_unload (handle); + } + + /* 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 ()) { // TODO read names only. skip parsing the actual data + 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; +} + LXVSTPluginInfo::LXVSTPluginInfo() { type = ARDOUR::LXVST;