changeset 69:91fda9470ee2

Merge from branch jsonrpc
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 06 Oct 2016 14:33:12 +0100
parents 6f160dee1192 (current diff) a5ba837bca28 (diff)
children 302a8e35248c
files
diffstat 6 files changed, 474 insertions(+), 429 deletions(-) [+]
line wrap: on
line diff
--- a/capnproto/VampnProto.h	Tue Sep 27 15:04:59 2016 +0100
+++ b/capnproto/VampnProto.h	Thu Oct 06 14:33:12 2016 +0100
@@ -370,17 +370,17 @@
     }
     
     static void
-    buildPluginStaticData(PluginStaticData::Builder &b,
+    buildExtractorStaticData(ExtractorStaticData::Builder &b,
                           const Vamp::HostExt::PluginStaticData &d) {
 
-        b.setPluginKey(d.pluginKey);
+        b.setKey(d.pluginKey);
 
         auto basic = b.initBasic();
         buildBasicDescriptor(basic, d.basic);
 
         b.setMaker(d.maker);
         b.setCopyright(d.copyright);
-        b.setPluginVersion(d.pluginVersion);
+        b.setVersion(d.pluginVersion);
 
         auto clist = b.initCategory(d.category.size());
         for (size_t i = 0; i < d.category.size(); ++i) {
@@ -414,16 +414,16 @@
     }
 
     static void
-    readPluginStaticData(Vamp::HostExt::PluginStaticData &d,
-                         const PluginStaticData::Reader &r) {
+    readExtractorStaticData(Vamp::HostExt::PluginStaticData &d,
+                         const ExtractorStaticData::Reader &r) {
         
-        d.pluginKey = r.getPluginKey();
+        d.pluginKey = r.getKey();
 
         readBasicDescriptor(d.basic, r.getBasic());
 
         d.maker = r.getMaker();
         d.copyright = r.getCopyright();
-        d.pluginVersion = r.getPluginVersion();
+        d.pluginVersion = r.getVersion();
 
         d.category.clear();
         auto cc = r.getCategory();
@@ -460,8 +460,8 @@
     }
 
     static void
-    buildPluginConfiguration(PluginConfiguration::Builder &b,
-                             const Vamp::HostExt::PluginConfiguration &c) {
+    buildConfiguration(Configuration::Builder &b,
+                       const Vamp::HostExt::PluginConfiguration &c) {
 
         const auto &vparams = c.parameterValues;
         auto params = b.initParameterValues(vparams.size());
@@ -479,8 +479,8 @@
     }
 
     static void
-    readPluginConfiguration(Vamp::HostExt::PluginConfiguration &c,
-                            const PluginConfiguration::Reader &r) {
+    readConfiguration(Vamp::HostExt::PluginConfiguration &c,
+                      const Configuration::Reader &r) {
 
         auto pp = r.getParameterValues();
         for (const auto &p: pp) {
@@ -497,7 +497,7 @@
     buildLoadRequest(LoadRequest::Builder &r,
                      const Vamp::HostExt::LoadRequest &req) {
 
-        r.setPluginKey(req.pluginKey);
+        r.setKey(req.pluginKey);
         r.setInputSampleRate(req.inputSampleRate);
 
         std::vector<AdapterFlag> flags;
@@ -521,7 +521,7 @@
     readLoadRequest(Vamp::HostExt::LoadRequest &req,
                     const LoadRequest::Reader &r) {
 
-        req.pluginKey = r.getPluginKey();
+        req.pluginKey = r.getKey();
         req.inputSampleRate = r.getInputSampleRate();
 
         int flags = 0;
@@ -545,11 +545,11 @@
                       const Vamp::HostExt::LoadResponse &resp,
                       const PluginHandleMapper &pmapper) {
 
-        b.setPluginHandle(pmapper.pluginToHandle(resp.plugin));
+        b.setHandle(pmapper.pluginToHandle(resp.plugin));
         auto sd = b.initStaticData();
-        buildPluginStaticData(sd, resp.staticData);
+        buildExtractorStaticData(sd, resp.staticData);
         auto conf = b.initDefaultConfiguration();
-        buildPluginConfiguration(conf, resp.defaultConfiguration);
+        buildConfiguration(conf, resp.defaultConfiguration);
     }
 
     static void
@@ -557,9 +557,9 @@
                      const LoadResponse::Reader &r,
                      const PluginHandleMapper &pmapper) {
 
-        resp.plugin = pmapper.handleToPlugin(r.getPluginHandle());
-        readPluginStaticData(resp.staticData, r.getStaticData());
-        readPluginConfiguration(resp.defaultConfiguration,
+        resp.plugin = pmapper.handleToPlugin(r.getHandle());
+        readExtractorStaticData(resp.staticData, r.getStaticData());
+        readConfiguration(resp.defaultConfiguration,
                                 r.getDefaultConfiguration());
     }
 
@@ -568,9 +568,9 @@
                               const Vamp::HostExt::ConfigurationRequest &cr,
                               const PluginHandleMapper &pmapper) {
 
-        b.setPluginHandle(pmapper.pluginToHandle(cr.plugin));
+        b.setHandle(pmapper.pluginToHandle(cr.plugin));
         auto c = b.initConfiguration();
-        buildPluginConfiguration(c, cr.configuration);
+        buildConfiguration(c, cr.configuration);
     }
 
     static void
@@ -578,10 +578,10 @@
                              const ConfigurationRequest::Reader &r,
                              const PluginHandleMapper &pmapper) {
 
-        auto h = r.getPluginHandle();
+        auto h = r.getHandle();
         cr.plugin = pmapper.handleToPlugin(h);
         auto c = r.getConfiguration();
-        readPluginConfiguration(cr.configuration, c);
+        readConfiguration(cr.configuration, c);
     }
 
     static void
@@ -589,7 +589,7 @@
                                const Vamp::HostExt::ConfigurationResponse &cr,
                                const PluginHandleMapper &pmapper) {
 
-        b.setPluginHandle(pmapper.pluginToHandle(cr.plugin));
+        b.setHandle(pmapper.pluginToHandle(cr.plugin));
         auto olist = b.initOutputs(cr.outputs.size());
         for (size_t i = 0; i < cr.outputs.size(); ++i) {
             auto od = olist[i];
@@ -602,7 +602,7 @@
                               const ConfigurationResponse::Reader &r,
                               const PluginHandleMapper &pmapper) {
 
-        cr.plugin = pmapper.handleToPlugin(r.getPluginHandle());
+        cr.plugin = pmapper.handleToPlugin(r.getHandle());
         cr.outputs.clear();
         auto oo = r.getOutputs();
         for (const auto &o: oo) {
@@ -652,7 +652,7 @@
                         const Vamp::HostExt::ProcessRequest &pr,
                         const PluginHandleMapper &pmapper) {
 
-        b.setPluginHandle(pmapper.pluginToHandle(pr.plugin));
+        b.setHandle(pmapper.pluginToHandle(pr.plugin));
         auto input = b.initProcessInput();
         buildProcessInput(input, pr.timestamp, pr.inputBuffers);
     }
@@ -662,7 +662,7 @@
                        const ProcessRequest::Reader &r,
                        const PluginHandleMapper &pmapper) {
 
-        auto h = r.getPluginHandle();
+        auto h = r.getHandle();
         pr.plugin = pmapper.handleToPlugin(h);
         readProcessInput(pr.timestamp, pr.inputBuffers, r.getProcessInput());
     }
@@ -672,7 +672,7 @@
                          const Vamp::HostExt::ProcessResponse &pr,
                          const PluginHandleMapper &pmapper) {
 
-        b.setPluginHandle(pmapper.pluginToHandle(pr.plugin));
+        b.setHandle(pmapper.pluginToHandle(pr.plugin));
         auto f = b.initFeatures();
         buildFeatureSet(f, pr.features,
                         *pmapper.pluginToOutputIdMapper(pr.plugin));
@@ -683,47 +683,51 @@
                         const ProcessResponse::Reader &r,
                         const PluginHandleMapper &pmapper) {
 
-        auto h = r.getPluginHandle();
+        auto h = r.getHandle();
         pr.plugin = pmapper.handleToPlugin(h);
         readFeatureSet(pr.features, r.getFeatures(),
-                       *pmapper.handleToOutputIdMapper(r.getPluginHandle()));
+                       *pmapper.handleToOutputIdMapper(r.getHandle()));
     }
 
     static void
-    buildVampRequest_List(VampRequest::Builder &b) {
-        b.getRequest().setList();
+    buildRpcRequest_List(RpcRequest::Builder &b) {
+        b.getRequest().initList();
     }
 
     static void
-    buildVampResponse_List(VampResponse::Builder &b,
+    buildRpcResponse_List(RpcResponse::Builder &b,
                            const Vamp::HostExt::ListResponse &resp) {
-        b.setSuccess(true);
+
         auto r = b.getResponse().initList();
-        auto p = r.initPlugins(resp.plugins.size());
+        auto p = r.initAvailable(resp.plugins.size());
         for (size_t i = 0; i < resp.plugins.size(); ++i) {
             auto pd = p[i];
-            buildPluginStaticData(pd, resp.plugins[i]);
+            buildExtractorStaticData(pd, resp.plugins[i]);
         }
     }
     
     static void
-    buildVampRequest_Load(VampRequest::Builder &b,
+    buildRpcRequest_Load(RpcRequest::Builder &b,
                           const Vamp::HostExt::LoadRequest &req) {
         auto u = b.getRequest().initLoad();
         buildLoadRequest(u, req);
     }
 
     static void
-    buildVampResponse_Load(VampResponse::Builder &b,
+    buildRpcResponse_Load(RpcResponse::Builder &b,
                            const Vamp::HostExt::LoadResponse &resp,
                            const PluginHandleMapper &pmapper) {
-        b.setSuccess(resp.plugin != 0);
-        auto u = b.getResponse().initLoad();
-        buildLoadResponse(u, resp, pmapper);
+
+        if (resp.plugin) {
+            auto u = b.getResponse().initLoad();
+            buildLoadResponse(u, resp, pmapper);
+        } else {
+            buildRpcResponse_Error(b, "Failed to load plugin", RRType::Load);
+        }
     }
 
     static void
-    buildVampRequest_Configure(VampRequest::Builder &b,
+    buildRpcRequest_Configure(RpcRequest::Builder &b,
                                const Vamp::HostExt::ConfigurationRequest &cr,
                                const PluginHandleMapper &pmapper) {
         auto u = b.getRequest().initConfigure();
@@ -731,16 +735,21 @@
     }
 
     static void
-    buildVampResponse_Configure(VampResponse::Builder &b,
+    buildRpcResponse_Configure(RpcResponse::Builder &b,
                                 const Vamp::HostExt::ConfigurationResponse &cr,
                                 const PluginHandleMapper &pmapper) {
-        b.setSuccess(!cr.outputs.empty());
-        auto u = b.getResponse().initConfigure();
-        buildConfigurationResponse(u, cr, pmapper);
+
+        if (!cr.outputs.empty()) {
+            auto u = b.getResponse().initConfigure();
+            buildConfigurationResponse(u, cr, pmapper);
+        } else {
+            buildRpcResponse_Error(b, "Failed to configure plugin",
+                                   RRType::Configure);
+        }
     }
     
     static void
-    buildVampRequest_Process(VampRequest::Builder &b,
+    buildRpcRequest_Process(RpcRequest::Builder &b,
                              const Vamp::HostExt::ProcessRequest &pr,
                              const PluginHandleMapper &pmapper) {
         auto u = b.getRequest().initProcess();
@@ -748,130 +757,140 @@
     }
     
     static void
-    buildVampResponse_Process(VampResponse::Builder &b,
+    buildRpcResponse_Process(RpcResponse::Builder &b,
                               const Vamp::HostExt::ProcessResponse &pr,
                               const PluginHandleMapper &pmapper) {
-        b.setSuccess(true);
+
         auto u = b.getResponse().initProcess();
         buildProcessResponse(u, pr, pmapper);
     }
     
     static void
-    buildVampRequest_Finish(VampRequest::Builder &b,
+    buildRpcRequest_Finish(RpcRequest::Builder &b,
                             const Vamp::HostExt::FinishRequest &req,
                             const PluginHandleMapper &pmapper) {
 
         auto u = b.getRequest().initFinish();
-        u.setPluginHandle(pmapper.pluginToHandle(req.plugin));
+        u.setHandle(pmapper.pluginToHandle(req.plugin));
     }
     
     static void
-    buildVampResponse_Finish(VampResponse::Builder &b,
+    buildRpcResponse_Finish(RpcResponse::Builder &b,
                              const Vamp::HostExt::ProcessResponse &pr,
                              const PluginHandleMapper &pmapper) {
 
-        buildVampResponse_Process(b, pr, pmapper);
+        auto u = b.getResponse().initFinish();
+        buildProcessResponse(u, pr, pmapper);
     }
 
     static void
-    buildVampResponse_Error(VampResponse::Builder &b,
+    buildRpcResponse_Error(RpcResponse::Builder &b,
                             const std::string &errorText,
                             RRType responseType)
     {
         std::string type;
 
+        auto e = b.getResponse().initError();
+
         if (responseType == RRType::List) {
             type = "list";
-            b.getResponse().initList();
         } else if (responseType == RRType::Load) {
             type = "load";
-            b.getResponse().initLoad();
         } else if (responseType == RRType::Configure) {
             type = "configure";
-            b.getResponse().initConfigure();
         } else if (responseType == RRType::Process) {
             type = "process";
-            b.getResponse().initProcess();
         } else if (responseType == RRType::Finish) {
             type = "finish";
-            b.getResponse().initFinish();
         } else {
             type = "invalid";
         }
 
-        b.setSuccess(false);
-        b.setErrorText(std::string("error in ") + type + " request: " + errorText);
+        //!!! + code
+        
+        e.setMessage(std::string("error in ") + type + " request: " + errorText);
     }
 
     static void
-    buildVampResponse_Exception(VampResponse::Builder &b,
+    buildRpcResponse_Exception(RpcResponse::Builder &b,
                                 const std::exception &e,
                                 RRType responseType)
     {
-        return buildVampResponse_Error(b, e.what(), responseType);
+        return buildRpcResponse_Error(b, e.what(), responseType);
     }
     
     static RRType
-    getRequestResponseType(const VampRequest::Reader &r) {
+    getRequestResponseType(const RpcRequest::Reader &r) {
         switch (r.getRequest().which()) {
-        case VampRequest::Request::Which::LIST:
+        case RpcRequest::Request::Which::LIST:
             return RRType::List;
-        case VampRequest::Request::Which::LOAD:
+        case RpcRequest::Request::Which::LOAD:
             return RRType::Load;
-        case VampRequest::Request::Which::CONFIGURE:
+        case RpcRequest::Request::Which::CONFIGURE:
             return RRType::Configure;
-        case VampRequest::Request::Which::PROCESS:
+        case RpcRequest::Request::Which::PROCESS:
             return RRType::Process;
-        case VampRequest::Request::Which::FINISH:
+        case RpcRequest::Request::Which::FINISH:
             return RRType::Finish;
         }
         return RRType::NotValid;
     }
 
     static RRType
-    getRequestResponseType(const VampResponse::Reader &r) {
+    getRequestResponseType(const RpcResponse::Reader &r) {
         switch (r.getResponse().which()) {
-        case VampResponse::Response::Which::LIST:
+        case RpcResponse::Response::Which::ERROR:
+            return RRType::NotValid; //!!! or error type? test this
+        case RpcResponse::Response::Which::LIST:
             return RRType::List;
-        case VampResponse::Response::Which::LOAD:
+        case RpcResponse::Response::Which::LOAD:
             return RRType::Load;
-        case VampResponse::Response::Which::CONFIGURE:
+        case RpcResponse::Response::Which::CONFIGURE:
             return RRType::Configure;
-        case VampResponse::Response::Which::PROCESS:
+        case RpcResponse::Response::Which::PROCESS:
             return RRType::Process;
-        case VampResponse::Response::Which::FINISH:
+        case RpcResponse::Response::Which::FINISH:
             return RRType::Finish;
         }
         return RRType::NotValid;
     }
     
     static void
-    readVampRequest_List(const VampRequest::Reader &r) {
+    readRpcResponse_Error(int &code,
+                          std::string &message,
+                          const RpcResponse::Reader &r) {
+        if (getRequestResponseType(r) != RRType::NotValid) {
+            throw std::logic_error("not an error response");
+        }
+        code = r.getResponse().getError().getCode();
+        message = r.getResponse().getError().getMessage();
+    }
+        
+    static void
+    readRpcRequest_List(const RpcRequest::Reader &r) {
         if (getRequestResponseType(r) != RRType::List) {
             throw std::logic_error("not a list request");
         }
     }
 
     static void
-    readVampResponse_List(Vamp::HostExt::ListResponse &resp,
-                          const VampResponse::Reader &r) {
+    readRpcResponse_List(Vamp::HostExt::ListResponse &resp,
+                          const RpcResponse::Reader &r) {
         if (getRequestResponseType(r) != RRType::List) {
             throw std::logic_error("not a list response");
         }
         resp.plugins.clear();
-        if (r.getSuccess()) {
-            auto pp = r.getResponse().getList().getPlugins();
-            for (const auto &p: pp) {
-                Vamp::HostExt::PluginStaticData psd;
-                readPluginStaticData(psd, p);
-                resp.plugins.push_back(psd);
-            }
+        auto pp = r.getResponse().getList().getAvailable();
+        for (const auto &p: pp) {
+            Vamp::HostExt::PluginStaticData psd;
+            readExtractorStaticData(psd, p);
+            resp.plugins.push_back(psd);
         }
     }
     
     static void
-    readVampRequest_Load(Vamp::HostExt::LoadRequest &req,
-                         const VampRequest::Reader &r) {
+    readRpcRequest_Load(Vamp::HostExt::LoadRequest &req,
+                         const RpcRequest::Reader &r) {
         if (getRequestResponseType(r) != RRType::Load) {
             throw std::logic_error("not a load request");
         }
@@ -879,21 +898,19 @@
     }
 
     static void
-    readVampResponse_Load(Vamp::HostExt::LoadResponse &resp,
-                          const VampResponse::Reader &r,
-                          const PluginHandleMapper &pmapper) {
+    readRpcResponse_Load(Vamp::HostExt::LoadResponse &resp,
+                         const RpcResponse::Reader &r,
+                         const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Load) {
             throw std::logic_error("not a load response");
         }
         resp = {};
-        if (r.getSuccess()) {
-            readLoadResponse(resp, r.getResponse().getLoad(), pmapper);
-        }
+        readLoadResponse(resp, r.getResponse().getLoad(), pmapper);
     }
     
     static void
-    readVampRequest_Configure(Vamp::HostExt::ConfigurationRequest &req,
-                              const VampRequest::Reader &r,
+    readRpcRequest_Configure(Vamp::HostExt::ConfigurationRequest &req,
+                              const RpcRequest::Reader &r,
                               const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Configure) {
             throw std::logic_error("not a configuration request");
@@ -902,23 +919,21 @@
     }
 
     static void
-    readVampResponse_Configure(Vamp::HostExt::ConfigurationResponse &resp,
-                               const VampResponse::Reader &r,
+    readRpcResponse_Configure(Vamp::HostExt::ConfigurationResponse &resp,
+                               const RpcResponse::Reader &r,
                                const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Configure) {
             throw std::logic_error("not a configuration response");
         }
         resp = {};
-        if (r.getSuccess()) {
-            readConfigurationResponse(resp,
-                                      r.getResponse().getConfigure(),
-                                      pmapper);
-        }
+        readConfigurationResponse(resp,
+                                  r.getResponse().getConfigure(),
+                                  pmapper);
     }
     
     static void
-    readVampRequest_Process(Vamp::HostExt::ProcessRequest &req,
-                            const VampRequest::Reader &r,
+    readRpcRequest_Process(Vamp::HostExt::ProcessRequest &req,
+                            const RpcRequest::Reader &r,
                             const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Process) {
             throw std::logic_error("not a process request");
@@ -927,40 +942,36 @@
     }
 
     static void
-    readVampResponse_Process(Vamp::HostExt::ProcessResponse &resp,
-                             const VampResponse::Reader &r,
+    readRpcResponse_Process(Vamp::HostExt::ProcessResponse &resp,
+                             const RpcResponse::Reader &r,
                              const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Process) {
             throw std::logic_error("not a process response");
         }
         resp = {};
-        if (r.getSuccess()) {
-            readProcessResponse(resp, r.getResponse().getProcess(), pmapper);
-        }
+        readProcessResponse(resp, r.getResponse().getProcess(), pmapper);
     }
     
     static void
-    readVampRequest_Finish(Vamp::HostExt::FinishRequest &req,
-                           const VampRequest::Reader &r,
+    readRpcRequest_Finish(Vamp::HostExt::FinishRequest &req,
+                           const RpcRequest::Reader &r,
                            const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Finish) {
             throw std::logic_error("not a finish request");
         }
         req.plugin = pmapper.handleToPlugin
-            (r.getRequest().getFinish().getPluginHandle());
+            (r.getRequest().getFinish().getHandle());
     }
 
     static void
-    readVampResponse_Finish(Vamp::HostExt::ProcessResponse &resp,
-                            const VampResponse::Reader &r,
+    readRpcResponse_Finish(Vamp::HostExt::ProcessResponse &resp,
+                            const RpcResponse::Reader &r,
                             const PluginHandleMapper &pmapper) {
         if (getRequestResponseType(r) != RRType::Finish) {
             throw std::logic_error("not a finish response");
         }
         resp = {};
-        if (r.getSuccess()) {
-            readProcessResponse(resp, r.getResponse().getFinish(), pmapper);
-        }
+        readProcessResponse(resp, r.getResponse().getFinish(), pmapper);
     }
 };
 
--- a/capnproto/vamp.capnp	Tue Sep 27 15:04:59 2016 +0100
+++ b/capnproto/vamp.capnp	Thu Oct 06 14:33:12 2016 +0100
@@ -69,12 +69,12 @@
     configured         @1  :ConfiguredOutputDescriptor;
 }
 
-struct PluginStaticData {
-    pluginKey          @0  :Text;
+struct ExtractorStaticData {
+    key                @0  :Text;
     basic              @1  :Basic;
     maker              @2  :Text;
     copyright          @3  :Text;
-    pluginVersion      @4  :Int32;
+    version            @4  :Int32;
     category           @5  :List(Text);
     minChannelCount    @6  :Int32;
     maxChannelCount    @7  :Int32;
@@ -106,7 +106,7 @@
     featurePairs       @0  :List(FSPair);
 }
 
-struct PluginConfiguration {
+struct Configuration {
     struct PVPair {
         parameter      @0  :Text;
         value          @1  :Float32;
@@ -118,49 +118,57 @@
     blockSize          @4  :Int32;
 }
 
+struct ListRequest {
+}
+
 struct ListResponse {
-    plugins            @0  :List(PluginStaticData);    
+    available          @0  :List(ExtractorStaticData);    
 }
 
 struct LoadRequest {
-    pluginKey          @0  :Text;
+    key                @0  :Text;
     inputSampleRate    @1  :Float32;
     adapterFlags       @2  :List(AdapterFlag);
 }
 
 struct LoadResponse {
-    pluginHandle       @0  :Int32;
-    staticData         @1  :PluginStaticData;
-    defaultConfiguration @2  :PluginConfiguration;
+    handle             @0  :Int32;
+    staticData         @1  :ExtractorStaticData;
+    defaultConfiguration @2  :Configuration;
 }
 
 struct ConfigurationRequest {
-    pluginHandle       @0  :Int32;
-    configuration      @1  :PluginConfiguration;
+    handle             @0  :Int32;
+    configuration      @1  :Configuration;
 }
 
 struct ConfigurationResponse {
-    pluginHandle       @0  :Int32;
+    handle             @0  :Int32;
     outputs            @1  :List(OutputDescriptor);
 }
 
 struct ProcessRequest {
-    pluginHandle       @0  :Int32;
+    handle             @0  :Int32;
     processInput       @1  :ProcessInput;
 }
 
 struct ProcessResponse {
-    pluginHandle       @0  :Int32;
+    handle             @0  :Int32;
     features           @1  :FeatureSet;
 }
 
 struct FinishRequest {
-    pluginHandle       @0  :Int32;
+    handle             @0  :Int32;
 }
 
-struct VampRequest {
+struct Error {
+    code               @0  :Int32;
+    message            @1  :Text;
+}
+
+struct RpcRequest {
     request :union {
-	list           @0  :Void;
+	list           @0  :ListRequest;
 	load           @1  :LoadRequest;
 	configure      @2  :ConfigurationRequest;
 	process        @3  :ProcessRequest;
@@ -168,15 +176,14 @@
     }
 }
 
-struct VampResponse {
-    success            @0  :Bool;
-    errorText          @1  :Text = "";
+struct RpcResponse {
     response :union {
-	list           @2  :ListResponse;
-	load           @3  :LoadResponse;
-	configure      @4  :ConfigurationResponse;
-	process        @5  :ProcessResponse;
-	finish         @6  :ProcessResponse;
+        error          @0  :Error;
+	list           @1  :ListResponse;
+	load           @2  :LoadResponse;
+	configure      @3  :ConfigurationResponse;
+	process        @4  :ProcessResponse;
+	finish         @5  :ProcessResponse;
     }
 }
 
--- a/json/VampJson.h	Tue Sep 27 15:04:59 2016 +0100
+++ b/json/VampJson.h	Thu Oct 06 14:33:12 2016 +0100
@@ -536,11 +536,11 @@
     fromPluginStaticData(const Vamp::HostExt::PluginStaticData &d) {
 
         json11::Json::object jo;
-        jo["pluginKey"] = d.pluginKey;
+        jo["key"] = d.pluginKey;
         jo["basic"] = fromBasicDescriptor(d.basic);
         jo["maker"] = d.maker;
         jo["copyright"] = d.copyright;
-        jo["pluginVersion"] = d.pluginVersion;
+        jo["version"] = d.pluginVersion;
 
         json11::Json::array cat;
         for (const std::string &c: d.category) cat.push_back(c);
@@ -573,8 +573,8 @@
     toPluginStaticData(json11::Json j, std::string &err) {
 
         if (!j.has_shape({
-                    { "pluginKey", json11::Json::STRING },
-                    { "pluginVersion", json11::Json::NUMBER },
+                    { "key", json11::Json::STRING },
+                    { "version", json11::Json::NUMBER },
                     { "minChannelCount", json11::Json::NUMBER },
                     { "maxChannelCount", json11::Json::NUMBER },
                     { "inputDomain", json11::Json::STRING }}, err)) {
@@ -623,14 +623,14 @@
 
             Vamp::HostExt::PluginStaticData psd;
 
-            psd.pluginKey = j["pluginKey"].string_value();
+            psd.pluginKey = j["key"].string_value();
 
             toBasicDescriptor(j["basic"], psd.basic, err);
             if (failed(err)) return {};
 
             psd.maker = j["maker"].string_value();
             psd.copyright = j["copyright"].string_value();
-            psd.pluginVersion = j["pluginVersion"].int_value();
+            psd.pluginVersion = j["version"].int_value();
 
             for (const auto &c : j["category"].array_items()) {
                 if (!c.is_string()) {
@@ -802,7 +802,7 @@
     fromLoadRequest(const Vamp::HostExt::LoadRequest &req) {
 
         json11::Json::object jo;
-        jo["pluginKey"] = req.pluginKey;
+        jo["key"] = req.pluginKey;
         jo["inputSampleRate"] = req.inputSampleRate;
         jo["adapterFlags"] = fromAdapterFlags(req.adapterFlags);
         return json11::Json(jo);
@@ -812,14 +812,14 @@
     toLoadRequest(json11::Json j, std::string &err) {
         
         if (!j.has_shape({
-                    { "pluginKey", json11::Json::STRING },
+                    { "key", json11::Json::STRING },
                     { "inputSampleRate", json11::Json::NUMBER } }, err)) {
             err = "malformed load request: " + err;
             return {};
         }
     
         Vamp::HostExt::LoadRequest req;
-        req.pluginKey = j["pluginKey"].string_value();
+        req.pluginKey = j["key"].string_value();
         req.inputSampleRate = j["inputSampleRate"].number_value();
         if (!j["adapterFlags"].is_null()) {
             req.adapterFlags = toAdapterFlags(j["adapterFlags"], err);
@@ -833,7 +833,7 @@
                      const PluginHandleMapper &pmapper) {
 
         json11::Json::object jo;
-        jo["pluginHandle"] = double(pmapper.pluginToHandle(resp.plugin));
+        jo["handle"] = double(pmapper.pluginToHandle(resp.plugin));
         jo["staticData"] = fromPluginStaticData(resp.staticData);
         jo["defaultConfiguration"] =
             fromPluginConfiguration(resp.defaultConfiguration);
@@ -845,7 +845,7 @@
                    const PluginHandleMapper &pmapper, std::string &err) {
 
         if (!j.has_shape({
-                    { "pluginHandle", json11::Json::NUMBER },
+                    { "handle", json11::Json::NUMBER },
                     { "staticData", json11::Json::OBJECT },
                     { "defaultConfiguration", json11::Json::OBJECT } }, err)) {
             err = "malformed load response: " + err;
@@ -853,7 +853,7 @@
         }
 
         Vamp::HostExt::LoadResponse resp;
-        resp.plugin = pmapper.handleToPlugin(j["pluginHandle"].int_value());
+        resp.plugin = pmapper.handleToPlugin(j["handle"].int_value());
         resp.staticData = toPluginStaticData(j["staticData"], err);
         if (failed(err)) return {};
         resp.defaultConfiguration = toPluginConfiguration(j["defaultConfiguration"],
@@ -868,7 +868,7 @@
 
         json11::Json::object jo;
 
-        jo["pluginHandle"] = pmapper.pluginToHandle(cr.plugin);
+        jo["handle"] = pmapper.pluginToHandle(cr.plugin);
         jo["configuration"] = fromPluginConfiguration(cr.configuration);
         
         return json11::Json(jo);
@@ -879,14 +879,14 @@
                            const PluginHandleMapper &pmapper, std::string &err) {
 
         if (!j.has_shape({
-                    { "pluginHandle", json11::Json::NUMBER },
+                    { "handle", json11::Json::NUMBER },
                     { "configuration", json11::Json::OBJECT } }, err)) {
             err = "malformed configuration request: " + err;
             return {};
         }
 
         Vamp::HostExt::ConfigurationRequest cr;
-        cr.plugin = pmapper.handleToPlugin(j["pluginHandle"].int_value());
+        cr.plugin = pmapper.handleToPlugin(j["handle"].int_value());
         cr.configuration = toPluginConfiguration(j["configuration"], err);
         if (failed(err)) return {};
         return cr;
@@ -898,7 +898,7 @@
 
         json11::Json::object jo;
 
-        jo["pluginHandle"] = pmapper.pluginToHandle(cr.plugin);
+        jo["handle"] = pmapper.pluginToHandle(cr.plugin);
         
         json11::Json::array outs;
         for (auto &d: cr.outputs) {
@@ -915,7 +915,7 @@
         
         Vamp::HostExt::ConfigurationResponse cr;
 
-        cr.plugin = pmapper.handleToPlugin(j["pluginHandle"].int_value());
+        cr.plugin = pmapper.handleToPlugin(j["handle"].int_value());
         
         if (!j["outputList"].is_array()) {
             err = "array expected for output list";
@@ -936,7 +936,7 @@
                        BufferSerialisation serialisation) {
 
         json11::Json::object jo;
-        jo["pluginHandle"] = pmapper.pluginToHandle(r.plugin);
+        jo["handle"] = pmapper.pluginToHandle(r.plugin);
 
         json11::Json::object io;
         io["timestamp"] = fromRealTime(r.timestamp);
@@ -963,7 +963,7 @@
                      BufferSerialisation &serialisation, std::string &err) {
 
         if (!j.has_shape({
-                    { "pluginHandle", json11::Json::NUMBER },
+                    { "handle", json11::Json::NUMBER },
                     { "processInput", json11::Json::OBJECT } }, err)) {
             err = "malformed process request: " + err;
             return {};
@@ -979,7 +979,7 @@
         }
 
         Vamp::HostExt::ProcessRequest r;
-        r.plugin = pmapper.handleToPlugin(j["pluginHandle"].int_value());
+        r.plugin = pmapper.handleToPlugin(j["handle"].int_value());
 
         r.timestamp = toRealTime(input["timestamp"], err);
         if (failed(err)) return {};
@@ -1009,163 +1009,16 @@
 
         return r;
     }
-
-    static json11::Json
-    fromVampRequest_List() {
-
-        json11::Json::object jo;
-        jo["type"] = "list";
-        return json11::Json(jo);
-    }
-
-    static json11::Json
-    fromVampResponse_List(const Vamp::HostExt::ListResponse &resp) {
-
-        json11::Json::object jo;
-        jo["type"] = "list";
-        jo["success"] = true;
-
-        json11::Json::array arr;
-        for (const auto &a: resp.plugins) {
-            arr.push_back(fromPluginStaticData(a));
-        }
-        json11::Json::object po;
-        po["plugins"] = arr;
-
-        jo["content"] = po;
-        return json11::Json(jo);
-    }
-    
-    static json11::Json
-    fromVampRequest_Load(const Vamp::HostExt::LoadRequest &req) {
-
-        json11::Json::object jo;
-        jo["type"] = "load";
-        jo["content"] = fromLoadRequest(req);
-        return json11::Json(jo);
-    }    
-
-    static json11::Json
-    fromVampResponse_Load(const Vamp::HostExt::LoadResponse &resp,
-                          const PluginHandleMapper &pmapper) {
-
-        json11::Json::object jo;
-        jo["type"] = "load";
-        jo["success"] = (resp.plugin != 0);
-        jo["errorText"] = "";
-        jo["content"] = fromLoadResponse(resp, pmapper);
-        return json11::Json(jo);
-    }
-
-    static json11::Json
-    fromVampRequest_Configure(const Vamp::HostExt::ConfigurationRequest &req,
-                              const PluginHandleMapper &pmapper) {
-
-        json11::Json::object jo;
-        jo["type"] = "configure";
-        jo["content"] = fromConfigurationRequest(req, pmapper);
-        return json11::Json(jo);
-    }    
-
-    static json11::Json
-    fromVampResponse_Configure(const Vamp::HostExt::ConfigurationResponse &resp,
-                               const PluginHandleMapper &pmapper) {
-        
-        json11::Json::object jo;
-        jo["type"] = "configure";
-        jo["success"] = (!resp.outputs.empty());
-        jo["errorText"] = "";
-        jo["content"] = fromConfigurationResponse(resp, pmapper);
-        return json11::Json(jo);
-    }
-    
-    static json11::Json
-    fromVampRequest_Process(const Vamp::HostExt::ProcessRequest &req,
-                            const PluginHandleMapper &pmapper,
-                            BufferSerialisation serialisation) {
-
-        json11::Json::object jo;
-        jo["type"] = "process";
-        jo["content"] = fromProcessRequest(req, pmapper, serialisation);
-        return json11::Json(jo);
-    }    
-
-    static json11::Json
-    fromVampResponse_Process(const Vamp::HostExt::ProcessResponse &resp,
-                             const PluginHandleMapper &pmapper,
-                             BufferSerialisation serialisation) {
-        
-        json11::Json::object jo;
-        jo["type"] = "process";
-        jo["success"] = true;
-        jo["errorText"] = "";
-        json11::Json::object po;
-        po["pluginHandle"] = pmapper.pluginToHandle(resp.plugin);
-        po["features"] = fromFeatureSet(resp.features,
-                                        *pmapper.pluginToOutputIdMapper(resp.plugin),
-                                        serialisation);
-        jo["content"] = po;
-        return json11::Json(jo);
-    }
-    
-    static json11::Json
-    fromVampRequest_Finish(const Vamp::HostExt::FinishRequest &req,
-                           const PluginHandleMapper &pmapper) {
-
-        json11::Json::object jo;
-        jo["type"] = "finish";
-        json11::Json::object fo;
-        fo["pluginHandle"] = pmapper.pluginToHandle(req.plugin);
-        jo["content"] = fo;
-        return json11::Json(jo);
-    }    
-    
-    static json11::Json
-    fromVampResponse_Finish(const Vamp::HostExt::ProcessResponse &resp,
-                            const PluginHandleMapper &pmapper,
-                            BufferSerialisation serialisation) {
-
-        json11::Json::object jo;
-        jo["type"] = "finish";
-        jo["success"] = true;
-        jo["errorText"] = "";
-        json11::Json::object po;
-        po["pluginHandle"] = pmapper.pluginToHandle(resp.plugin);
-        po["features"] = fromFeatureSet(resp.features,
-                                        *pmapper.pluginToOutputIdMapper(resp.plugin),
-                                        serialisation);
-        jo["content"] = po;
-        return json11::Json(jo);
-    }
-
-    static json11::Json
-    fromError(std::string errorText, RRType responseType) {
-
-        json11::Json::object jo;
-        std::string type;
-
-        if (responseType == RRType::List) type = "list";
-        else if (responseType == RRType::Load) type = "load";
-        else if (responseType == RRType::Configure) type = "configure";
-        else if (responseType == RRType::Process) type = "process";
-        else if (responseType == RRType::Finish) type = "finish";
-        else type = "invalid";
-
-        jo["type"] = type;
-        jo["success"] = false;
-        jo["errorText"] = std::string("error in ") + type + " request: " + errorText;
-        return json11::Json(jo);
-    }
     
 private: // go private briefly for a couple of helper functions
     
     static void
     checkTypeField(json11::Json j, std::string expected, std::string &err) {
-        if (!j["type"].is_string()) {
-            err = "string expected for type";
+        if (!j["method"].is_string()) {
+            err = "string expected for method";
             return;
         }
-        if (j["type"].string_value() != expected) {
+        if (j["method"].string_value() != expected) {
             err = "expected value \"" + expected + "\" for type";
             return;
         }
@@ -1180,16 +1033,199 @@
         return j["success"].bool_value();
     }
 
+    static void
+    markRPC(json11::Json::object &jo) {
+        jo["jsonrpc"] = "2.0";
+    }
+    
 public:
+
+    static json11::Json
+    fromRpcRequest_List() {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        jo["method"] = "list";
+        return json11::Json(jo);
+    }
+
+    static json11::Json
+    fromRpcResponse_List(const Vamp::HostExt::ListResponse &resp) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        json11::Json::array arr;
+        for (const auto &a: resp.plugins) {
+            arr.push_back(fromPluginStaticData(a));
+        }
+        json11::Json::object po;
+        po["available"] = arr;
+
+        jo["method"] = "list";
+        jo["result"] = po;
+        return json11::Json(jo);
+    }
+    
+    static json11::Json
+    fromRpcRequest_Load(const Vamp::HostExt::LoadRequest &req) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        jo["method"] = "load";
+        jo["params"] = fromLoadRequest(req);
+        return json11::Json(jo);
+    }    
+
+    static json11::Json
+    fromRpcResponse_Load(const Vamp::HostExt::LoadResponse &resp,
+                          const PluginHandleMapper &pmapper) {
+
+        if (resp.plugin) {
+
+            json11::Json::object jo;
+            markRPC(jo);
+
+            jo["method"] = "load";
+            jo["result"] = fromLoadResponse(resp, pmapper);
+            return json11::Json(jo);
+            
+        } else {
+            return fromError("Failed to load plugin", RRType::Load);
+        }
+    }
+
+    static json11::Json
+    fromRpcRequest_Configure(const Vamp::HostExt::ConfigurationRequest &req,
+                              const PluginHandleMapper &pmapper) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        jo["method"] = "configure";
+        jo["params"] = fromConfigurationRequest(req, pmapper);
+        return json11::Json(jo);
+    }    
+
+    static json11::Json
+    fromRpcResponse_Configure(const Vamp::HostExt::ConfigurationResponse &resp,
+                               const PluginHandleMapper &pmapper) {
+
+        if (!resp.outputs.empty()) {
+        
+            json11::Json::object jo;
+            markRPC(jo);
+
+            jo["method"] = "configure";
+            jo["result"] = fromConfigurationResponse(resp, pmapper);
+            return json11::Json(jo);
+
+        } else {
+            return fromError("Failed to configure plugin", RRType::Configure);
+        }
+    }
+    
+    static json11::Json
+    fromRpcRequest_Process(const Vamp::HostExt::ProcessRequest &req,
+                            const PluginHandleMapper &pmapper,
+                            BufferSerialisation serialisation) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        jo["method"] = "process";
+        jo["params"] = fromProcessRequest(req, pmapper, serialisation);
+        return json11::Json(jo);
+    }    
+
+    static json11::Json
+    fromRpcResponse_Process(const Vamp::HostExt::ProcessResponse &resp,
+                             const PluginHandleMapper &pmapper,
+                             BufferSerialisation serialisation) {
+        
+        json11::Json::object jo;
+        markRPC(jo);
+
+        json11::Json::object po;
+        po["handle"] = pmapper.pluginToHandle(resp.plugin);
+        po["features"] = fromFeatureSet(resp.features,
+                                        *pmapper.pluginToOutputIdMapper(resp.plugin),
+                                        serialisation);
+        jo["method"] = "process";
+        jo["result"] = po;
+        return json11::Json(jo);
+    }
+    
+    static json11::Json
+    fromRpcRequest_Finish(const Vamp::HostExt::FinishRequest &req,
+                           const PluginHandleMapper &pmapper) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        json11::Json::object fo;
+        fo["handle"] = pmapper.pluginToHandle(req.plugin);
+
+        jo["method"] = "finish";
+        jo["params"] = fo;
+        return json11::Json(jo);
+    }    
+    
+    static json11::Json
+    fromRpcResponse_Finish(const Vamp::HostExt::ProcessResponse &resp,
+                            const PluginHandleMapper &pmapper,
+                            BufferSerialisation serialisation) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        json11::Json::object po;
+        po["handle"] = pmapper.pluginToHandle(resp.plugin);
+        po["features"] = fromFeatureSet(resp.features,
+                                        *pmapper.pluginToOutputIdMapper(resp.plugin),
+                                        serialisation);
+        jo["method"] = "finish";
+        jo["result"] = po;
+        return json11::Json(jo);
+    }
+
+    static json11::Json
+    fromError(std::string errorText, RRType responseType) {
+
+        json11::Json::object jo;
+        markRPC(jo);
+
+        std::string type;
+
+        if (responseType == RRType::List) type = "list";
+        else if (responseType == RRType::Load) type = "load";
+        else if (responseType == RRType::Configure) type = "configure";
+        else if (responseType == RRType::Process) type = "process";
+        else if (responseType == RRType::Finish) type = "finish";
+        else type = "invalid";
+
+        json11::Json::object eo;
+        //!!! + need code
+        eo["message"] = 
+            std::string("error in ") + type + " request: " + errorText;
+
+        jo["method"] = type;
+        jo["error"] = eo;
+        
+        return json11::Json(jo);
+    }
+
     static RRType
     getRequestResponseType(json11::Json j, std::string &err) {
 
-        if (!j["type"].is_string()) {
-            err = "string expected for type";
+        if (!j["method"].is_string()) {
+            err = "string expected for method";
             return RRType::NotValid;
         }
         
-        std::string type = j["type"].string_value();
+        std::string type = j["method"].string_value();
 
 	if (type == "list") return RRType::List;
 	else if (type == "load") return RRType::Load;
@@ -1204,16 +1240,16 @@
     }
 
     static void
-    toVampRequest_List(json11::Json j, std::string &err) {
+    toRpcRequest_List(json11::Json j, std::string &err) {
         checkTypeField(j, "list", err);
     }
 
     static Vamp::HostExt::ListResponse
-    toVampResponse_List(json11::Json j, std::string &err) {
+    toRpcResponse_List(json11::Json j, std::string &err) {
 
         Vamp::HostExt::ListResponse resp;
         if (successful(j, err) && !failed(err)) {
-            for (const auto &a: j["content"]["plugins"].array_items()) {
+            for (const auto &a: j["result"]["available"].array_items()) {
                 resp.plugins.push_back(toPluginStaticData(a, err));
                 if (failed(err)) return {};
             }
@@ -1223,65 +1259,65 @@
     }
 
     static Vamp::HostExt::LoadRequest
-    toVampRequest_Load(json11::Json j, std::string &err) {
+    toRpcRequest_Load(json11::Json j, std::string &err) {
         
         checkTypeField(j, "load", err);
         if (failed(err)) return {};
-        return toLoadRequest(j["content"], err);
+        return toLoadRequest(j["params"], err);
     }
     
     static Vamp::HostExt::LoadResponse
-    toVampResponse_Load(json11::Json j,
+    toRpcResponse_Load(json11::Json j,
                         const PluginHandleMapper &pmapper,
                         std::string &err) {
         
         Vamp::HostExt::LoadResponse resp;
         if (successful(j, err) && !failed(err)) {
-            resp = toLoadResponse(j["content"], pmapper, err);
+            resp = toLoadResponse(j["result"], pmapper, err);
         }
         return resp;
     }
     
     static Vamp::HostExt::ConfigurationRequest
-    toVampRequest_Configure(json11::Json j,
+    toRpcRequest_Configure(json11::Json j,
                             const PluginHandleMapper &pmapper,
                             std::string &err) {
         
         checkTypeField(j, "configure", err);
         if (failed(err)) return {};
-        return toConfigurationRequest(j["content"], pmapper, err);
+        return toConfigurationRequest(j["params"], pmapper, err);
     }
     
     static Vamp::HostExt::ConfigurationResponse
-    toVampResponse_Configure(json11::Json j,
+    toRpcResponse_Configure(json11::Json j,
                              const PluginHandleMapper &pmapper,
                              std::string &err) {
         
         Vamp::HostExt::ConfigurationResponse resp;
         if (successful(j, err) && !failed(err)) {
-            resp = toConfigurationResponse(j["content"], pmapper, err);
+            resp = toConfigurationResponse(j["result"], pmapper, err);
         }
         return resp;
     }
     
     static Vamp::HostExt::ProcessRequest
-    toVampRequest_Process(json11::Json j, const PluginHandleMapper &pmapper,
+    toRpcRequest_Process(json11::Json j, const PluginHandleMapper &pmapper,
                           BufferSerialisation &serialisation, std::string &err) {
         
         checkTypeField(j, "process", err);
         if (failed(err)) return {};
-        return toProcessRequest(j["content"], pmapper, serialisation, err);
+        return toProcessRequest(j["params"], pmapper, serialisation, err);
     }
     
     static Vamp::HostExt::ProcessResponse
-    toVampResponse_Process(json11::Json j,
+    toRpcResponse_Process(json11::Json j,
                            const PluginHandleMapper &pmapper,
                            BufferSerialisation &serialisation, std::string &err) {
         
         Vamp::HostExt::ProcessResponse resp;
         if (successful(j, err) && !failed(err)) {
-            auto jc = j["content"];
-            auto h = jc["pluginHandle"].int_value();
+            auto jc = j["result"];
+            auto h = jc["handle"].int_value();
             resp.plugin = pmapper.handleToPlugin(h);
             resp.features = toFeatureSet(jc["features"],
                                          *pmapper.handleToOutputIdMapper(h),
@@ -1291,26 +1327,26 @@
     }
     
     static Vamp::HostExt::FinishRequest
-    toVampRequest_Finish(json11::Json j, const PluginHandleMapper &pmapper,
+    toRpcRequest_Finish(json11::Json j, const PluginHandleMapper &pmapper,
                          std::string &err) {
         
         checkTypeField(j, "finish", err);
         if (failed(err)) return {};
         Vamp::HostExt::FinishRequest req;
         req.plugin = pmapper.handleToPlugin
-            (j["content"]["pluginHandle"].int_value());
+            (j["params"]["handle"].int_value());
         return req;
     }
     
     static Vamp::HostExt::ProcessResponse
-    toVampResponse_Finish(json11::Json j,
+    toRpcResponse_Finish(json11::Json j,
                           const PluginHandleMapper &pmapper,
                           BufferSerialisation &serialisation, std::string &err) {
         
         Vamp::HostExt::ProcessResponse resp;
         if (successful(j, err) && !failed(err)) {
-            auto jc = j["content"];
-            auto h = jc["pluginHandle"].int_value();
+            auto jc = j["result"];
+            auto h = jc["handle"].int_value();
             resp.plugin = pmapper.handleToPlugin(h);
             resp.features = toFeatureSet(jc["features"],
                                          *pmapper.handleToOutputIdMapper(h),
--- a/test/test-vampipe-server.sh	Tue Sep 27 15:04:59 2016 +0100
+++ b/test/test-vampipe-server.sh	Thu Oct 06 14:33:12 2016 +0100
@@ -19,28 +19,13 @@
 validate_request() {
     local json="$1"
     echo "$json" > "$reqfile"
-    validate "$reqfile" "request"
-    type=$(grep '"type":' "$reqfile" | sed 's/^.*"type": *"\([^"]*\)".*$/\1/')
-    if [ "$type" == "configure" ]; then type=configuration; fi
-    if [ "$type" != "list" ]; then
-        echo "$json" | 
-            sed 's/^.*"content"://' |
-            sed 's/}}$/}/' > "$reqfile"
-        validate "$reqfile" "${type}request"
-    fi
+    validate "$reqfile" "rpcrequest"
 }
 
 validate_response() {
     local json="$1"
     echo "$json" > "$respfile"
-    validate "$respfile" "response"
-    type=$(grep '"type":' "$respfile" | sed 's/^.*"type": "\([^"]*\)".*$/\1/')
-    if [ "$type" == "configure" ]; then type=configuration; fi
-    echo "$json" | 
-        sed 's/^.*"content"://' |
-        sed 's/, "error.*$//' |
-        sed 's/, "success.*$//' > "$respfile"
-    validate "$respfile" "${type}response"
+    validate "$respfile" "rpcresponse"
 }
 
 ( while read request ; do
@@ -54,9 +39,9 @@
           validate_response "$response"
       done
 ) <<EOF
-{"type":"list"}
-{"type":"load","content": {"pluginKey":"vamp-example-plugins:percussiononsets","inputSampleRate":44100,"adapterFlags":["AdaptInputDomain","AdaptBufferSize"]}}
-{"type":"configure","content":{"pluginHandle":1,"configuration":{"blockSize": 8, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}, "stepSize": 8}}}
-{"type":"process","content": {"pluginHandle": 1, "processInput": { "timestamp": {"s": 0, "n": 0}, "inputBuffers": [ [1,2,3,4,5,6,7,8] ]}}}
-{"type":"finish","content": {"pluginHandle": 1}}
+{"method":"list"}
+{"method":"load","params": {"key":"vamp-example-plugins:percussiononsets","inputSampleRate":44100,"adapterFlags":["AdaptInputDomain","AdaptBufferSize"]}}
+{"method":"configure","params":{"handle":1,"configuration":{"blockSize": 8, "channelCount": 1, "parameterValues": {"sensitivity": 40, "threshold": 3}, "stepSize": 8}}}
+{"method":"process","params": {"handle": 1, "processInput": { "timestamp": {"s": 0, "n": 0}, "inputBuffers": [ [1,2,3,4,5,6,7,8] ]}}}
+{"method":"finish","params": {"handle": 1}}
 EOF
--- a/utilities/vampipe-convert.cpp	Tue Sep 27 15:04:59 2016 +0100
+++ b/utilities/vampipe-convert.cpp	Thu Oct 06 14:33:12 2016 +0100
@@ -46,10 +46,10 @@
     }
     if (!j.is_object()) {
 	err = "object expected at top level";
-    } else if (!j["type"].is_string()) {
-	err = "string expected for type field";
-    } else if (!j["content"].is_null() && !j["content"].is_object()) {
-	err = "object expected for content field";
+    } else if (!j["method"].is_string()) {
+	err = "string expected for method field";
+    } else if (!j["params"].is_null() && !j["params"].is_object()) {
+	err = "object expected for params field";
     }
     return j;
 }
@@ -64,10 +64,12 @@
     }
     if (!j.is_object()) {
 	err = "object expected at top level";
-    } else if (!j["success"].is_bool()) {
-	err = "bool expected for success field";
-    } else if (!j["content"].is_object()) {
-	err = "object expected for content field";
+    } else {
+        if (!j["result"].is_object()) {
+            if (!j["error"].is_object()) {
+                err = "expected either result or error object";
+            }
+        }
     }
     return j;
 }
@@ -102,19 +104,19 @@
     switch (rr.type) {
 
     case RRType::List:
-	VampJson::toVampRequest_List(j, err); // type check only
+	VampJson::toRpcRequest_List(j, err); // type check only
 	break;
     case RRType::Load:
-	rr.loadRequest = VampJson::toVampRequest_Load(j, err);
+	rr.loadRequest = VampJson::toRpcRequest_Load(j, err);
 	break;
     case RRType::Configure:
-	rr.configurationRequest = VampJson::toVampRequest_Configure(j, mapper, err);
+	rr.configurationRequest = VampJson::toRpcRequest_Configure(j, mapper, err);
 	break;
     case RRType::Process:
-	rr.processRequest = VampJson::toVampRequest_Process(j, mapper, serialisation, err);
+	rr.processRequest = VampJson::toRpcRequest_Process(j, mapper, serialisation, err);
 	break;
     case RRType::Finish:
-	rr.finishRequest = VampJson::toVampRequest_Finish(j, mapper, err);
+	rr.finishRequest = VampJson::toRpcRequest_Finish(j, mapper, err);
 	break;
     case RRType::NotValid:
 	break;
@@ -136,20 +138,20 @@
     switch (rr.type) {
 
     case RRType::List:
-	j = VampJson::fromVampRequest_List();
+	j = VampJson::fromRpcRequest_List();
 	break;
     case RRType::Load:
-	j = VampJson::fromVampRequest_Load(rr.loadRequest);
+	j = VampJson::fromRpcRequest_Load(rr.loadRequest);
 	break;
     case RRType::Configure:
-	j = VampJson::fromVampRequest_Configure(rr.configurationRequest, mapper);
+	j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper);
 	break;
     case RRType::Process:
-	j = VampJson::fromVampRequest_Process
+	j = VampJson::fromRpcRequest_Process
 	    (rr.processRequest, mapper, serialisation);
 	break;
     case RRType::Finish:
-	j = VampJson::fromVampRequest_Finish(rr.finishRequest, mapper);
+	j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper);
 	break;
     case RRType::NotValid:
 	break;
@@ -186,19 +188,19 @@
     switch (rr.type) {
 
     case RRType::List:
-	rr.listResponse = VampJson::toVampResponse_List(j, err);
+	rr.listResponse = VampJson::toRpcResponse_List(j, err);
 	break;
     case RRType::Load:
-	rr.loadResponse = VampJson::toVampResponse_Load(j, mapper, err);
+	rr.loadResponse = VampJson::toRpcResponse_Load(j, mapper, err);
 	break;
     case RRType::Configure:
-	rr.configurationResponse = VampJson::toVampResponse_Configure(j, mapper, err);
+	rr.configurationResponse = VampJson::toRpcResponse_Configure(j, mapper, err);
 	break;
     case RRType::Process: 
-	rr.processResponse = VampJson::toVampResponse_Process(j, mapper, serialisation, err);
+	rr.processResponse = VampJson::toRpcResponse_Process(j, mapper, serialisation, err);
 	break;
     case RRType::Finish:
-	rr.finishResponse = VampJson::toVampResponse_Finish(j, mapper, serialisation, err);
+	rr.finishResponse = VampJson::toRpcResponse_Finish(j, mapper, serialisation, err);
 	break;
     case RRType::NotValid:
 	break;
@@ -226,21 +228,21 @@
 	switch (rr.type) {
 
 	case RRType::List:
-	    j = VampJson::fromVampResponse_List(rr.listResponse);
+	    j = VampJson::fromRpcResponse_List(rr.listResponse);
 	    break;
 	case RRType::Load:
-	    j = VampJson::fromVampResponse_Load(rr.loadResponse, mapper);
+	    j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper);
 	    break;
 	case RRType::Configure:
-	    j = VampJson::fromVampResponse_Configure(rr.configurationResponse,
+	    j = VampJson::fromRpcResponse_Configure(rr.configurationResponse,
                                                      mapper);
 	    break;
 	case RRType::Process:
-	    j = VampJson::fromVampResponse_Process
+	    j = VampJson::fromRpcResponse_Process
 		(rr.processResponse, mapper, serialisation);
 	    break;
 	case RRType::Finish:
-	    j = VampJson::fromVampResponse_Finish
+	    j = VampJson::fromRpcResponse_Finish
 		(rr.finishResponse, mapper, serialisation);
 	    break;
 	case RRType::NotValid:
@@ -258,27 +260,27 @@
     rr.direction = RequestOrResponse::Request;
 
     ::capnp::InputStreamMessageReader message(buffered);
-    VampRequest::Reader reader = message.getRoot<VampRequest>();
+    RpcRequest::Reader reader = message.getRoot<RpcRequest>();
     
     rr.type = VampnProto::getRequestResponseType(reader);
 
     switch (rr.type) {
 
     case RRType::List:
-	VampnProto::readVampRequest_List(reader); // type check only
+	VampnProto::readRpcRequest_List(reader); // type check only
 	break;
     case RRType::Load:
-	VampnProto::readVampRequest_Load(rr.loadRequest, reader);
+	VampnProto::readRpcRequest_Load(rr.loadRequest, reader);
 	break;
     case RRType::Configure:
-	VampnProto::readVampRequest_Configure(rr.configurationRequest,
+	VampnProto::readRpcRequest_Configure(rr.configurationRequest,
 					      reader, mapper);
 	break;
     case RRType::Process:
-	VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper);
+	VampnProto::readRpcRequest_Process(rr.processRequest, reader, mapper);
 	break;
     case RRType::Finish:
-	VampnProto::readVampRequest_Finish(rr.finishRequest, reader, mapper);
+	VampnProto::readRpcRequest_Finish(rr.finishRequest, reader, mapper);
 	break;
     case RRType::NotValid:
 	break;
@@ -291,25 +293,25 @@
 writeRequestCapnp(RequestOrResponse &rr)
 {
     ::capnp::MallocMessageBuilder message;
-    VampRequest::Builder builder = message.initRoot<VampRequest>();
+    RpcRequest::Builder builder = message.initRoot<RpcRequest>();
 
     switch (rr.type) {
 
     case RRType::List:
-	VampnProto::buildVampRequest_List(builder);
+	VampnProto::buildRpcRequest_List(builder);
 	break;
     case RRType::Load:
-	VampnProto::buildVampRequest_Load(builder, rr.loadRequest);
+	VampnProto::buildRpcRequest_Load(builder, rr.loadRequest);
 	break;
     case RRType::Configure:
-	VampnProto::buildVampRequest_Configure(builder,
-					       rr.configurationRequest, mapper);
+	VampnProto::buildRpcRequest_Configure(builder,
+                                              rr.configurationRequest, mapper);
 	break;
     case RRType::Process:
-	VampnProto::buildVampRequest_Process(builder, rr.processRequest, mapper);
+	VampnProto::buildRpcRequest_Process(builder, rr.processRequest, mapper);
 	break;
     case RRType::Finish:
-	VampnProto::buildVampRequest_Finish(builder, rr.finishRequest, mapper);
+	VampnProto::buildRpcRequest_Finish(builder, rr.finishRequest, mapper);
 	break;
     case RRType::NotValid:
 	break;
@@ -325,31 +327,35 @@
     rr.direction = RequestOrResponse::Response;
 
     ::capnp::InputStreamMessageReader message(buffered);
-    VampResponse::Reader reader = message.getRoot<VampResponse>();
+    RpcResponse::Reader reader = message.getRoot<RpcResponse>();
     
     rr.type = VampnProto::getRequestResponseType(reader);
-    rr.success = reader.getSuccess();
-    rr.errorText = reader.getErrorText();
+    rr.success = true;
+    rr.errorText = "";
+    int errorCode = 0;
 
     switch (rr.type) {
 
     case RRType::List:
-	VampnProto::readVampResponse_List(rr.listResponse, reader);
+	VampnProto::readRpcResponse_List(rr.listResponse, reader);
 	break;
     case RRType::Load:
-	VampnProto::readVampResponse_Load(rr.loadResponse, reader, mapper);
+	VampnProto::readRpcResponse_Load(rr.loadResponse, reader, mapper);
 	break;
     case RRType::Configure:
-	VampnProto::readVampResponse_Configure(rr.configurationResponse,
+	VampnProto::readRpcResponse_Configure(rr.configurationResponse,
 					       reader, mapper);
 	break;
     case RRType::Process:
-	VampnProto::readVampResponse_Process(rr.processResponse, reader, mapper);
+	VampnProto::readRpcResponse_Process(rr.processResponse, reader, mapper);
 	break;
     case RRType::Finish:
-	VampnProto::readVampResponse_Finish(rr.finishResponse, reader, mapper);
+	VampnProto::readRpcResponse_Finish(rr.finishResponse, reader, mapper);
 	break;
     case RRType::NotValid:
+        // error
+        rr.success = false;
+        VampnProto::readRpcResponse_Error(errorCode, rr.errorText, reader);
 	break;
     }
 
@@ -360,30 +366,30 @@
 writeResponseCapnp(RequestOrResponse &rr)
 {
     ::capnp::MallocMessageBuilder message;
-    VampResponse::Builder builder = message.initRoot<VampResponse>();
+    RpcResponse::Builder builder = message.initRoot<RpcResponse>();
 
     if (!rr.success) {
 
-	VampnProto::buildVampResponse_Error(builder, rr.errorText, rr.type);
+	VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type);
 
     } else {
 	
 	switch (rr.type) {
 
 	case RRType::List:
-	    VampnProto::buildVampResponse_List(builder, rr.listResponse);
+	    VampnProto::buildRpcResponse_List(builder, rr.listResponse);
 	    break;
 	case RRType::Load:
-	    VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper);
+	    VampnProto::buildRpcResponse_Load(builder, rr.loadResponse, mapper);
 	    break;
 	case RRType::Configure:
-	    VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse, mapper);
+	    VampnProto::buildRpcResponse_Configure(builder, rr.configurationResponse, mapper);
 	    break;
 	case RRType::Process:
-	    VampnProto::buildVampResponse_Process(builder, rr.processResponse, mapper);
+	    VampnProto::buildRpcResponse_Process(builder, rr.processResponse, mapper);
 	    break;
 	case RRType::Finish:
-	    VampnProto::buildVampResponse_Finish(builder, rr.finishResponse, mapper);
+	    VampnProto::buildRpcResponse_Finish(builder, rr.finishResponse, mapper);
 	    break;
 	case RRType::NotValid:
 	    break;
--- a/utilities/vampipe-server.cpp	Tue Sep 27 15:04:59 2016 +0100
+++ b/utilities/vampipe-server.cpp	Thu Oct 06 14:33:12 2016 +0100
@@ -45,27 +45,27 @@
     }
 
     ::capnp::InputStreamMessageReader message(buffered);
-    VampRequest::Reader reader = message.getRoot<VampRequest>();
+    RpcRequest::Reader reader = message.getRoot<RpcRequest>();
     
     rr.type = VampnProto::getRequestResponseType(reader);
 
     switch (rr.type) {
 
     case RRType::List:
-	VampnProto::readVampRequest_List(reader); // type check only
+	VampnProto::readRpcRequest_List(reader); // type check only
 	break;
     case RRType::Load:
-	VampnProto::readVampRequest_Load(rr.loadRequest, reader);
+	VampnProto::readRpcRequest_Load(rr.loadRequest, reader);
 	break;
     case RRType::Configure:
-	VampnProto::readVampRequest_Configure(rr.configurationRequest,
+	VampnProto::readRpcRequest_Configure(rr.configurationRequest,
 					      reader, mapper);
 	break;
     case RRType::Process:
-	VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper);
+	VampnProto::readRpcRequest_Process(rr.processRequest, reader, mapper);
 	break;
     case RRType::Finish:
-	VampnProto::readVampRequest_Finish(rr.finishRequest, reader, mapper);
+	VampnProto::readRpcRequest_Finish(rr.finishRequest, reader, mapper);
 	break;
     case RRType::NotValid:
 	break;
@@ -78,30 +78,30 @@
 writeResponseCapnp(RequestOrResponse &rr)
 {
     ::capnp::MallocMessageBuilder message;
-    VampResponse::Builder builder = message.initRoot<VampResponse>();
+    RpcResponse::Builder builder = message.initRoot<RpcResponse>();
 
     if (!rr.success) {
 
-	VampnProto::buildVampResponse_Error(builder, rr.errorText, rr.type);
+	VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type);
 
     } else {
 	
 	switch (rr.type) {
 
 	case RRType::List:
-	    VampnProto::buildVampResponse_List(builder, rr.listResponse);
+	    VampnProto::buildRpcResponse_List(builder, rr.listResponse);
 	    break;
 	case RRType::Load:
-	    VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper);
+	    VampnProto::buildRpcResponse_Load(builder, rr.loadResponse, mapper);
 	    break;
 	case RRType::Configure:
-	    VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse, mapper);
+	    VampnProto::buildRpcResponse_Configure(builder, rr.configurationResponse, mapper);
 	    break;
 	case RRType::Process:
-	    VampnProto::buildVampResponse_Process(builder, rr.processResponse, mapper);
+	    VampnProto::buildRpcResponse_Process(builder, rr.processResponse, mapper);
 	    break;
 	case RRType::Finish:
-	    VampnProto::buildVampResponse_Finish(builder, rr.finishResponse, mapper);
+	    VampnProto::buildRpcResponse_Finish(builder, rr.finishResponse, mapper);
 	    break;
 	case RRType::NotValid:
 	    break;
@@ -115,8 +115,8 @@
 writeExceptionCapnp(const std::exception &e, RRType type)
 {
     ::capnp::MallocMessageBuilder message;
-    VampResponse::Builder builder = message.initRoot<VampResponse>();
-    VampnProto::buildVampResponse_Exception(builder, e, type);
+    RpcResponse::Builder builder = message.initRoot<RpcResponse>();
+    VampnProto::buildRpcResponse_Exception(builder, e, type);
     
     writeMessageToFd(1, message);
 }