#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"
#include "pbd/error.h"
#include "pbd/stl_delete.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "ardour/debug.h"
, _ladspa_plugin_info(0)
, _lv2_plugin_info(0)
, _au_plugin_info(0)
+ , _lua_plugin_info(0)
, _cancel_scan(false)
, _cancel_timeout(false)
{
}
BootMessage (_("Discovering Plugins"));
+
+ LuaScripting::instance().scripts_changed.connect_same_thread (lua_refresh_connection, boost::bind (&PluginManager::lua_refresh_cb, this));
}
delete _ladspa_plugin_info;
delete _lv2_plugin_info;
delete _au_plugin_info;
+ delete _lua_plugin_info;
}
}
BootMessage (_("Scanning LADSPA Plugins"));
ladspa_refresh ();
+ BootMessage (_("Scanning Lua DSP Processors"));
+ lua_refresh ();
#ifdef LV2_SUPPORT
BootMessage (_("Scanning LV2 Plugins"));
lv2_refresh ();
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
}
#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 ()
{
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;
}
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;
}
if (cache_only) {
info << string_compose (_(" * %1 (cache only)"), path) << endmsg;
} else {
- info << string_compose (_(" * %1 %2"), path, dll_info (path)) << endmsg;
+ info << string_compose (_(" * %1 - %2"), path, dll_info (path)) << endmsg;
}
}
case LXVST:
ofs << "LXVST";
break;
+ case Lua:
+ ofs << "Lua";
+ break;
}
ofs << ' ';
ofs << endl;
}
g_file_set_contents (path.c_str(), ofs.str().c_str(), -1, NULL);
+ PluginStatusesChanged (); /* EMIT SIGNAL */
}
void
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;
#endif
return _empty_plugin_info;
}
+
+ARDOUR::PluginInfoList&
+PluginManager::lua_plugin_info ()
+{
+ assert(_lua_plugin_info);
+ return *_lua_plugin_info;
+}