summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-22 17:17:34 +0000
committerDavid Robillard <d@drobilla.net>2009-10-22 17:17:34 +0000
commit155338d168b362dd135597695aaa1e419831a277 (patch)
treec2f97ff4b99366b72418765cb4a69ccbd4c45065 /libs
parent525da3281674a92ff00150098ef1be7a403555dd (diff)
Defer plugin discovery until actually needed (significant startup time improvement, especially with LV2).
git-svn-id: svn://localhost/ardour2/branches/3.0@5859 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audio_unit.h2
-rw-r--r--libs/ardour/ardour/lv2_plugin.h4
-rw-r--r--libs/ardour/ardour/plugin_manager.h21
-rw-r--r--libs/ardour/audio_unit.cc4
-rw-r--r--libs/ardour/lv2_plugin.cc10
-rw-r--r--libs/ardour/plugin_manager.cc91
6 files changed, 86 insertions, 46 deletions
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index a1f22a88df..d1dd92dd3d 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -166,7 +166,7 @@ class AUPluginInfo : public PluginInfo {
AUPluginCachedInfo cache;
- static PluginInfoList discover ();
+ static PluginInfoList* discover ();
static void get_names (CAComponentDescription&, std::string& name, Glib::ustring& maker);
static std::string stringify_descriptor (const CAComponentDescription&);
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index f2773a3d6c..9705459ee1 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -176,7 +176,7 @@ struct LV2World {
SLV2Value srate;
SLV2Value gtk_gui;
SLV2Value external_gui;
- SLV2Value logarithmic;
+ SLV2Value logarithmic;
};
@@ -184,7 +184,7 @@ class LV2PluginInfo : public PluginInfo {
public:
LV2PluginInfo (void* slv2_world, void* slv2_plugin);;
~LV2PluginInfo ();;
- static PluginInfoList discover (void* slv2_world);
+ static PluginInfoList* discover (void* slv2_world);
PluginPtr load (Session& session);
diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h
index c792b539a7..d564d62a87 100644
--- a/libs/ardour/ardour/plugin_manager.h
+++ b/libs/ardour/ardour/plugin_manager.h
@@ -46,12 +46,10 @@ class PluginManager : public boost::noncopyable {
PluginManager ();
~PluginManager ();
- /* realtime plugin APIs */
-
- ARDOUR::PluginInfoList &vst_plugin_info () { return _vst_plugin_info; }
- ARDOUR::PluginInfoList &ladspa_plugin_info () { return _ladspa_plugin_info; }
- ARDOUR::PluginInfoList &lv2_plugin_info () { return _lv2_plugin_info; }
- ARDOUR::PluginInfoList &au_plugin_info () { return _au_plugin_info; }
+ ARDOUR::PluginInfoList &vst_plugin_info ();
+ ARDOUR::PluginInfoList &ladspa_plugin_info ();
+ ARDOUR::PluginInfoList &lv2_plugin_info ();
+ ARDOUR::PluginInfoList &au_plugin_info ();
void refresh ();
@@ -85,10 +83,11 @@ class PluginManager : public boost::noncopyable {
typedef std::set<FavoritePlugin> FavoritePluginList;
FavoritePluginList favorites;
- ARDOUR::PluginInfoList _vst_plugin_info;
- ARDOUR::PluginInfoList _ladspa_plugin_info;
- ARDOUR::PluginInfoList _lv2_plugin_info;
- ARDOUR::PluginInfoList _au_plugin_info;
+ ARDOUR::PluginInfoList _empty_plugin_info;
+ ARDOUR::PluginInfoList* _vst_plugin_info;
+ ARDOUR::PluginInfoList* _ladspa_plugin_info;
+ ARDOUR::PluginInfoList* _lv2_plugin_info;
+ ARDOUR::PluginInfoList* _au_plugin_info;
#ifdef HAVE_SLV2
LV2World* _lv2_world;
@@ -107,10 +106,8 @@ class PluginManager : public boost::noncopyable {
void add_vst_presets ();
void add_presets (std::string domain);
- int au_discover ();
void au_refresh ();
- int lv2_discover ();
void lv2_refresh ();
int vst_discover_from_path (std::string path);
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index b0ced9bdfb..cb91b34cf5 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -1444,7 +1444,7 @@ AUPluginInfo::au_cache_path ()
return Glib::build_filename (ARDOUR::get_user_ardour_path(), "au_cache");
}
-PluginInfoList
+PluginInfoList*
AUPluginInfo::discover ()
{
XMLTree tree;
@@ -1453,7 +1453,7 @@ AUPluginInfo::discover ()
ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
}
- PluginInfoList plugs;
+ PluginInfoList* plugs = new PluginInfoList ();
discover_fx (plugs);
discover_music (plugs);
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 678dfd4715..2090d18e96 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -703,15 +703,15 @@ LV2PluginInfo::load (Session& session)
return PluginPtr();
}
-PluginInfoList
+PluginInfoList*
LV2PluginInfo::discover (void* lv2_world)
{
- PluginInfoList plugs;
+ PluginInfoList* plugs = new PluginInfoList;
LV2World* world = (LV2World*)lv2_world;
SLV2Plugins plugins = slv2_world_get_all_plugins(world->world);
- cerr << "LV2: Discovered " << slv2_plugins_size (plugins) << " plugins\n";
+ cerr << "LV2: Discovering " << slv2_plugins_size (plugins) << " plugins" << endl;
for (unsigned i=0; i < slv2_plugins_size(plugins); ++i) {
SLV2Plugin p = slv2_plugins_get_at(plugins, i);
@@ -750,9 +750,11 @@ LV2PluginInfo::discover (void* lv2_world)
info->unique_id = slv2_value_as_uri(slv2_plugin_get_uri(p));
info->index = 0; // Meaningless for LV2
- plugs.push_back (info);
+ plugs->push_back (info);
}
+ cerr << "Done LV2 discovery" << endl;
+
return plugs;
}
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index 6ac57400c4..8315397fe8 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -74,6 +74,10 @@ using namespace std;
PluginManager* PluginManager::_manager = 0;
PluginManager::PluginManager ()
+ : _vst_plugin_info(0)
+ , _ladspa_plugin_info(0)
+ , _lv2_plugin_info(0)
+ , _au_plugin_info(0)
{
char* s;
string lrdf_path;
@@ -135,8 +139,6 @@ PluginManager::PluginManager ()
#endif
BootMessage (_("Discovering Plugins"));
-
- refresh ();
}
void
@@ -159,7 +161,10 @@ PluginManager::refresh ()
void
PluginManager::ladspa_refresh ()
{
- _ladspa_plugin_info.clear ();
+ if (_ladspa_plugin_info)
+ _ladspa_plugin_info->clear ();
+ else
+ _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
static const char *standard_paths[] = {
"/usr/local/lib64/ladspa",
@@ -240,12 +245,13 @@ PluginManager::ladspa_discover_from_path (string /*path*/)
return ret;
}
-static bool rdf_filter (const string &str, void */*arg*/)
+static bool rdf_filter (const string &str, void* /*arg*/)
{
return str[0] != '.' &&
((str.find(".rdf") == (str.length() - 4)) ||
(str.find(".rdfs") == (str.length() - 5)) ||
- (str.find(".n3") == (str.length() - 3)));
+ (str.find(".n3") == (str.length() - 3)) ||
+ (str.find(".ttl") == (str.length() - 4)));
}
void
@@ -368,22 +374,22 @@ PluginManager::ladspa_discover (string path)
}
}
- if(_ladspa_plugin_info.empty()){
- _ladspa_plugin_info.push_back (info);
+ if(_ladspa_plugin_info->empty()){
+ _ladspa_plugin_info->push_back (info);
}
//Ensure that the plugin is not already in the plugin list.
bool found = false;
- for (PluginInfoList::const_iterator i = _ladspa_plugin_info.begin(); i != _ladspa_plugin_info.end(); ++i) {
+ for (PluginInfoList::const_iterator i = _ladspa_plugin_info->begin(); i != _ladspa_plugin_info->end(); ++i) {
if(0 == info->unique_id.compare((*i)->unique_id)){
found = true;
}
}
if(!found){
- _ladspa_plugin_info.push_back (info);
+ _ladspa_plugin_info->push_back (info);
}
}
@@ -433,14 +439,8 @@ PluginManager::get_ladspa_category (uint32_t plugin_id)
void
PluginManager::lv2_refresh ()
{
- lv2_discover();
-}
-
-int
-PluginManager::lv2_discover ()
-{
+ delete _lv2_plugin_info;
_lv2_plugin_info = LV2PluginInfo::discover(_lv2_world);
- return 0;
}
#endif
@@ -448,14 +448,8 @@ PluginManager::lv2_discover ()
void
PluginManager::au_refresh ()
{
- au_discover();
-}
-
-int
-PluginManager::au_discover ()
-{
+ delete _au_plugin_info;
_au_plugin_info = AUPluginInfo::discover();
- return 0;
}
#endif
@@ -465,7 +459,10 @@ PluginManager::au_discover ()
void
PluginManager::vst_refresh ()
{
- _vst_plugin_info.clear ();
+ if (_vst_plugin_info)
+ _vst_plugin_info->clear ();
+ else
+ _vst_plugin_info = new ARDOUR::PluginInfoList();
if (vst_path.length() == 0) {
vst_path = "/usr/local/lib/vst:/usr/lib/vst";
@@ -552,7 +549,7 @@ PluginManager::vst_discover (string path)
info->n_outputs.set_audio (finfo->numOutputs);
info->type = ARDOUR::VST;
- _vst_plugin_info.push_back (info);
+ _vst_plugin_info->push_back (info);
fst_free_info (finfo);
return 0;
@@ -663,3 +660,47 @@ PluginManager::remove_favorite (PluginType t, string id)
FavoritePlugin fp (t, id);
favorites.erase (fp);
}
+
+ARDOUR::PluginInfoList&
+PluginManager::vst_plugin_info ()
+{
+#ifdef VST_SUPPORT
+ if (!_vst_plugin_info)
+ vst_refresh();
+ return *_vst_plugin_info;
+#else
+ return _empty_plugin_info;
+#endif
+}
+
+ARDOUR::PluginInfoList&
+PluginManager::ladspa_plugin_info ()
+{
+ if (!_ladspa_plugin_info)
+ ladspa_refresh();
+ return *_ladspa_plugin_info;
+}
+
+ARDOUR::PluginInfoList&
+PluginManager::lv2_plugin_info ()
+{
+#ifdef HAVE_SLV2
+ if (!_lv2_plugin_info)
+ lv2_refresh();
+ return *_lv2_plugin_info;
+#else
+ return _empty_plugin_info;
+#endif
+}
+
+ARDOUR::PluginInfoList&
+PluginManager::au_plugin_info ()
+{
+#ifdef HAVE_AUDIOUNITS
+ if (!_au_plugin_info)
+ au_refresh();
+ return *_au_plugin_info;
+#else
+ return _empty_plugin_info;
+#endif
+}