enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / ardour / plugin_manager.cc
index 89ddc5ff19f303fb204bd979f96be89e362a3426..23515a2e2e67867556cc4e167501358408fab5db 100644 (file)
@@ -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"
@@ -93,7 +95,7 @@
 #include "pbd/error.h"
 #include "pbd/stl_delete.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "ardour/debug.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;
                }
@@ -1103,8 +1138,7 @@ PluginManager::save_statuses ()
                        ofs << "LXVST";
                        break;
                case Lua:
-                       assert (0);
-                       continue;
+                       ofs << "Lua";
                        break;
                }
 
@@ -1192,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;
@@ -1269,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;
+}