# HG changeset patch # User cannam # Date 1181123390 0 # Node ID 3456fe86d385ba11489651961e2d0e62602f283e # Parent 47d6e670a810abca32f1a7e9f69519ddf4d510f0 * Switch PluginLoader to an m_impl structure to make it generally nicer diff -r 47d6e670a810 -r 3456fe86d385 vamp-sdk/hostext/PluginLoader.cpp --- a/vamp-sdk/hostext/PluginLoader.cpp Mon Jun 04 13:31:04 2007 +0000 +++ b/vamp-sdk/hostext/PluginLoader.cpp Wed Jun 06 09:49:50 2007 +0000 @@ -66,15 +66,61 @@ namespace HostExt { +class PluginLoader::Impl +{ +public: + virtual ~Impl() { } + + PluginKeyList listPlugins(); + + Plugin *loadPlugin(PluginKey key, + float inputSampleRate, + int adapterFlags); + + PluginKey composePluginKey(string libraryName, string identifier); + + PluginCategoryHierarchy getPluginCategory(PluginKey key); + + std::string getLibraryPathForPlugin(PluginKey key); + +protected: + class PluginDeletionNotifyAdapter : public PluginWrapper { + public: + PluginDeletionNotifyAdapter(Plugin *plugin, Impl *loader); + virtual ~PluginDeletionNotifyAdapter(); + protected: + Impl *m_loader; + }; + + virtual void pluginDeleted(PluginDeletionNotifyAdapter *adapter); + + std::map m_pluginLibraryNameMap; + void generateLibraryMap(); + + std::map m_taxonomy; + void generateTaxonomy(); + + std::map m_pluginLibraryHandleMap; + + void *loadLibrary(std::string path); + void unloadLibrary(void *handle); + void *lookupInLibrary(void *handle, const char *symbol); + + std::string splicePath(std::string a, std::string b); + std::vector listFiles(std::string dir, std::string ext); +}; + PluginLoader * PluginLoader::m_instance = 0; PluginLoader::PluginLoader() { + m_impl = new Impl(); } PluginLoader::~PluginLoader() { + delete m_impl; } PluginLoader * @@ -87,6 +133,38 @@ vector PluginLoader::listPlugins() { + return m_impl->listPlugins(); +} + +Plugin * +PluginLoader::loadPlugin(PluginKey key, + float inputSampleRate, + int adapterFlags) +{ + return m_impl->loadPlugin(key, inputSampleRate, adapterFlags); +} + +PluginLoader::PluginKey +PluginLoader::composePluginKey(string libraryName, string identifier) +{ + return m_impl->composePluginKey(libraryName, identifier); +} + +PluginLoader::PluginCategoryHierarchy +PluginLoader::getPluginCategory(PluginKey key) +{ + return m_impl->getPluginCategory(key); +} + +string +PluginLoader::getLibraryPathForPlugin(PluginKey key) +{ + return m_impl->getLibraryPathForPlugin(key); +} + +vector +PluginLoader::Impl::listPlugins() +{ if (m_pluginLibraryNameMap.empty()) generateLibraryMap(); vector plugins; @@ -100,7 +178,7 @@ } void -PluginLoader::generateLibraryMap() +PluginLoader::Impl::generateLibraryMap() { vector path = PluginHostAdapter::getPluginPath(); @@ -143,7 +221,7 @@ } PluginLoader::PluginKey -PluginLoader::composePluginKey(string libraryName, string identifier) +PluginLoader::Impl::composePluginKey(string libraryName, string identifier) { string basename = libraryName; @@ -157,15 +235,17 @@ } PluginLoader::PluginCategoryHierarchy -PluginLoader::getPluginCategory(PluginKey plugin) +PluginLoader::Impl::getPluginCategory(PluginKey plugin) { if (m_taxonomy.empty()) generateTaxonomy(); - if (m_taxonomy.find(plugin) == m_taxonomy.end()) return PluginCategoryHierarchy(); + if (m_taxonomy.find(plugin) == m_taxonomy.end()) { + return PluginCategoryHierarchy(); + } return m_taxonomy[plugin]; } string -PluginLoader::getLibraryPathForPlugin(PluginKey plugin) +PluginLoader::Impl::getLibraryPathForPlugin(PluginKey plugin) { if (m_pluginLibraryNameMap.empty()) generateLibraryMap(); if (m_pluginLibraryNameMap.find(plugin) == m_pluginLibraryNameMap.end()) return ""; @@ -173,7 +253,8 @@ } Plugin * -PluginLoader::loadPlugin(PluginKey key, float inputSampleRate, int adapterFlags) +PluginLoader::Impl::loadPlugin(PluginKey key, + float inputSampleRate, int adapterFlags) { string fullPath = getLibraryPathForPlugin(key); if (fullPath == "") return 0; @@ -236,9 +317,9 @@ } void -PluginLoader::generateTaxonomy() +PluginLoader::Impl::generateTaxonomy() { -// cerr << "PluginLoader::generateTaxonomy" << endl; +// cerr << "PluginLoader::Impl::generateTaxonomy" << endl; vector path = PluginHostAdapter::getPluginPath(); string libfragment = "/lib/"; @@ -324,7 +405,7 @@ } void * -PluginLoader::loadLibrary(string path) +PluginLoader::Impl::loadLibrary(string path) { void *handle = 0; #ifdef _WIN32 @@ -344,7 +425,7 @@ } void -PluginLoader::unloadLibrary(void *handle) +PluginLoader::Impl::unloadLibrary(void *handle) { #ifdef _WIN32 FreeLibrary((HINSTANCE)handle); @@ -354,7 +435,7 @@ } void * -PluginLoader::lookupInLibrary(void *handle, const char *symbol) +PluginLoader::Impl::lookupInLibrary(void *handle, const char *symbol) { #ifdef _WIN32 return (void *)GetProcAddress((HINSTANCE)handle, symbol); @@ -364,7 +445,7 @@ } string -PluginLoader::splicePath(string a, string b) +PluginLoader::Impl::splicePath(string a, string b) { #ifdef _WIN32 return a + "\\" + b; @@ -374,7 +455,7 @@ } vector -PluginLoader::listFiles(string dir, string extension) +PluginLoader::Impl::listFiles(string dir, string extension) { vector files; size_t extlen = extension.length(); @@ -419,21 +500,21 @@ } void -PluginLoader::pluginDeleted(PluginDeletionNotifyAdapter *adapter) +PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) { void *handle = m_pluginLibraryHandleMap[adapter]; if (handle) unloadLibrary(handle); m_pluginLibraryHandleMap.erase(adapter); } -PluginLoader::PluginDeletionNotifyAdapter::PluginDeletionNotifyAdapter(Plugin *plugin, - PluginLoader *loader) : +PluginLoader::Impl::PluginDeletionNotifyAdapter::PluginDeletionNotifyAdapter(Plugin *plugin, + Impl *loader) : PluginWrapper(plugin), m_loader(loader) { } -PluginLoader::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() +PluginLoader::Impl::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() { // We need to delete the plugin before calling pluginDeleted, as // the delete call may require calling through to the descriptor diff -r 47d6e670a810 -r 3456fe86d385 vamp-sdk/hostext/PluginLoader.h --- a/vamp-sdk/hostext/PluginLoader.h Mon Jun 04 13:31:04 2007 +0000 +++ b/vamp-sdk/hostext/PluginLoader.h Wed Jun 06 09:49:50 2007 +0000 @@ -183,30 +183,8 @@ PluginLoader(); virtual ~PluginLoader(); - class PluginDeletionNotifyAdapter : public PluginWrapper { - public: - PluginDeletionNotifyAdapter(Plugin *plugin, PluginLoader *loader); - virtual ~PluginDeletionNotifyAdapter(); - protected: - PluginLoader *m_loader; - }; - - virtual void pluginDeleted(PluginDeletionNotifyAdapter *adapter); - - std::map m_pluginLibraryNameMap; - void generateLibraryMap(); - - std::map m_taxonomy; - void generateTaxonomy(); - - std::map m_pluginLibraryHandleMap; - - void *loadLibrary(std::string path); - void unloadLibrary(void *handle); - void *lookupInLibrary(void *handle, const char *symbol); - - std::string splicePath(std::string a, std::string b); - std::vector listFiles(std::string dir, std::string ext); + class Impl; + Impl *m_impl; static PluginLoader *m_instance; };