Mercurial > hg > piper-cpp
changeset 11:aa61cb5c5754
Use mapper
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Tue, 17 May 2016 11:15:25 +0100 |
parents | c8451896c40e |
children | 828930f9a65d |
files | bits/PluginHandleMapper.h utilities/json-cli.cpp |
diffstat | 2 files changed, 55 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/bits/PluginHandleMapper.h Tue May 17 09:58:15 2016 +0100 +++ b/bits/PluginHandleMapper.h Tue May 17 11:15:25 2016 +0100 @@ -46,8 +46,8 @@ NotFound() : runtime_error("plugin or handle not found in mapper") { } }; - virtual uint32_t pluginToHandle(Vamp::Plugin *) = 0; // may throw NotFound - virtual Vamp::Plugin *handleToPlugin(uint32_t) = 0; // may throw NotFound + virtual int32_t pluginToHandle(Vamp::Plugin *) = 0; // may throw NotFound + virtual Vamp::Plugin *handleToPlugin(int32_t) = 0; // may throw NotFound }; }
--- a/utilities/json-cli.cpp Tue May 17 09:58:15 2016 +0100 +++ b/utilities/json-cli.cpp Tue May 17 11:15:25 2016 +0100 @@ -14,10 +14,50 @@ using namespace json11; using namespace vampipe; -static map<uint32_t, Plugin *> loadedPlugins; -static set<uint32_t> initialisedPlugins; +class Mapper : public PluginHandleMapper +{ +public: + Mapper() : m_nextHandle(1) { } -static uint32_t nextHandle = 1; // plugin handle type must fit in JSON number + void addPlugin(Plugin *p) { + if (m_rplugins.find(p) == m_rplugins.end()) { + int32_t h = m_nextHandle++; + m_plugins[h] = p; + m_rplugins[p] = h; + } + } + + int32_t pluginToHandle(Plugin *p) { + if (m_rplugins.find(p) == m_rplugins.end()) { + throw NotFound(); + } + return m_rplugins[p]; + } + + Plugin *handleToPlugin(int32_t h) { + if (m_plugins.find(h) == m_plugins.end()) { + throw NotFound(); + } + return m_plugins[h]; + } + + bool isInitialised(int32_t h) { + return m_initialisedPlugins.find(h) != m_initialisedPlugins.end(); + } + + void markInitialised(int32_t h) { + m_initialisedPlugins.insert(h); + } + +private: +//!!! + mutex + int32_t m_nextHandle; // plugin handle type must fit in JSON number + map<uint32_t, Plugin *> m_plugins; + map<Plugin *, uint32_t> m_rplugins; + set<uint32_t> m_initialisedPlugins; +}; + +static Mapper mapper; Vamp::HostExt::LoadResponse loadPlugin(json11::Json j) { @@ -72,20 +112,10 @@ if (!loadResponse.plugin) { throw VampJson::Failure("plugin load failed"); } + + mapper.addPlugin(loadResponse.plugin); - uint32_t h = nextHandle++; - loadedPlugins[h] = loadResponse.plugin; - - Json::object response; - response["pluginHandle"] = double(h); - response["staticData"] = - VampJson::fromPluginStaticData(loadResponse.staticData); - response["defaultConfiguration"] = - VampJson::fromPluginConfiguration(loadResponse.defaultConfiguration); - - cerr << "Loaded plugin: handle is " << h << endl; - - return Json(response); + return VampJson::fromLoadResponse(loadResponse, mapper); } Json @@ -99,26 +129,23 @@ throw VampJson::Failure("malformed configuration request: " + err); } - uint32_t handle = j["pluginHandle"].int_value(); + int32_t handle = j["pluginHandle"].int_value(); - if (loadedPlugins.find(handle) == loadedPlugins.end()) { - throw VampJson::Failure("unknown plugin handle"); - } - - if (initialisedPlugins.find(handle) != initialisedPlugins.end()) { + if (mapper.isInitialised(handle)) { throw VampJson::Failure("plugin has already been initialised"); } - Plugin *plugin = loadedPlugins[handle]; + Plugin *plugin = mapper.handleToPlugin(handle); Json config = j["configuration"]; configurePlugin(plugin, config); - initialisedPlugins.insert(handle); + mapper.markInitialised(handle); cerr << "Configured and initialised plugin " << handle << endl; + //!!! to VampJson: Json::object jout; Json::array outs; Vamp::Plugin::OutputList vouts = plugin->getOutputDescriptors(); @@ -201,6 +228,8 @@ cout << success_response(result).dump() << endl; } catch (const VampJson::Failure &e) { cout << error_response(e.what()).dump() << endl; + } catch (const PluginHandleMapper::NotFound &e) { + cout << error_response(e.what()).dump() << endl; } }