2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
26 #include <sys/types.h>
35 #ifdef WINDOWS_VST_SUPPORT
36 #include "ardour/vst_info_file.h"
38 #include "pbd/basename.h"
40 #endif // WINDOWS_VST_SUPPORT
43 #include "ardour/vst_info_file.h"
44 #include "ardour/linux_vst_support.h"
45 #include "pbd/basename.h"
47 #endif //LXVST_SUPPORT
49 #include <glib/gstdio.h>
50 #include <glibmm/miscutils.h>
51 #include <glibmm/pattern.h>
53 #include "pbd/whitespace.h"
54 #include "pbd/file_utils.h"
56 #include "ardour/debug.h"
57 #include "ardour/filesystem_paths.h"
58 #include "ardour/ladspa.h"
59 #include "ardour/ladspa_plugin.h"
60 #include "ardour/plugin.h"
61 #include "ardour/plugin_manager.h"
62 #include "ardour/rc_configuration.h"
64 #include "ardour/search_paths.h"
67 #include "ardour/lv2_plugin.h"
70 #ifdef WINDOWS_VST_SUPPORT
71 #include "ardour/windows_vst_plugin.h"
75 #include "ardour/lxvst_plugin.h"
78 #ifdef AUDIOUNIT_SUPPORT
79 #include "ardour/audio_unit.h"
80 #include <Carbon/Carbon.h>
83 #include "pbd/error.h"
84 #include "pbd/stl_delete.h"
88 #include "ardour/debug.h"
90 using namespace ARDOUR;
94 PluginManager* PluginManager::_instance = 0;
95 std::string PluginManager::scanner_bin_path = "";
98 PluginManager::instance()
101 _instance = new PluginManager;
106 PluginManager::PluginManager ()
107 : _windows_vst_plugin_info(0)
108 , _lxvst_plugin_info(0)
109 , _ladspa_plugin_info(0)
110 , _lv2_plugin_info(0)
112 , _cancel_scan(false)
113 , _cancel_timeout(false)
118 string scan_p = Glib::build_filename(ARDOUR::ardour_dll_directory(), "fst");
119 if (!PBD::find_file ( PBD::Searchpath(scan_p), "ardour-vst-scanner", scanner_bin_path)) {
120 PBD::warning << "VST scanner app (ardour-vst-scanner) not found in path " << scan_p << endmsg;
125 if ((s = getenv ("LADSPA_RDF_PATH"))){
129 if (lrdf_path.length() == 0) {
130 lrdf_path = "/usr/local/share/ladspa/rdf:/usr/share/ladspa/rdf";
133 add_lrdf_data(lrdf_path);
134 add_ladspa_presets();
135 #ifdef WINDOWS_VST_SUPPORT
136 if (Config->get_use_windows_vst ()) {
137 add_windows_vst_presets ();
139 #endif /* WINDOWS_VST_SUPPORT */
142 if (Config->get_use_lxvst()) {
145 #endif /* Native LinuxVST support*/
147 if ((s = getenv ("VST_PATH"))) {
148 windows_vst_path = s;
149 } else if ((s = getenv ("VST_PLUGINS"))) {
150 windows_vst_path = s;
153 if (windows_vst_path.length() == 0) {
154 windows_vst_path = vst_search_path ();
157 if ((s = getenv ("LXVST_PATH"))) {
159 } else if ((s = getenv ("LXVST_PLUGINS"))) {
163 if (lxvst_path.length() == 0) {
164 lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:"
165 "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:"
166 "/usr/lib/vst:/usr/local/lib/vst";
169 /* first time setup, use 'default' path */
170 if (Config->get_plugin_path_lxvst() == X_("@default@")) {
171 Config->set_plugin_path_lxvst(get_default_lxvst_path());
173 if (Config->get_plugin_path_vst() == X_("@default@")) {
174 Config->set_plugin_path_vst(get_default_windows_vst_path());
177 if (_instance == 0) {
181 BootMessage (_("Discovering Plugins"));
185 PluginManager::~PluginManager()
187 if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
188 // don't bother, just exit quickly.
189 delete _windows_vst_plugin_info;
190 delete _lxvst_plugin_info;
191 delete _ladspa_plugin_info;
192 delete _lv2_plugin_info;
193 delete _au_plugin_info;
198 PluginManager::refresh (bool cache_only)
200 DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n");
201 _cancel_scan = false;
203 BootMessage (_("Scanning LADSPA Plugins"));
206 BootMessage (_("Scanning LV2 Plugins"));
209 #ifdef WINDOWS_VST_SUPPORT
210 if (Config->get_use_windows_vst()) {
211 BootMessage (_("Scanning Windows VST Plugins"));
212 windows_vst_refresh (cache_only);
214 #endif // WINDOWS_VST_SUPPORT
217 if(Config->get_use_lxvst()) {
218 BootMessage (_("Scanning Linux VST Plugins"));
219 lxvst_refresh(cache_only);
221 #endif //Native linuxVST SUPPORT
223 #ifdef AUDIOUNIT_SUPPORT
224 BootMessage (_("Scanning AU Plugins"));
228 BootMessage (_("Plugin Scan Complete..."));
229 PluginListChanged (); /* EMIT SIGNAL */
230 PluginScanMessage(X_("closeme"), "", false);
231 _cancel_scan = false;
235 PluginManager::cancel_plugin_scan ()
241 PluginManager::cancel_plugin_timeout ()
243 _cancel_timeout = true;
247 PluginManager::clear_vst_cache ()
249 // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
250 #ifdef WINDOWS_VST_SUPPORT
252 vector<string> fsi_files;
253 find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$");
254 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
255 ::g_unlink(i->c_str());
262 vector<string> fsi_files;
263 find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$");
264 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
265 ::g_unlink(i->c_str());
270 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
272 string personal = get_personal_vst_info_cache_dir();
273 vector<string> fsi_files;
274 find_files_matching_regex (fsi_files, personal, "\\.fsi$");
275 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
276 ::g_unlink(i->c_str());
283 PluginManager::clear_vst_blacklist ()
285 #ifdef WINDOWS_VST_SUPPORT
287 vector<string> fsi_files;
288 find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$");
289 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
290 ::g_unlink(i->c_str());
297 vector<string> fsi_files;
298 find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$");
299 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
300 ::g_unlink(i->c_str());
305 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
307 string personal = get_personal_vst_blacklist_dir();
309 vector<string> fsi_files;
310 find_files_matching_regex (fsi_files, personal, "\\.fsb$");
311 for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
312 ::g_unlink(i->c_str());
319 PluginManager::ladspa_refresh ()
321 if (_ladspa_plugin_info) {
322 _ladspa_plugin_info->clear ();
324 _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
327 /* allow LADSPA_PATH to augment, not override standard locations */
329 /* Only add standard locations to ladspa_path if it doesn't
330 * already contain them. Check for trailing G_DIR_SEPARATOR too.
333 vector<string> ladspa_modules;
335 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string()));
337 find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.so");
338 find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dylib");
339 find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dll");
341 for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) {
342 ARDOUR::PluginScanMessage(_("LADSPA"), *i, false);
343 ladspa_discover (*i);
347 static bool rdf_filter (const string &str, void* /*arg*/)
349 return str[0] != '.' &&
350 ((str.find(".rdf") == (str.length() - 4)) ||
351 (str.find(".rdfs") == (str.length() - 5)) ||
352 (str.find(".n3") == (str.length() - 3)) ||
353 (str.find(".ttl") == (str.length() - 4)));
357 PluginManager::add_ladspa_presets()
359 add_presets ("ladspa");
363 PluginManager::add_windows_vst_presets()
365 add_presets ("windows-vst");
369 PluginManager::add_lxvst_presets()
371 add_presets ("lxvst");
375 PluginManager::add_presets(string domain)
378 vector<string> presets;
379 vector<string>::iterator x;
382 if ((envvar = getenv ("HOME")) == 0) {
386 string path = string_compose("%1/.%2/rdf", envvar, domain);
387 find_files_matching_filter (presets, path, rdf_filter, 0, false, true);
389 for (x = presets.begin(); x != presets.end (); ++x) {
390 string file = "file:" + *x;
391 if (lrdf_read_file(file.c_str())) {
392 warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
400 PluginManager::add_lrdf_data (const string &path)
403 vector<string> rdf_files;
404 vector<string>::iterator x;
406 find_files_matching_filter (rdf_files, path, rdf_filter, 0, false, true);
408 for (x = rdf_files.begin(); x != rdf_files.end (); ++x) {
409 const string uri(string("file://") + *x);
411 if (lrdf_read_file(uri.c_str())) {
412 warning << "Could not parse rdf file: " << uri << endmsg;
419 PluginManager::ladspa_discover (string path)
421 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path));
423 Glib::Module module(path);
424 const LADSPA_Descriptor *descriptor;
425 LADSPA_Descriptor_Function dfunc;
429 error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"),
430 path, Glib::Module::get_last_error()) << endmsg;
435 if (!module.get_symbol("ladspa_descriptor", func)) {
436 error << string_compose(_("LADSPA: module \"%1\" has no descriptor function."), path) << endmsg;
437 error << Glib::Module::get_last_error() << endmsg;
441 dfunc = (LADSPA_Descriptor_Function)func;
443 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
445 for (uint32_t i = 0; ; ++i) {
446 if ((descriptor = dfunc (i)) == 0) {
450 if (!ladspa_plugin_whitelist.empty()) {
451 if (find (ladspa_plugin_whitelist.begin(), ladspa_plugin_whitelist.end(), descriptor->UniqueID) == ladspa_plugin_whitelist.end()) {
456 PluginInfoPtr info(new LadspaPluginInfo);
457 info->name = descriptor->Name;
458 info->category = get_ladspa_category(descriptor->UniqueID);
459 info->creator = descriptor->Maker;
462 info->n_inputs = ChanCount();
463 info->n_outputs = ChanCount();
464 info->type = ARDOUR::LADSPA;
467 snprintf (buf, sizeof (buf), "%lu", descriptor->UniqueID);
468 info->unique_id = buf;
470 for (uint32_t n=0; n < descriptor->PortCount; ++n) {
471 if ( LADSPA_IS_PORT_AUDIO (descriptor->PortDescriptors[n]) ) {
472 if ( LADSPA_IS_PORT_INPUT (descriptor->PortDescriptors[n]) ) {
473 info->n_inputs.set_audio(info->n_inputs.n_audio() + 1);
475 else if ( LADSPA_IS_PORT_OUTPUT (descriptor->PortDescriptors[n]) ) {
476 info->n_outputs.set_audio(info->n_outputs.n_audio() + 1);
481 if(_ladspa_plugin_info->empty()){
482 _ladspa_plugin_info->push_back (info);
485 //Ensure that the plugin is not already in the plugin list.
489 for (PluginInfoList::const_iterator i = _ladspa_plugin_info->begin(); i != _ladspa_plugin_info->end(); ++i) {
490 if(0 == info->unique_id.compare((*i)->unique_id)){
496 _ladspa_plugin_info->push_back (info);
499 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs));
502 // GDB WILL NOT LIKE YOU IF YOU DO THIS
509 PluginManager::get_ladspa_category (uint32_t plugin_id)
513 lrdf_statement pattern;
515 snprintf(buf, sizeof(buf), "%s%" PRIu32, LADSPA_BASE, plugin_id);
516 pattern.subject = buf;
517 pattern.predicate = const_cast<char*>(RDF_TYPE);
519 pattern.object_type = lrdf_uri;
521 lrdf_statement* matches1 = lrdf_matches (&pattern);
527 pattern.subject = matches1->object;
528 pattern.predicate = const_cast<char*>(LADSPA_BASE "hasLabel");
530 pattern.object_type = lrdf_literal;
532 lrdf_statement* matches2 = lrdf_matches (&pattern);
533 lrdf_free_statements(matches1);
539 string label = matches2->object;
540 lrdf_free_statements(matches2);
542 /* Kludge LADSPA class names to be singular and match LV2 class names.
543 This avoids duplicate plugin menus for every class, which is necessary
544 to make the plugin category menu at all usable, but is obviously a
547 In the short term, lrdf could be updated so the labels match and a new
548 release made. To support both specs, we should probably be mapping the
549 URIs to the same category in code and perhaps tweaking that hierarchy
550 dynamically to suit the user. Personally, I (drobilla) think that time
551 is better spent replacing the little-used LRDF.
553 In the longer term, we will abandon LRDF entirely in favour of LV2 and
554 use that class hierarchy. Aside from fixing this problem properly, that
555 will also allow for translated labels. SWH plugins have been LV2 for
556 ages; TAP needs porting. I don't know of anything else with LRDF data.
558 if (label == "Utilities") {
560 } else if (label == "Pitch shifters") {
561 return "Pitch Shifter";
562 } else if (label != "Dynamics" && label != "Chorus"
563 &&label[label.length() - 1] == 's'
564 && label[label.length() - 2] != 's') {
565 return label.substr(0, label.length() - 1);
576 PluginManager::lv2_refresh ()
578 DEBUG_TRACE (DEBUG::PluginManager, "LV2: refresh\n");
579 delete _lv2_plugin_info;
580 _lv2_plugin_info = LV2PluginInfo::discover();
584 #ifdef AUDIOUNIT_SUPPORT
586 PluginManager::au_refresh ()
588 DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n");
589 delete _au_plugin_info;
590 _au_plugin_info = AUPluginInfo::discover();
595 #ifdef WINDOWS_VST_SUPPORT
598 PluginManager::windows_vst_refresh (bool cache_only)
600 if (_windows_vst_plugin_info) {
601 _windows_vst_plugin_info->clear ();
603 _windows_vst_plugin_info = new ARDOUR::PluginInfoList();
606 windows_vst_discover_from_path (Config->get_plugin_path_vst(), cache_only);
609 static bool windows_vst_filter (const string& str, void * /*arg*/)
611 /* Not a dotfile, has a prefix before a period, suffix is "dll" */
613 return str[0] != '.' && (str.length() > 4 && str.find (".dll") == (str.length() - 4));
617 PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
619 vector<string> plugin_objects;
620 vector<string>::iterator x;
623 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
625 find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true);
627 for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
628 ARDOUR::PluginScanMessage(_("VST"), *x, !cache_only && !cancelled());
629 windows_vst_discover (*x, cache_only || cancelled());
636 PluginManager::windows_vst_discover (string path, bool cache_only)
638 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
640 _cancel_timeout = false;
641 vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()),
642 cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
644 if (finfos->empty()) {
645 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path));
649 uint32_t discovered = 0;
650 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
654 if (!finfo->canProcessReplacing) {
655 warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
656 finfo->name, PROGRAM_NAME)
661 PluginInfoPtr info (new WindowsVSTPluginInfo);
663 /* what a joke freeware VST is */
665 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
666 info->name = PBD::basename_nosuffix (path);
668 info->name = finfo->name;
672 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
673 info->unique_id = buf;
674 info->category = "VST";
676 info->creator = finfo->creator;
678 info->n_inputs.set_audio (finfo->numInputs);
679 info->n_outputs.set_audio (finfo->numOutputs);
680 info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
681 info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
682 info->type = ARDOUR::Windows_VST;
684 // TODO: check dup-IDs (lxvst AND windows vst)
685 bool duplicate = false;
687 if (!_windows_vst_plugin_info->empty()) {
688 for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) {
689 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
690 warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n";
698 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id));
699 _windows_vst_plugin_info->push_back (info);
704 vstfx_free_info_list (finfos);
705 return discovered > 0 ? 0 : -1;
708 #endif // WINDOWS_VST_SUPPORT
713 PluginManager::lxvst_refresh (bool cache_only)
715 if (_lxvst_plugin_info) {
716 _lxvst_plugin_info->clear ();
718 _lxvst_plugin_info = new ARDOUR::PluginInfoList();
721 lxvst_discover_from_path (Config->get_plugin_path_lxvst(), cache_only);
724 static bool lxvst_filter (const string& str, void *)
726 /* Not a dotfile, has a prefix before a period, suffix is "so" */
728 return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3));
732 PluginManager::lxvst_discover_from_path (string path, bool cache_only)
734 vector<string> plugin_objects;
735 vector<string>::iterator x;
742 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
744 find_files_matching_filter (plugin_objects, Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true);
746 for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
747 ARDOUR::PluginScanMessage(_("LXVST"), *x, !cache_only && !cancelled());
748 lxvst_discover (*x, cache_only || cancelled());
755 PluginManager::lxvst_discover (string path, bool cache_only)
757 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("checking apparent LXVST plugin at %1\n", path));
759 _cancel_timeout = false;
760 vector<VSTInfo*> * finfos = vstfx_get_info_lx (const_cast<char *> (path.c_str()),
761 cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
763 if (finfos->empty()) {
764 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Linux VST information from '%1'\n", path));
768 uint32_t discovered = 0;
769 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
773 if (!finfo->canProcessReplacing) {
774 warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
775 finfo->name, PROGRAM_NAME)
780 PluginInfoPtr info(new LXVSTPluginInfo);
782 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
783 info->name = PBD::basename_nosuffix (path);
785 info->name = finfo->name;
789 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
790 info->unique_id = buf;
791 info->category = "linuxVSTs";
793 info->creator = finfo->creator;
795 info->n_inputs.set_audio (finfo->numInputs);
796 info->n_outputs.set_audio (finfo->numOutputs);
797 info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
798 info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
799 info->type = ARDOUR::LXVST;
801 /* Make sure we don't find the same plugin in more than one place along
802 the LXVST_PATH We can't use a simple 'find' because the path is included
803 in the PluginInfo, and that is the one thing we can be sure MUST be
804 different if a duplicate instance is found. So we just compare the type
805 and unique ID (which for some VSTs isn't actually unique...)
808 // TODO: check dup-IDs with windowsVST, too
809 bool duplicate = false;
810 if (!_lxvst_plugin_info->empty()) {
811 for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) {
812 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
813 warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n";
821 _lxvst_plugin_info->push_back (info);
826 vstfx_free_info_list (finfos);
827 return discovered > 0 ? 0 : -1;
830 #endif // LXVST_SUPPORT
833 PluginManager::PluginStatusType
834 PluginManager::get_status (const PluginInfoPtr& pi)
836 PluginStatus ps (pi->type, pi->unique_id);
837 PluginStatusList::const_iterator i = find (statuses.begin(), statuses.end(), ps);
838 if (i == statuses.end() ) {
846 PluginManager::save_statuses ()
849 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
851 ofs.open (path.c_str(), ios_base::openmode (ios::out|ios::trunc));
857 for (PluginStatusList::iterator i = statuses.begin(); i != statuses.end(); ++i) {
869 ofs << "Windows-VST";
878 switch ((*i).status) {
891 ofs << (*i).unique_id;;
899 PluginManager::load_statuses ()
901 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
902 ifstream ifs (path.c_str());
912 PluginStatusType status;
929 /* rest of the line is the plugin ID */
931 ifs.getline (buf, sizeof (buf), '\n');
936 if (sstatus == "Normal") {
938 } else if (sstatus == "Favorite") {
940 } else if (sstatus == "Hidden") {
943 error << string_compose (_("unknown plugin status type \"%1\" - all entries ignored"), sstatus)
949 if (stype == "LADSPA") {
951 } else if (stype == "AudioUnit") {
953 } else if (stype == "LV2") {
955 } else if (stype == "Windows-VST") {
957 } else if (stype == "LXVST") {
960 error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype)
966 strip_whitespace_edges (id);
967 set_status (type, id, status);
974 PluginManager::set_status (PluginType t, string id, PluginStatusType status)
976 PluginStatus ps (t, id, status);
979 if (status == Normal) {
983 statuses.insert (ps);
986 ARDOUR::PluginInfoList&
987 PluginManager::windows_vst_plugin_info ()
989 #ifdef WINDOWS_VST_SUPPORT
990 if (!_windows_vst_plugin_info) {
991 windows_vst_refresh ();
993 return *_windows_vst_plugin_info;
995 return _empty_plugin_info;
999 ARDOUR::PluginInfoList&
1000 PluginManager::lxvst_plugin_info ()
1002 #ifdef LXVST_SUPPORT
1003 assert(_lxvst_plugin_info);
1004 return *_lxvst_plugin_info;
1006 return _empty_plugin_info;
1010 ARDOUR::PluginInfoList&
1011 PluginManager::ladspa_plugin_info ()
1013 assert(_ladspa_plugin_info);
1014 return *_ladspa_plugin_info;
1017 ARDOUR::PluginInfoList&
1018 PluginManager::lv2_plugin_info ()
1021 assert(_lv2_plugin_info);
1022 return *_lv2_plugin_info;
1024 return _empty_plugin_info;
1028 ARDOUR::PluginInfoList&
1029 PluginManager::au_plugin_info ()
1031 #ifdef AUDIOUNIT_SUPPORT
1032 assert(_au_plugin_info);
1033 return *_au_plugin_info;
1035 return _empty_plugin_info;