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/pathscanner.h"
54 #include "pbd/whitespace.h"
55 #include "pbd/file_utils.h"
57 #include "ardour/debug.h"
58 #include "ardour/filesystem_paths.h"
59 #include "ardour/ladspa.h"
60 #include "ardour/ladspa_plugin.h"
61 #include "ardour/plugin.h"
62 #include "ardour/plugin_manager.h"
63 #include "ardour/rc_configuration.h"
65 #include "ardour/search_paths.h"
68 #include "ardour/lv2_plugin.h"
71 #ifdef WINDOWS_VST_SUPPORT
72 #include "ardour/windows_vst_plugin.h"
76 #include "ardour/lxvst_plugin.h"
79 #ifdef AUDIOUNIT_SUPPORT
80 #include "ardour/audio_unit.h"
81 #include <Carbon/Carbon.h>
84 #include "pbd/error.h"
85 #include "pbd/stl_delete.h"
89 #include "ardour/debug.h"
91 using namespace ARDOUR;
95 PluginManager* PluginManager::_instance = 0;
96 std::string PluginManager::scanner_bin_path = "";
99 PluginManager::instance()
102 _instance = new PluginManager;
107 PluginManager::PluginManager ()
108 : _windows_vst_plugin_info(0)
109 , _lxvst_plugin_info(0)
110 , _ladspa_plugin_info(0)
111 , _lv2_plugin_info(0)
113 , _cancel_scan(false)
114 , _cancel_timeout(false)
119 string scan_p = Glib::build_filename(ARDOUR::ardour_dll_directory(), "fst");
120 if (!PBD::find_file_in_search_path ( PBD::Searchpath(scan_p), "ardour-vst-scanner", scanner_bin_path)) {
121 PBD::warning << "VST scanner app (ardour-vst-scanner) not found in path " << scan_p << endmsg;
126 if ((s = getenv ("LADSPA_RDF_PATH"))){
130 if (lrdf_path.length() == 0) {
131 lrdf_path = "/usr/local/share/ladspa/rdf:/usr/share/ladspa/rdf";
134 add_lrdf_data(lrdf_path);
135 add_ladspa_presets();
136 #ifdef WINDOWS_VST_SUPPORT
137 if (Config->get_use_windows_vst ()) {
138 add_windows_vst_presets ();
140 #endif /* WINDOWS_VST_SUPPORT */
143 if (Config->get_use_lxvst()) {
146 #endif /* Native LinuxVST support*/
148 if ((s = getenv ("VST_PATH"))) {
149 windows_vst_path = s;
150 } else if ((s = getenv ("VST_PLUGINS"))) {
151 windows_vst_path = s;
154 if (windows_vst_path.length() == 0) {
155 windows_vst_path = vst_search_path ();
158 if ((s = getenv ("LXVST_PATH"))) {
160 } else if ((s = getenv ("LXVST_PLUGINS"))) {
164 if (lxvst_path.length() == 0) {
165 lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:"
166 "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:"
167 "/usr/lib/vst:/usr/local/lib/vst";
170 /* first time setup, use 'default' path */
171 if (Config->get_plugin_path_lxvst() == X_("@default@")) {
172 Config->set_plugin_path_lxvst(get_default_lxvst_path());
174 if (Config->get_plugin_path_vst() == X_("@default@")) {
175 Config->set_plugin_path_vst(get_default_windows_vst_path());
178 if (_instance == 0) {
182 BootMessage (_("Discovering Plugins"));
186 PluginManager::~PluginManager()
191 PluginManager::refresh (bool cache_only)
193 DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n");
194 _cancel_scan = false;
196 BootMessage (_("Scanning LADSPA Plugins"));
199 BootMessage (_("Scanning LV2 Plugins"));
202 #ifdef WINDOWS_VST_SUPPORT
203 if (Config->get_use_windows_vst()) {
204 BootMessage (_("Scanning Windows VST Plugins"));
205 windows_vst_refresh (cache_only);
207 #endif // WINDOWS_VST_SUPPORT
210 if(Config->get_use_lxvst()) {
211 BootMessage (_("Scanning Linux VST Plugins"));
212 lxvst_refresh(cache_only);
214 #endif //Native linuxVST SUPPORT
216 #ifdef AUDIOUNIT_SUPPORT
217 BootMessage (_("Scanning AU Plugins"));
221 BootMessage (_("Plugin Scan Complete..."));
222 PluginListChanged (); /* EMIT SIGNAL */
223 PluginScanMessage(X_("closeme"), "", false);
224 _cancel_scan = false;
228 PluginManager::cancel_plugin_scan ()
234 PluginManager::cancel_plugin_timeout ()
236 _cancel_timeout = true;
240 PluginManager::clear_vst_cache ()
242 // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
243 #ifdef WINDOWS_VST_SUPPORT
246 vector<string *> *fsi_files;
248 fsi_files = scanner (Config->get_plugin_path_vst(), "\\.fsi$", true, true, -1, false);
250 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
251 ::g_unlink((*i)->c_str());
254 vector_delete(fsi_files);
261 vector<string *> *fsi_files;
262 fsi_files = scanner (Config->get_plugin_path_lxvst(), "\\.fsi$", true, true, -1, false);
264 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
265 ::g_unlink((*i)->c_str());
268 vector_delete(fsi_files);
272 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
274 string personal = get_personal_vst_info_cache_dir();
276 vector<string *> *fsi_files;
277 fsi_files = scanner (personal, "\\.fsi$", true, true, -1, false);
279 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
280 ::g_unlink((*i)->c_str());
283 vector_delete(fsi_files);
289 PluginManager::clear_vst_blacklist ()
291 #ifdef WINDOWS_VST_SUPPORT
294 vector<string *> *fsi_files;
296 fsi_files = scanner (Config->get_plugin_path_vst(), "\\.fsb$", true, true, -1, false);
298 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
299 ::g_unlink((*i)->c_str());
302 vector_delete(fsi_files);
309 vector<string *> *fsi_files;
310 fsi_files = scanner (Config->get_plugin_path_lxvst(), "\\.fsb$", true, true, -1, false);
312 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
313 ::g_unlink((*i)->c_str());
316 vector_delete(fsi_files);
320 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
322 string personal = get_personal_vst_blacklist_dir();
325 vector<string *> *fsi_files;
326 fsi_files = scanner (personal, "\\.fsb$", true, true, -1, false);
328 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
329 ::g_unlink((*i)->c_str());
332 vector_delete(fsi_files);
338 PluginManager::ladspa_refresh ()
340 if (_ladspa_plugin_info) {
341 _ladspa_plugin_info->clear ();
343 _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
346 /* allow LADSPA_PATH to augment, not override standard locations */
348 /* Only add standard locations to ladspa_path if it doesn't
349 * already contain them. Check for trailing G_DIR_SEPARATOR too.
352 vector<string> ladspa_modules;
354 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string()));
356 Glib::PatternSpec so_extension_pattern("*.so");
357 Glib::PatternSpec dylib_extension_pattern("*.dylib");
358 Glib::PatternSpec dll_extension_pattern("*.dll");
360 find_matching_files_in_search_path (ladspa_search_path (),
361 so_extension_pattern, ladspa_modules);
363 find_matching_files_in_search_path (ladspa_search_path (),
364 dylib_extension_pattern, ladspa_modules);
366 find_matching_files_in_search_path (ladspa_search_path (),
367 dll_extension_pattern, ladspa_modules);
369 for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) {
370 ARDOUR::PluginScanMessage(_("LADSPA"), *i, false);
371 ladspa_discover (*i);
375 static bool rdf_filter (const string &str, void* /*arg*/)
377 return str[0] != '.' &&
378 ((str.find(".rdf") == (str.length() - 4)) ||
379 (str.find(".rdfs") == (str.length() - 5)) ||
380 (str.find(".n3") == (str.length() - 3)) ||
381 (str.find(".ttl") == (str.length() - 4)));
385 PluginManager::add_ladspa_presets()
387 add_presets ("ladspa");
391 PluginManager::add_windows_vst_presets()
393 add_presets ("windows-vst");
397 PluginManager::add_lxvst_presets()
399 add_presets ("lxvst");
403 PluginManager::add_presets(string domain)
407 vector<string *> *presets;
408 vector<string *>::iterator x;
411 if ((envvar = getenv ("HOME")) == 0) {
415 string path = string_compose("%1/.%2/rdf", envvar, domain);
416 presets = scanner (path, rdf_filter, 0, false, true);
419 for (x = presets->begin(); x != presets->end (); ++x) {
420 string file = "file:" + **x;
421 if (lrdf_read_file(file.c_str())) {
422 warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
426 vector_delete (presets);
432 PluginManager::add_lrdf_data (const string &path)
436 vector<string *>* rdf_files;
437 vector<string *>::iterator x;
439 rdf_files = scanner (path, rdf_filter, 0, false, true);
442 for (x = rdf_files->begin(); x != rdf_files->end (); ++x) {
443 const string uri(string("file://") + **x);
445 if (lrdf_read_file(uri.c_str())) {
446 warning << "Could not parse rdf file: " << uri << endmsg;
450 vector_delete (rdf_files);
456 PluginManager::ladspa_discover (string path)
458 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path));
460 Glib::Module module(path);
461 const LADSPA_Descriptor *descriptor;
462 LADSPA_Descriptor_Function dfunc;
466 error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"),
467 path, Glib::Module::get_last_error()) << endmsg;
472 if (!module.get_symbol("ladspa_descriptor", func)) {
473 error << string_compose(_("LADSPA: module \"%1\" has no descriptor function."), path) << endmsg;
474 error << Glib::Module::get_last_error() << endmsg;
478 dfunc = (LADSPA_Descriptor_Function)func;
480 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
482 for (uint32_t i = 0; ; ++i) {
483 if ((descriptor = dfunc (i)) == 0) {
487 if (!ladspa_plugin_whitelist.empty()) {
488 if (find (ladspa_plugin_whitelist.begin(), ladspa_plugin_whitelist.end(), descriptor->UniqueID) == ladspa_plugin_whitelist.end()) {
493 PluginInfoPtr info(new LadspaPluginInfo);
494 info->name = descriptor->Name;
495 info->category = get_ladspa_category(descriptor->UniqueID);
496 info->creator = descriptor->Maker;
499 info->n_inputs = ChanCount();
500 info->n_outputs = ChanCount();
501 info->type = ARDOUR::LADSPA;
504 snprintf (buf, sizeof (buf), "%lu", descriptor->UniqueID);
505 info->unique_id = buf;
507 for (uint32_t n=0; n < descriptor->PortCount; ++n) {
508 if ( LADSPA_IS_PORT_AUDIO (descriptor->PortDescriptors[n]) ) {
509 if ( LADSPA_IS_PORT_INPUT (descriptor->PortDescriptors[n]) ) {
510 info->n_inputs.set_audio(info->n_inputs.n_audio() + 1);
512 else if ( LADSPA_IS_PORT_OUTPUT (descriptor->PortDescriptors[n]) ) {
513 info->n_outputs.set_audio(info->n_outputs.n_audio() + 1);
518 if(_ladspa_plugin_info->empty()){
519 _ladspa_plugin_info->push_back (info);
522 //Ensure that the plugin is not already in the plugin list.
526 for (PluginInfoList::const_iterator i = _ladspa_plugin_info->begin(); i != _ladspa_plugin_info->end(); ++i) {
527 if(0 == info->unique_id.compare((*i)->unique_id)){
533 _ladspa_plugin_info->push_back (info);
536 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs));
539 // GDB WILL NOT LIKE YOU IF YOU DO THIS
546 PluginManager::get_ladspa_category (uint32_t plugin_id)
550 lrdf_statement pattern;
552 snprintf(buf, sizeof(buf), "%s%" PRIu32, LADSPA_BASE, plugin_id);
553 pattern.subject = buf;
554 pattern.predicate = const_cast<char*>(RDF_TYPE);
556 pattern.object_type = lrdf_uri;
558 lrdf_statement* matches1 = lrdf_matches (&pattern);
564 pattern.subject = matches1->object;
565 pattern.predicate = const_cast<char*>(LADSPA_BASE "hasLabel");
567 pattern.object_type = lrdf_literal;
569 lrdf_statement* matches2 = lrdf_matches (&pattern);
570 lrdf_free_statements(matches1);
576 string label = matches2->object;
577 lrdf_free_statements(matches2);
579 /* Kludge LADSPA class names to be singular and match LV2 class names.
580 This avoids duplicate plugin menus for every class, which is necessary
581 to make the plugin category menu at all usable, but is obviously a
584 In the short term, lrdf could be updated so the labels match and a new
585 release made. To support both specs, we should probably be mapping the
586 URIs to the same category in code and perhaps tweaking that hierarchy
587 dynamically to suit the user. Personally, I (drobilla) think that time
588 is better spent replacing the little-used LRDF.
590 In the longer term, we will abandon LRDF entirely in favour of LV2 and
591 use that class hierarchy. Aside from fixing this problem properly, that
592 will also allow for translated labels. SWH plugins have been LV2 for
593 ages; TAP needs porting. I don't know of anything else with LRDF data.
595 if (label == "Utilities") {
597 } else if (label == "Pitch shifters") {
598 return "Pitch Shifter";
599 } else if (label != "Dynamics" && label != "Chorus"
600 &&label[label.length() - 1] == 's'
601 && label[label.length() - 2] != 's') {
602 return label.substr(0, label.length() - 1);
613 PluginManager::lv2_refresh ()
615 DEBUG_TRACE (DEBUG::PluginManager, "LV2: refresh\n");
616 delete _lv2_plugin_info;
617 _lv2_plugin_info = LV2PluginInfo::discover();
621 #ifdef AUDIOUNIT_SUPPORT
623 PluginManager::au_refresh ()
625 DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n");
626 delete _au_plugin_info;
627 _au_plugin_info = AUPluginInfo::discover();
632 #ifdef WINDOWS_VST_SUPPORT
635 PluginManager::windows_vst_refresh (bool cache_only)
637 if (_windows_vst_plugin_info) {
638 _windows_vst_plugin_info->clear ();
640 _windows_vst_plugin_info = new ARDOUR::PluginInfoList();
643 windows_vst_discover_from_path (Config->get_plugin_path_vst(), cache_only);
646 static bool windows_vst_filter (const string& str, void * /*arg*/)
648 /* Not a dotfile, has a prefix before a period, suffix is "dll" */
650 return str[0] != '.' && (str.length() > 4 && str.find (".dll") == (str.length() - 4));
654 PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
657 vector<string *> *plugin_objects;
658 vector<string *>::iterator x;
661 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
663 plugin_objects = scanner (Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true);
665 if (plugin_objects) {
666 for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
667 ARDOUR::PluginScanMessage(_("VST"), **x, !cache_only && !cancelled());
668 windows_vst_discover (**x, cache_only || cancelled());
671 vector_delete (plugin_objects);
678 PluginManager::windows_vst_discover (string path, bool cache_only)
680 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
682 _cancel_timeout = false;
683 vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()),
684 cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
686 if (finfos->empty()) {
687 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path));
691 uint32_t discovered = 0;
692 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
696 if (!finfo->canProcessReplacing) {
697 warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
698 finfo->name, PROGRAM_NAME)
703 PluginInfoPtr info (new WindowsVSTPluginInfo);
705 /* what a joke freeware VST is */
707 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
708 info->name = PBD::basename_nosuffix (path);
710 info->name = finfo->name;
714 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
715 info->unique_id = buf;
716 info->category = "VST";
718 info->creator = finfo->creator;
720 info->n_inputs.set_audio (finfo->numInputs);
721 info->n_outputs.set_audio (finfo->numOutputs);
722 info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
723 info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
724 info->type = ARDOUR::Windows_VST;
726 // TODO: check dup-IDs (lxvst AND windows vst)
727 bool duplicate = false;
729 if (!_windows_vst_plugin_info->empty()) {
730 for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) {
731 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
732 warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n";
740 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id));
741 _windows_vst_plugin_info->push_back (info);
746 vstfx_free_info_list (finfos);
747 return discovered > 0 ? 0 : -1;
750 #endif // WINDOWS_VST_SUPPORT
755 PluginManager::lxvst_refresh (bool cache_only)
757 if (_lxvst_plugin_info) {
758 _lxvst_plugin_info->clear ();
760 _lxvst_plugin_info = new ARDOUR::PluginInfoList();
763 lxvst_discover_from_path (Config->get_plugin_path_lxvst(), cache_only);
766 static bool lxvst_filter (const string& str, void *)
768 /* Not a dotfile, has a prefix before a period, suffix is "so" */
770 return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3));
774 PluginManager::lxvst_discover_from_path (string path, bool cache_only)
777 vector<string *> *plugin_objects;
778 vector<string *>::iterator x;
785 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
787 plugin_objects = scanner (Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true);
789 if (plugin_objects) {
790 for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
791 ARDOUR::PluginScanMessage(_("LXVST"), **x, !cache_only && !cancelled());
792 lxvst_discover (**x, cache_only || cancelled());
795 vector_delete (plugin_objects);
802 PluginManager::lxvst_discover (string path, bool cache_only)
804 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("checking apparent LXVST plugin at %1\n", path));
806 _cancel_timeout = false;
807 vector<VSTInfo*> * finfos = vstfx_get_info_lx (const_cast<char *> (path.c_str()),
808 cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
810 if (finfos->empty()) {
811 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Linux VST information from '%1'\n", path));
815 uint32_t discovered = 0;
816 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
820 if (!finfo->canProcessReplacing) {
821 warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
822 finfo->name, PROGRAM_NAME)
827 PluginInfoPtr info(new LXVSTPluginInfo);
829 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
830 info->name = PBD::basename_nosuffix (path);
832 info->name = finfo->name;
836 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
837 info->unique_id = buf;
838 info->category = "linuxVSTs";
840 info->creator = finfo->creator;
842 info->n_inputs.set_audio (finfo->numInputs);
843 info->n_outputs.set_audio (finfo->numOutputs);
844 info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
845 info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
846 info->type = ARDOUR::LXVST;
848 /* Make sure we don't find the same plugin in more than one place along
849 the LXVST_PATH We can't use a simple 'find' because the path is included
850 in the PluginInfo, and that is the one thing we can be sure MUST be
851 different if a duplicate instance is found. So we just compare the type
852 and unique ID (which for some VSTs isn't actually unique...)
855 // TODO: check dup-IDs with windowsVST, too
856 bool duplicate = false;
857 if (!_lxvst_plugin_info->empty()) {
858 for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) {
859 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
860 warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n";
868 _lxvst_plugin_info->push_back (info);
873 vstfx_free_info_list (finfos);
874 return discovered > 0 ? 0 : -1;
877 #endif // LXVST_SUPPORT
880 PluginManager::PluginStatusType
881 PluginManager::get_status (const PluginInfoPtr& pi)
883 PluginStatus ps (pi->type, pi->unique_id);
884 PluginStatusList::const_iterator i = find (statuses.begin(), statuses.end(), ps);
885 if (i == statuses.end() ) {
893 PluginManager::save_statuses ()
896 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
898 ofs.open (path.c_str(), ios_base::openmode (ios::out|ios::trunc));
904 for (PluginStatusList::iterator i = statuses.begin(); i != statuses.end(); ++i) {
916 ofs << "Windows-VST";
925 switch ((*i).status) {
938 ofs << (*i).unique_id;;
946 PluginManager::load_statuses ()
948 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
949 ifstream ifs (path.c_str());
959 PluginStatusType status;
976 /* rest of the line is the plugin ID */
978 ifs.getline (buf, sizeof (buf), '\n');
983 if (sstatus == "Normal") {
985 } else if (sstatus == "Favorite") {
987 } else if (sstatus == "Hidden") {
990 error << string_compose (_("unknown plugin status type \"%1\" - all entries ignored"), sstatus)
996 if (stype == "LADSPA") {
998 } else if (stype == "AudioUnit") {
1000 } else if (stype == "LV2") {
1002 } else if (stype == "Windows-VST") {
1004 } else if (stype == "LXVST") {
1007 error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype)
1013 strip_whitespace_edges (id);
1014 set_status (type, id, status);
1021 PluginManager::set_status (PluginType t, string id, PluginStatusType status)
1023 PluginStatus ps (t, id, status);
1024 statuses.erase (ps);
1026 if (status == Normal) {
1030 statuses.insert (ps);
1033 ARDOUR::PluginInfoList&
1034 PluginManager::windows_vst_plugin_info ()
1036 #ifdef WINDOWS_VST_SUPPORT
1037 if (!_windows_vst_plugin_info) {
1038 windows_vst_refresh ();
1040 return *_windows_vst_plugin_info;
1042 return _empty_plugin_info;
1046 ARDOUR::PluginInfoList&
1047 PluginManager::lxvst_plugin_info ()
1049 #ifdef LXVST_SUPPORT
1050 assert(_lxvst_plugin_info);
1051 return *_lxvst_plugin_info;
1053 return _empty_plugin_info;
1057 ARDOUR::PluginInfoList&
1058 PluginManager::ladspa_plugin_info ()
1060 assert(_ladspa_plugin_info);
1061 return *_ladspa_plugin_info;
1064 ARDOUR::PluginInfoList&
1065 PluginManager::lv2_plugin_info ()
1068 assert(_lv2_plugin_info);
1069 return *_lv2_plugin_info;
1071 return _empty_plugin_info;
1075 ARDOUR::PluginInfoList&
1076 PluginManager::au_plugin_info ()
1078 #ifdef AUDIOUNIT_SUPPORT
1079 assert(_au_plugin_info);
1080 return *_au_plugin_info;
1082 return _empty_plugin_info;