X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=49d72f65d6016a36a2d579fb4037206a8f4c0f13;hb=e56c8f0309aa35265785f4a31fac1bd38f868fd1;hp=42e8e3cbfeea72d2d9b94c491afdb3fa1555f048;hpb=2e8fb9207e1203802e915e7110e95882037202ad;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 42e8e3cbfe..49d72f65d6 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -67,6 +67,8 @@ #include "ardour/filesystem_paths.h" #include "ardour/ladspa.h" #include "ardour/ladspa_plugin.h" +#include "ardour/luascripting.h" +#include "ardour/luaproc.h" #include "ardour/plugin.h" #include "ardour/plugin_manager.h" #include "ardour/rc_configuration.h" @@ -119,6 +121,7 @@ PluginManager::PluginManager () , _ladspa_plugin_info(0) , _lv2_plugin_info(0) , _au_plugin_info(0) + , _lua_plugin_info(0) , _cancel_scan(false) , _cancel_timeout(false) { @@ -215,6 +218,8 @@ PluginManager::PluginManager () } BootMessage (_("Discovering Plugins")); + + LuaScripting::instance().scripts_changed.connect_same_thread (lua_refresh_connection, boost::bind (&PluginManager::lua_refresh_cb, this)); } @@ -227,6 +232,7 @@ PluginManager::~PluginManager() delete _ladspa_plugin_info; delete _lv2_plugin_info; delete _au_plugin_info; + delete _lua_plugin_info; } } @@ -244,6 +250,8 @@ PluginManager::refresh (bool cache_only) BootMessage (_("Scanning LADSPA Plugins")); ladspa_refresh (); + BootMessage (_("Scanning Lua DSP Processors")); + lua_refresh (); #ifdef LV2_SUPPORT BootMessage (_("Scanning LV2 Plugins")); lv2_refresh (); @@ -437,11 +445,7 @@ void PluginManager::clear_au_cache () { #ifdef AUDIOUNIT_SUPPORT - // AUPluginInfo::au_cache_path () - string fn = Glib::build_filename (ARDOUR::user_config_directory(), "au_cache"); - if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) { - ::g_unlink(fn.c_str()); - } + AUPluginInfo::clear_cache (); #endif } @@ -456,6 +460,32 @@ PluginManager::clear_au_blacklist () #endif } +void +PluginManager::lua_refresh () +{ + if (_lua_plugin_info) { + _lua_plugin_info->clear (); + } else { + _lua_plugin_info = new ARDOUR::PluginInfoList (); + } + ARDOUR::LuaScriptList & _scripts (LuaScripting::instance ().scripts (LuaScriptInfo::DSP)); + for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) { + LuaPluginInfoPtr lpi (new LuaPluginInfo(*s)); + _lua_plugin_info->push_back (lpi); + } +} + +void +PluginManager::lua_refresh_cb () +{ + Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK); + if (!lm.locked()) { + return; + } + lua_refresh (); + PluginListChanged (); /* EMIT SIGNAL */ +} + void PluginManager::ladspa_refresh () { @@ -586,6 +616,11 @@ PluginManager::ladspa_discover (string path) DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path)); for (uint32_t i = 0; ; ++i) { + /* if a ladspa plugin allocates memory here + * it is never free()ed (or plugin-dependent only when unloading). + * For some plugins memory allocated is incremental, we should + * avoid re-scanning plugins and file bug reports. + */ if ((descriptor = dfunc (i)) == 0) { break; } @@ -798,55 +833,56 @@ static std::string dll_info (std::string path) { uint16_t type = 0; off_t pe_hdr_off = 0; - int fd = open(path.c_str(), O_RDONLY, 0444); + int fd = g_open(path.c_str(), O_RDONLY, 0444); if (fd < 0) { - return _("- cannot open dll"); // TODO strerror() + return _("cannot open dll"); // TODO strerror() } if (68 != read (fd, buf, 68)) { - rv = _("- invalid dll, file too small"); + rv = _("invalid dll, file too small"); goto errorout; } if (buf[0] != 'M' && buf[1] != 'Z') { - rv = _("- not a dll"); + rv = _("not a dll"); goto errorout; } pe_hdr_off = *((int32_t*) &buf[60]); if (pe_hdr_off !=lseek (fd, pe_hdr_off, SEEK_SET)) { - rv = _("- cannot determine dll type"); + rv = _("cannot determine dll type"); goto errorout; } if (6 != read (fd, buf, 6)) { - rv = _("- cannot read dll PE header"); + rv = _("cannot read dll PE header"); goto errorout; } if (buf[0] != 'P' && buf[1] != 'E') { - rv = _("- invalid dll PE header"); + rv = _("invalid dll PE header"); goto errorout; } type = *((uint16_t*) &buf[4]); switch (type) { case 0x014c: - rv = _("- i386 (32bit)"); + rv = _("i386 (32-bit)"); break; case 0x0200: - rv = _("- Itanium"); + rv = _("Itanium"); break; case 0x8664: - rv = _("- x64 (64bit)"); + rv = _("x64 (64-bit)"); break; case 0: - rv = _("- Native Architecture"); + rv = _("Native Architecture"); break; default: - rv = _("- Unknown Architecture"); + rv = _("Unknown Architecture"); break; } errorout: + assert (rv.length() > 0); close (fd); return rv; } @@ -857,7 +893,11 @@ PluginManager::windows_vst_discover (string path, bool cache_only) DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path)); if (Config->get_verbose_plugin_scan()) { - info << string_compose (_(" * %1 %2 %3"), path, (cache_only ? _(" (cache only)") : "", dll_info (path))) << endmsg; + if (cache_only) { + info << string_compose (_(" * %1 (cache only)"), path) << endmsg; + } else { + info << string_compose (_(" * %1 - %2"), path, dll_info (path)) << endmsg; + } } _cancel_timeout = false; @@ -1097,6 +1137,9 @@ PluginManager::save_statuses () case LXVST: ofs << "LXVST"; break; + case Lua: + ofs << "Lua"; + break; } ofs << ' '; @@ -1118,6 +1161,7 @@ PluginManager::save_statuses () ofs << endl; } g_file_set_contents (path.c_str(), ofs.str().c_str(), -1, NULL); + PluginStatusesChanged (); /* EMIT SIGNAL */ } void @@ -1182,6 +1226,8 @@ PluginManager::load_statuses () type = Windows_VST; } else if (stype == "LXVST") { type = LXVST; + } else if (stype == "Lua") { + type = Lua; } else { error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype) << endmsg; @@ -1259,3 +1305,10 @@ PluginManager::au_plugin_info () #endif return _empty_plugin_info; } + +ARDOUR::PluginInfoList& +PluginManager::lua_plugin_info () +{ + assert(_lua_plugin_info); + return *_lua_plugin_info; +}