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/ladspa_search_path.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;
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)
119 if ((s = getenv ("LADSPA_RDF_PATH"))){
123 if (lrdf_path.length() == 0) {
124 lrdf_path = "/usr/local/share/ladspa/rdf:/usr/share/ladspa/rdf";
127 add_lrdf_data(lrdf_path);
128 add_ladspa_presets();
129 #ifdef WINDOWS_VST_SUPPORT
130 if (Config->get_use_windows_vst ()) {
131 add_windows_vst_presets ();
133 #endif /* WINDOWS_VST_SUPPORT */
136 if (Config->get_use_lxvst()) {
139 #endif /* Native LinuxVST support*/
141 if ((s = getenv ("VST_PATH"))) {
142 windows_vst_path = s;
143 } else if ((s = getenv ("VST_PLUGINS"))) {
144 windows_vst_path = s;
147 if ((s = getenv ("LXVST_PATH"))) {
149 } else if ((s = getenv ("LXVST_PLUGINS"))) {
153 if (_instance == 0) {
157 /* the plugin manager is constructed too early to use Profile */
159 if (getenv ("ARDOUR_SAE")) {
160 ladspa_plugin_whitelist.push_back (1203); // single band parametric
161 ladspa_plugin_whitelist.push_back (1772); // caps compressor
162 ladspa_plugin_whitelist.push_back (1913); // fast lookahead limiter
163 ladspa_plugin_whitelist.push_back (1075); // simple RMS expander
164 ladspa_plugin_whitelist.push_back (1061); // feedback delay line (max 5s)
165 ladspa_plugin_whitelist.push_back (1216); // gverb
166 ladspa_plugin_whitelist.push_back (2150); // tap pitch shifter
169 BootMessage (_("Discovering Plugins"));
173 PluginManager::~PluginManager()
179 PluginManager::refresh ()
181 DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n");
182 BootMessage (_("Discovering Plugins"));
188 #ifdef WINDOWS_VST_SUPPORT
189 if (Config->get_use_windows_vst()) {
190 windows_vst_refresh ();
192 #endif // WINDOWS_VST_SUPPORT
195 if(Config->get_use_lxvst()) {
198 #endif //Native linuxVST SUPPORT
200 #ifdef AUDIOUNIT_SUPPORT
204 PluginListChanged (); /* EMIT SIGNAL */
205 PluginScanMessage(X_("closeme"), "");
209 PluginManager::cancel_plugin_scan ()
215 PluginManager::clear_vst_cache ()
217 // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
218 #ifdef WINDOWS_VST_SUPPORT
221 vector<string *> *fsi_files;
223 fsi_files = scanner (windows_vst_path, "\\.fsi$", true, true, -1, false);
225 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
226 ::g_unlink((*i)->c_str());
229 vector_delete(fsi_files);
236 vector<string *> *fsi_files;
237 fsi_files = scanner (lxvst_path, "\\.fsi$", true, true, -1, false);
239 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
240 ::g_unlink((*i)->c_str());
243 vector_delete(fsi_files);
247 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
250 personal = Glib::build_filename (Glib::get_home_dir (), ".fst");
253 vector<string *> *fsi_files;
254 fsi_files = scanner (personal, "\\.fsi$", true, true, -1, false);
256 for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
257 ::g_unlink((*i)->c_str());
260 vector_delete(fsi_files);
266 PluginManager::clear_vst_blacklist ()
268 // TODO -> libs/ardour/vst_info_file.cc
272 PluginManager::ladspa_refresh ()
274 if (_ladspa_plugin_info) {
275 _ladspa_plugin_info->clear ();
277 _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
280 /* allow LADSPA_PATH to augment, not override standard locations */
282 /* Only add standard locations to ladspa_path if it doesn't
283 * already contain them. Check for trailing G_DIR_SEPARATOR too.
286 vector<string> ladspa_modules;
288 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string()));
290 Glib::PatternSpec so_extension_pattern("*.so");
291 Glib::PatternSpec dylib_extension_pattern("*.dylib");
292 Glib::PatternSpec dll_extension_pattern("*.dll");
294 find_matching_files_in_search_path (ladspa_search_path (),
295 so_extension_pattern, ladspa_modules);
297 find_matching_files_in_search_path (ladspa_search_path (),
298 dylib_extension_pattern, ladspa_modules);
300 find_matching_files_in_search_path (ladspa_search_path (),
301 dll_extension_pattern, ladspa_modules);
303 for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) {
304 ARDOUR::PluginScanMessage(_("LADSPA"), *i);
305 ladspa_discover (*i);
309 static bool rdf_filter (const string &str, void* /*arg*/)
311 return str[0] != '.' &&
312 ((str.find(".rdf") == (str.length() - 4)) ||
313 (str.find(".rdfs") == (str.length() - 5)) ||
314 (str.find(".n3") == (str.length() - 3)) ||
315 (str.find(".ttl") == (str.length() - 4)));
319 PluginManager::add_ladspa_presets()
321 add_presets ("ladspa");
325 PluginManager::add_windows_vst_presets()
327 add_presets ("windows-vst");
331 PluginManager::add_lxvst_presets()
333 add_presets ("lxvst");
337 PluginManager::add_presets(string domain)
341 vector<string *> *presets;
342 vector<string *>::iterator x;
345 if ((envvar = getenv ("HOME")) == 0) {
349 string path = string_compose("%1/.%2/rdf", envvar, domain);
350 presets = scanner (path, rdf_filter, 0, false, true);
353 for (x = presets->begin(); x != presets->end (); ++x) {
354 string file = "file:" + **x;
355 if (lrdf_read_file(file.c_str())) {
356 warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
360 vector_delete (presets);
366 PluginManager::add_lrdf_data (const string &path)
370 vector<string *>* rdf_files;
371 vector<string *>::iterator x;
373 rdf_files = scanner (path, rdf_filter, 0, false, true);
376 for (x = rdf_files->begin(); x != rdf_files->end (); ++x) {
377 const string uri(string("file://") + **x);
379 if (lrdf_read_file(uri.c_str())) {
380 warning << "Could not parse rdf file: " << uri << endmsg;
384 vector_delete (rdf_files);
390 PluginManager::ladspa_discover (string path)
392 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path));
394 Glib::Module module(path);
395 const LADSPA_Descriptor *descriptor;
396 LADSPA_Descriptor_Function dfunc;
400 error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"),
401 path, Glib::Module::get_last_error()) << endmsg;
406 if (!module.get_symbol("ladspa_descriptor", func)) {
407 error << string_compose(_("LADSPA: module \"%1\" has no descriptor function."), path) << endmsg;
408 error << Glib::Module::get_last_error() << endmsg;
412 dfunc = (LADSPA_Descriptor_Function)func;
414 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
416 for (uint32_t i = 0; ; ++i) {
417 if ((descriptor = dfunc (i)) == 0) {
421 if (!ladspa_plugin_whitelist.empty()) {
422 if (find (ladspa_plugin_whitelist.begin(), ladspa_plugin_whitelist.end(), descriptor->UniqueID) == ladspa_plugin_whitelist.end()) {
427 PluginInfoPtr info(new LadspaPluginInfo);
428 info->name = descriptor->Name;
429 info->category = get_ladspa_category(descriptor->UniqueID);
430 info->creator = descriptor->Maker;
433 info->n_inputs = ChanCount();
434 info->n_outputs = ChanCount();
435 info->type = ARDOUR::LADSPA;
438 snprintf (buf, sizeof (buf), "%lu", descriptor->UniqueID);
439 info->unique_id = buf;
441 for (uint32_t n=0; n < descriptor->PortCount; ++n) {
442 if ( LADSPA_IS_PORT_AUDIO (descriptor->PortDescriptors[n]) ) {
443 if ( LADSPA_IS_PORT_INPUT (descriptor->PortDescriptors[n]) ) {
444 info->n_inputs.set_audio(info->n_inputs.n_audio() + 1);
446 else if ( LADSPA_IS_PORT_OUTPUT (descriptor->PortDescriptors[n]) ) {
447 info->n_outputs.set_audio(info->n_outputs.n_audio() + 1);
452 if(_ladspa_plugin_info->empty()){
453 _ladspa_plugin_info->push_back (info);
456 //Ensure that the plugin is not already in the plugin list.
460 for (PluginInfoList::const_iterator i = _ladspa_plugin_info->begin(); i != _ladspa_plugin_info->end(); ++i) {
461 if(0 == info->unique_id.compare((*i)->unique_id)){
467 _ladspa_plugin_info->push_back (info);
470 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs));
473 // GDB WILL NOT LIKE YOU IF YOU DO THIS
480 PluginManager::get_ladspa_category (uint32_t plugin_id)
484 lrdf_statement pattern;
486 snprintf(buf, sizeof(buf), "%s%" PRIu32, LADSPA_BASE, plugin_id);
487 pattern.subject = buf;
488 pattern.predicate = const_cast<char*>(RDF_TYPE);
490 pattern.object_type = lrdf_uri;
492 lrdf_statement* matches1 = lrdf_matches (&pattern);
498 pattern.subject = matches1->object;
499 pattern.predicate = const_cast<char*>(LADSPA_BASE "hasLabel");
501 pattern.object_type = lrdf_literal;
503 lrdf_statement* matches2 = lrdf_matches (&pattern);
504 lrdf_free_statements(matches1);
510 string label = matches2->object;
511 lrdf_free_statements(matches2);
513 /* Kludge LADSPA class names to be singular and match LV2 class names.
514 This avoids duplicate plugin menus for every class, which is necessary
515 to make the plugin category menu at all usable, but is obviously a
518 In the short term, lrdf could be updated so the labels match and a new
519 release made. To support both specs, we should probably be mapping the
520 URIs to the same category in code and perhaps tweaking that hierarchy
521 dynamically to suit the user. Personally, I (drobilla) think that time
522 is better spent replacing the little-used LRDF.
524 In the longer term, we will abandon LRDF entirely in favour of LV2 and
525 use that class hierarchy. Aside from fixing this problem properly, that
526 will also allow for translated labels. SWH plugins have been LV2 for
527 ages; TAP needs porting. I don't know of anything else with LRDF data.
529 if (label == "Utilities") {
531 } else if (label == "Pitch shifters") {
532 return "Pitch Shifter";
533 } else if (label != "Dynamics" && label != "Chorus"
534 &&label[label.length() - 1] == 's'
535 && label[label.length() - 2] != 's') {
536 return label.substr(0, label.length() - 1);
547 PluginManager::lv2_refresh ()
549 DEBUG_TRACE (DEBUG::PluginManager, "LV2: refresh\n");
550 delete _lv2_plugin_info;
551 _lv2_plugin_info = LV2PluginInfo::discover();
555 #ifdef AUDIOUNIT_SUPPORT
557 PluginManager::au_refresh ()
559 DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n");
560 delete _au_plugin_info;
561 _au_plugin_info = AUPluginInfo::discover();
566 #ifdef WINDOWS_VST_SUPPORT
569 PluginManager::windows_vst_refresh ()
571 if (_windows_vst_plugin_info) {
572 _windows_vst_plugin_info->clear ();
574 _windows_vst_plugin_info = new ARDOUR::PluginInfoList();
577 if (windows_vst_path.length() == 0) {
578 windows_vst_path = "/usr/local/lib/vst:/usr/lib/vst";
581 windows_vst_discover_from_path (windows_vst_path);
585 PluginManager::add_windows_vst_directory (string path)
587 if (windows_vst_discover_from_path (path) == 0) {
588 windows_vst_path += ':';
589 windows_vst_path += path;
595 static bool windows_vst_filter (const string& str, void * /*arg*/)
597 /* Not a dotfile, has a prefix before a period, suffix is "dll" */
599 return str[0] != '.' && (str.length() > 4 && str.find (".dll") == (str.length() - 4));
603 PluginManager::windows_vst_discover_from_path (string path)
606 vector<string *> *plugin_objects;
607 vector<string *>::iterator x;
610 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
612 plugin_objects = scanner (windows_vst_path, windows_vst_filter, 0, false, true);
614 if (plugin_objects) {
615 for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
616 ARDOUR::PluginScanMessage(_("VST"), **x);
617 windows_vst_discover (**x);
620 vector_delete (plugin_objects);
627 PluginManager::windows_vst_discover (string path)
629 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
631 vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()));
633 if (finfos->empty()) {
634 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path));
638 uint32_t discovered = 0;
639 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
643 if (!finfo->canProcessReplacing) {
644 warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
645 finfo->name, PROGRAM_NAME)
650 PluginInfoPtr info (new WindowsVSTPluginInfo);
652 /* what a joke freeware VST is */
654 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
655 info->name = PBD::basename_nosuffix (path);
657 info->name = finfo->name;
661 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
662 info->unique_id = buf;
663 info->category = "VST";
665 info->creator = finfo->creator;
667 info->n_inputs.set_audio (finfo->numInputs);
668 info->n_outputs.set_audio (finfo->numOutputs);
669 info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0);
670 info->type = ARDOUR::Windows_VST;
672 // TODO: check dup-IDs (lxvst AND windows vst)
673 bool duplicate = false;
675 if (!_windows_vst_plugin_info->empty()) {
676 for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) {
677 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
678 warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n";
686 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id));
687 _windows_vst_plugin_info->push_back (info);
692 vstfx_free_info_list (finfos);
693 return discovered > 0 ? 0 : -1;
696 #endif // WINDOWS_VST_SUPPORT
701 PluginManager::lxvst_refresh ()
703 if (_lxvst_plugin_info) {
704 _lxvst_plugin_info->clear ();
706 _lxvst_plugin_info = new ARDOUR::PluginInfoList();
709 if (lxvst_path.length() == 0) {
710 lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:"
711 "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:"
712 "/usr/lib/vst:/usr/local/lib/vst";
715 lxvst_discover_from_path (lxvst_path);
719 PluginManager::add_lxvst_directory (string path)
721 if (lxvst_discover_from_path (path) == 0) {
729 static bool lxvst_filter (const string& str, void *)
731 /* Not a dotfile, has a prefix before a period, suffix is "so" */
733 return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3));
737 PluginManager::lxvst_discover_from_path (string path)
740 vector<string *> *plugin_objects;
741 vector<string *>::iterator x;
748 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
750 plugin_objects = scanner (lxvst_path, lxvst_filter, 0, false, true);
752 if (plugin_objects) {
753 for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
754 ARDOUR::PluginScanMessage(_("LXVST"), **x);
755 lxvst_discover (**x);
758 vector_delete (plugin_objects);
765 PluginManager::lxvst_discover (string path)
767 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("checking apparent LXVST plugin at %1\n", path));
769 vector<VSTInfo*> * finfos = vstfx_get_info_lx (const_cast<char *> (path.c_str()));
771 if (finfos->empty()) {
772 DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Linux VST information from '%1'\n", path));
776 uint32_t discovered = 0;
777 for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
781 if (!finfo->canProcessReplacing) {
782 warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
783 finfo->name, PROGRAM_NAME)
788 PluginInfoPtr info(new LXVSTPluginInfo);
790 if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
791 info->name = PBD::basename_nosuffix (path);
793 info->name = finfo->name;
797 snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
798 info->unique_id = buf;
799 info->category = "linuxVSTs";
801 info->creator = finfo->creator;
803 info->n_inputs.set_audio (finfo->numInputs);
804 info->n_outputs.set_audio (finfo->numOutputs);
805 info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0);
806 info->type = ARDOUR::LXVST;
808 /* Make sure we don't find the same plugin in more than one place along
809 the LXVST_PATH We can't use a simple 'find' because the path is included
810 in the PluginInfo, and that is the one thing we can be sure MUST be
811 different if a duplicate instance is found. So we just compare the type
812 and unique ID (which for some VSTs isn't actually unique...)
815 // TODO: check dup-IDs with windowsVST, too
816 bool duplicate = false;
817 if (!_lxvst_plugin_info->empty()) {
818 for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) {
819 if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
820 warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n";
828 _lxvst_plugin_info->push_back (info);
833 vstfx_free_info_list (finfos);
834 return discovered > 0 ? 0 : -1;
837 #endif // LXVST_SUPPORT
840 PluginManager::PluginStatusType
841 PluginManager::get_status (const PluginInfoPtr& pi)
843 PluginStatus ps (pi->type, pi->unique_id);
844 PluginStatusList::const_iterator i = find (statuses.begin(), statuses.end(), ps);
845 if (i == statuses.end() ) {
853 PluginManager::save_statuses ()
856 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
858 ofs.open (path.c_str(), ios_base::openmode (ios::out|ios::trunc));
864 for (PluginStatusList::iterator i = statuses.begin(); i != statuses.end(); ++i) {
876 ofs << "Windows-VST";
885 switch ((*i).status) {
898 ofs << (*i).unique_id;;
906 PluginManager::load_statuses ()
908 std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
909 ifstream ifs (path.c_str());
919 PluginStatusType status;
936 /* rest of the line is the plugin ID */
938 ifs.getline (buf, sizeof (buf), '\n');
943 if (sstatus == "Normal") {
945 } else if (sstatus == "Favorite") {
947 } else if (sstatus == "Hidden") {
950 error << string_compose (_("unknown plugin status type \"%1\" - all entries ignored"), sstatus)
956 if (stype == "LADSPA") {
958 } else if (stype == "AudioUnit") {
960 } else if (stype == "LV2") {
962 } else if (stype == "Windows-VST") {
964 } else if (stype == "LXVST") {
967 error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype)
973 strip_whitespace_edges (id);
974 set_status (type, id, status);
981 PluginManager::set_status (PluginType t, string id, PluginStatusType status)
983 PluginStatus ps (t, id, status);
986 if (status == Normal) {
990 statuses.insert (ps);
993 ARDOUR::PluginInfoList&
994 PluginManager::windows_vst_plugin_info ()
996 #ifdef WINDOWS_VST_SUPPORT
997 if (!_windows_vst_plugin_info) {
998 windows_vst_refresh ();
1000 return *_windows_vst_plugin_info;
1002 return _empty_plugin_info;
1006 ARDOUR::PluginInfoList&
1007 PluginManager::lxvst_plugin_info ()
1009 #ifdef LXVST_SUPPORT
1010 if (!_lxvst_plugin_info)
1012 return *_lxvst_plugin_info;
1014 return _empty_plugin_info;
1018 ARDOUR::PluginInfoList&
1019 PluginManager::ladspa_plugin_info ()
1021 if (!_ladspa_plugin_info)
1023 return *_ladspa_plugin_info;
1026 ARDOUR::PluginInfoList&
1027 PluginManager::lv2_plugin_info ()
1030 if (!_lv2_plugin_info)
1032 return *_lv2_plugin_info;
1034 return _empty_plugin_info;
1038 ARDOUR::PluginInfoList&
1039 PluginManager::au_plugin_info ()
1041 #ifdef AUDIOUNIT_SUPPORT
1042 if (!_au_plugin_info)
1044 return *_au_plugin_info;
1046 return _empty_plugin_info;