diff options
author | David Robillard <d@drobilla.net> | 2009-10-22 17:17:34 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-10-22 17:17:34 +0000 |
commit | 155338d168b362dd135597695aaa1e419831a277 (patch) | |
tree | c2f97ff4b99366b72418765cb4a69ccbd4c45065 /libs | |
parent | 525da3281674a92ff00150098ef1be7a403555dd (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.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/lv2_plugin.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/plugin_manager.h | 21 | ||||
-rw-r--r-- | libs/ardour/audio_unit.cc | 4 | ||||
-rw-r--r-- | libs/ardour/lv2_plugin.cc | 10 | ||||
-rw-r--r-- | libs/ardour/plugin_manager.cc | 91 |
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 +} |