Mercurial > hg > piper-cpp
changeset 32:2d97883d20df
Wire up a couple of server actions
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Tue, 24 May 2016 17:17:03 +0100 |
parents | b376ab0ce003 |
children | 0b48b10140bb |
files | Makefile bits/PluginHandleMapper.h bits/PreservingPluginHandleMapper.h bits/RequestOrResponse.h json/VampJson.h utilities/vampipe-convert.cpp utilities/vampipe-server.cpp |
diffstat | 7 files changed, 116 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Tue May 24 16:30:01 2016 +0100 +++ b/Makefile Tue May 24 17:17:03 2016 +0100 @@ -1,8 +1,10 @@ -CXXFLAGS := -Wall -Werror -O3 -std=c++11 +CXXFLAGS := -Wall -Werror -g -std=c++11 INCFLAGS := -Ivamp-plugin-sdk -Ijson -Icapnproto -I. LDFLAGS := -Lvamp-plugin-sdk -Wl,-Bstatic -lvamp-hostsdk -Wl,-Bdynamic -lcapnp -lkj -ldl +#!!! todo: proper dependencies + all: bin/vamp-json-cli bin/vamp-json-to-capnp bin/vampipe-convert bin/vampipe-server bin/vampipe-convert: o/vampipe-convert.o o/json11.o o/vamp.capnp.o
--- a/bits/PluginHandleMapper.h Tue May 24 16:30:01 2016 +0100 +++ b/bits/PluginHandleMapper.h Tue May 24 17:17:03 2016 +0100 @@ -41,6 +41,8 @@ class PluginHandleMapper { + // NB the handle type must fit in a JSON number + public: class NotFound : virtual public std::runtime_error { public:
--- a/bits/PreservingPluginHandleMapper.h Tue May 24 16:30:01 2016 +0100 +++ b/bits/PreservingPluginHandleMapper.h Tue May 24 17:17:03 2016 +0100 @@ -37,6 +37,8 @@ #include "PluginHandleMapper.h" +#include <iostream> + namespace vampipe { class PreservingPluginHandleMapper : public PluginHandleMapper @@ -46,7 +48,13 @@ virtual int32_t pluginToHandle(Vamp::Plugin *p) { if (p == m_plugin) return m_handle; - else throw NotFound(); + else { + std::cerr << "PreservingPluginHandleMapper: p = " << p + << " differs from saved m_plugin " << m_plugin + << " (not returning saved handle " << m_handle << ")" + << std::endl; + throw NotFound(); + } } virtual Vamp::Plugin *handleToPlugin(int32_t h) {
--- a/bits/RequestOrResponse.h Tue May 24 16:30:01 2016 +0100 +++ b/bits/RequestOrResponse.h Tue May 24 17:17:03 2016 +0100 @@ -35,7 +35,6 @@ #ifndef VAMPIPE_REQUEST_OR_RESPONSE_H #define VAMPIPE_REQUEST_OR_RESPONSE_H -#include "PreservingPluginHandleMapper.h" #include "RequestResponseType.h" #include <vamp-hostsdk/PluginStaticData.h> @@ -64,8 +63,6 @@ bool success; std::string errorText; - PreservingPluginHandleMapper mapper; - std::vector<Vamp::HostExt::PluginStaticData> listResponse; Vamp::HostExt::LoadRequest loadRequest; Vamp::HostExt::LoadResponse loadResponse;
--- a/json/VampJson.h Tue May 24 16:30:01 2016 +0100 +++ b/json/VampJson.h Tue May 24 17:17:03 2016 +0100 @@ -689,15 +689,16 @@ if (!j.has_shape({ { "pluginKey", json11::Json::STRING }, - { "inputSampleRate", json11::Json::NUMBER }, - { "adapterFlags", json11::Json::ARRAY } }, err)) { + { "inputSampleRate", json11::Json::NUMBER } }, err)) { throw Failure("malformed load request: " + err); } Vamp::HostExt::LoadRequest req; req.pluginKey = j["pluginKey"].string_value(); req.inputSampleRate = j["inputSampleRate"].number_value(); - req.adapterFlags = toAdapterFlags(j["adapterFlags"]); + if (!j["adapterFlags"].is_null()) { + req.adapterFlags = toAdapterFlags(j["adapterFlags"]); + } return req; }
--- a/utilities/vampipe-convert.cpp Tue May 24 16:30:01 2016 +0100 +++ b/utilities/vampipe-convert.cpp Tue May 24 17:17:03 2016 +0100 @@ -3,6 +3,7 @@ #include "VampnProto.h" #include "bits/RequestOrResponse.h" +#include "bits/PreservingPluginHandleMapper.h" #include <iostream> #include <sstream> @@ -75,6 +76,8 @@ //!!! Lots of potential for refactoring the conversion classes based //!!! on the common matter in the following eight functions... +PreservingPluginHandleMapper mapper; + RequestOrResponse readRequestJson() { @@ -100,14 +103,13 @@ rr.loadRequest = VampJson::toVampRequest_Load(j); break; case RRType::Configure: - rr.configurationRequest = - VampJson::toVampRequest_Configure(j, rr.mapper); + rr.configurationRequest = VampJson::toVampRequest_Configure(j, mapper); break; case RRType::Process: - rr.processRequest = VampJson::toVampRequest_Process(j, rr.mapper); + rr.processRequest = VampJson::toVampRequest_Process(j, mapper); break; case RRType::Finish: - rr.finishPlugin = VampJson::toVampRequest_Finish(j, rr.mapper); + rr.finishPlugin = VampJson::toVampRequest_Finish(j, mapper); break; case RRType::NotValid: break; @@ -130,14 +132,13 @@ j = VampJson::fromVampRequest_Load(rr.loadRequest); break; case RRType::Configure: - j = VampJson::fromVampRequest_Configure(rr.configurationRequest, - rr.mapper); + j = VampJson::fromVampRequest_Configure(rr.configurationRequest, mapper); break; case RRType::Process: - j = VampJson::fromVampRequest_Process(rr.processRequest, rr.mapper); + j = VampJson::fromVampRequest_Process(rr.processRequest, mapper); break; case RRType::Finish: - j = VampJson::fromVampRequest_Finish(rr.finishPlugin, rr.mapper); + j = VampJson::fromVampRequest_Finish(rr.finishPlugin, mapper); break; case RRType::NotValid: break; @@ -168,7 +169,7 @@ rr.listResponse = VampJson::toVampResponse_List(j); break; case RRType::Load: - rr.loadResponse = VampJson::toVampResponse_Load(j, rr.mapper); + rr.loadResponse = VampJson::toVampResponse_Load(j, mapper); break; case RRType::Configure: rr.configurationResponse = VampJson::toVampResponse_Configure(j); @@ -197,7 +198,7 @@ j = VampJson::fromVampResponse_List("", rr.listResponse); break; case RRType::Load: - j = VampJson::fromVampResponse_Load(rr.loadResponse, rr.mapper); + j = VampJson::fromVampResponse_Load(rr.loadResponse, mapper); break; case RRType::Configure: j = VampJson::fromVampResponse_Configure(rr.configurationResponse); @@ -235,16 +236,14 @@ VampnProto::readVampRequest_Load(rr.loadRequest, reader); break; case RRType::Configure: - VampnProto::readVampRequest_Configure(rr.configurationRequest, reader, - rr.mapper); + VampnProto::readVampRequest_Configure(rr.configurationRequest, + reader, mapper); break; case RRType::Process: - VampnProto::readVampRequest_Process(rr.processRequest, reader, - rr.mapper); + VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper); break; case RRType::Finish: - VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, - rr.mapper); + VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, mapper); break; case RRType::NotValid: break; @@ -269,18 +268,13 @@ break; case RRType::Configure: VampnProto::buildVampRequest_Configure(builder, - rr.configurationRequest, - rr.mapper); + rr.configurationRequest, mapper); break; case RRType::Process: - VampnProto::buildVampRequest_Process(builder, - rr.processRequest, - rr.mapper); + VampnProto::buildVampRequest_Process(builder, rr.processRequest, mapper); break; case RRType::Finish: - VampnProto::buildVampRequest_Finish(builder, - rr.finishPlugin, - rr.mapper); + VampnProto::buildVampRequest_Finish(builder, rr.finishPlugin, mapper); break; case RRType::NotValid: break; @@ -306,7 +300,7 @@ VampnProto::readVampResponse_List(rr.listResponse, reader); break; case RRType::Load: - VampnProto::readVampResponse_Load(rr.loadResponse, reader, rr.mapper); + VampnProto::readVampResponse_Load(rr.loadResponse, reader, mapper); break; case RRType::Configure: VampnProto::readVampResponse_Configure(rr.configurationResponse, @@ -337,7 +331,7 @@ VampnProto::buildVampResponse_List(builder, "", rr.listResponse); break; case RRType::Load: - VampnProto::buildVampResponse_Load(builder, rr.loadResponse, rr.mapper); + VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper); break; case RRType::Configure: VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse);
--- a/utilities/vampipe-server.cpp Tue May 24 16:30:01 2016 +0100 +++ b/utilities/vampipe-server.cpp Tue May 24 17:17:03 2016 +0100 @@ -7,8 +7,13 @@ #include <sstream> #include <stdexcept> +#include <map> +#include <set> + using namespace std; using namespace vampipe; +using namespace Vamp; +using namespace Vamp::HostExt; void usage() { @@ -22,6 +27,50 @@ exit(2); } +class Mapper : public PluginHandleMapper +{ +public: + Mapper() : m_nextHandle(1) { } + + 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: + int32_t m_nextHandle; // NB 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; + RequestOrResponse readRequestCapnp() { @@ -42,16 +91,14 @@ VampnProto::readVampRequest_Load(rr.loadRequest, reader); break; case RRType::Configure: - VampnProto::readVampRequest_Configure(rr.configurationRequest, reader, - rr.mapper); + VampnProto::readVampRequest_Configure(rr.configurationRequest, + reader, mapper); break; case RRType::Process: - VampnProto::readVampRequest_Process(rr.processRequest, reader, - rr.mapper); + VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper); break; case RRType::Finish: - VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, - rr.mapper); + VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, mapper); break; case RRType::NotValid: break; @@ -72,7 +119,7 @@ VampnProto::buildVampResponse_List(builder, "", rr.listResponse); break; case RRType::Load: - VampnProto::buildVampResponse_Load(builder, rr.loadResponse, rr.mapper); + VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper); break; case RRType::Configure: VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse); @@ -95,7 +142,30 @@ { RequestOrResponse response; response.direction = RequestOrResponse::Response; - //!!! DO THE WORK! + response.type = request.type; + + auto loader = PluginLoader::getInstance(); + + switch (request.type) { + + case RRType::List: + response.listResponse = loader->listPluginData(); + response.success = true; + break; + + case RRType::Load: + response.loadResponse = loader->loadPlugin(request.loadRequest); + if (response.loadResponse.plugin != nullptr) { + mapper.addPlugin(response.loadResponse.plugin); + response.success = true; + } + break; + + default: + //!!! + ; + } + return response; }