summaryrefslogtreecommitdiff
path: root/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp')
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp41
1 files changed, 38 insertions, 3 deletions
diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp
index cb71fc4750..99baac3b72 100644
--- a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp
+++ b/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp
@@ -38,6 +38,7 @@
#include "PluginLoader.h"
#include "PluginInputDomainAdapter.h"
#include "PluginChannelAdapter.h"
+#include "PluginBufferingAdapter.h"
#include <fstream>
#include <cctype> // tolower
@@ -85,6 +86,8 @@ public:
string getLibraryPathForPlugin(PluginKey key);
+ static void setInstanceToClean(PluginLoader *instance);
+
protected:
class PluginDeletionNotifyAdapter : public PluginWrapper {
public:
@@ -94,6 +97,15 @@ protected:
Impl *m_loader;
};
+ class InstanceCleaner {
+ public:
+ InstanceCleaner() : m_instance(0) { }
+ ~InstanceCleaner() { delete m_instance; }
+ void setInstance(PluginLoader *instance) { m_instance = instance; }
+ protected:
+ PluginLoader *m_instance;
+ };
+
virtual void pluginDeleted(PluginDeletionNotifyAdapter *adapter);
map<PluginKey, string> m_pluginLibraryNameMap;
@@ -114,11 +126,16 @@ protected:
string splicePath(string a, string b);
vector<string> listFiles(string dir, string ext);
+
+ static InstanceCleaner m_cleaner;
};
PluginLoader *
PluginLoader::m_instance = 0;
+PluginLoader::Impl::InstanceCleaner
+PluginLoader::Impl::m_cleaner;
+
PluginLoader::PluginLoader()
{
m_impl = new Impl();
@@ -132,7 +149,13 @@ PluginLoader::~PluginLoader()
PluginLoader *
PluginLoader::getInstance()
{
- if (!m_instance) m_instance = new PluginLoader();
+ if (!m_instance) {
+ // The cleaner doesn't own the instance, because we leave the
+ // instance pointer in the base class for binary backwards
+ // compatibility reasons and to avoid waste
+ m_instance = new PluginLoader();
+ Impl::setInstanceToClean(m_instance);
+ }
return m_instance;
}
@@ -177,6 +200,12 @@ PluginLoader::Impl::~Impl()
{
}
+void
+PluginLoader::Impl::setInstanceToClean(PluginLoader *instance)
+{
+ m_cleaner.setInstance(instance);
+}
+
vector<PluginLoader::PluginKey>
PluginLoader::Impl::listPlugins()
{
@@ -366,6 +395,10 @@ PluginLoader::Impl::loadPlugin(PluginKey key,
}
}
+ if (adapterFlags & ADAPT_BUFFER_SIZE) {
+ adapter = new PluginBufferingAdapter(adapter);
+ }
+
if (adapterFlags & ADAPT_CHANNEL_COUNT) {
adapter = new PluginChannelAdapter(adapter);
}
@@ -549,9 +582,11 @@ PluginLoader::Impl::listFiles(string dir, string extension)
struct dirent *e = 0;
while ((e = readdir(d))) {
+
+ if (!(e->d_type & DT_REG) && (e->d_type != DT_UNKNOWN)) continue;
- if (!(e->d_type & DT_REG) || !e->d_name) continue;
-
+ if (!e->d_name) continue;
+
size_t len = strlen(e->d_name);
if (len < extlen + 2 ||
e->d_name + len - extlen - 1 != "." + extension) {