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;
 }