X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flxvst_plugin.cc;h=3939048ad443e7ceca3ccaebb7227b7db66c6e3b;hb=f371ac1beb035716ef2e1def831a61bd4b5020c2;hp=c3074d65adb72e6502aaa55905d528b412de3c0c;hpb=5399425f534e2d96d07cf29f427bfa0f39d904b7;p=ardour.git diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc index c3074d65ad..3939048ad4 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; @@ -62,7 +66,7 @@ LXVSTPlugin::~LXVSTPlugin () vstfx_close (_state); } -PluginPtr +PluginPtr LXVSTPluginInfo::load (Session& session) { try { @@ -94,6 +98,70 @@ 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->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;