changeset 27:cc85c2851605

Wire up Cap'n Proto reading, plus some build and arg processing fixes
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 24 May 2016 12:00:38 +0100
parents 13393bdfc7ef
children b5005ebc5116
files Makefile capnproto/VampnProto.h utilities/vampipe-convert.cpp
diffstat 3 files changed, 257 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Tue May 24 11:07:59 2016 +0100
+++ b/Makefile	Tue May 24 12:00:38 2016 +0100
@@ -1,29 +1,35 @@
 
-CXXFLAGS	:= -Wall -Werror -std=c++11
+CXXFLAGS	:= -Wall -Werror -O3 -std=c++11
 INCFLAGS	:= -Ivamp-plugin-sdk -Ijson -Icapnproto -I.
 LDFLAGS		:= -Lvamp-plugin-sdk -Wl,-Bstatic -lvamp-hostsdk -Wl,-Bdynamic -lcapnp -lkj -ldl
 
 all:	bin/vamp-json-cli bin/vamp-json-to-capnp bin/vampipe-convert
 
-bin/vampipe-convert: utilities/vampipe-convert.o json/json11/json11.o
+bin/vampipe-convert: o/vampipe-convert.o o/json11.o o/vamp.capnp.o
 	c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
 
-bin/vamp-json-to-capnp:	utilities/json-to-capnp.o json/json11/json11.o
+bin/vamp-json-to-capnp:	o/json-to-capnp.o o/json11.o
 	c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
 
-bin/vamp-json-cli:	utilities/json-cli.o json/json11/json11.o
+bin/vamp-json-cli:	o/json-cli.o o/json11.o
 	c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
 
 capnproto/vamp.capnp.h:	capnproto/vamp.capnp
 	capnp compile $< -oc++
 
-utilities/vampipe-convert.o:	utilities/vampipe-convert.cpp capnproto/vamp.capnp.h capnproto/VampnProto.h json/VampJson.h
+o/vamp.capnp.o:	capnproto/vamp.capnp.c++ capnproto/vamp.capnp.h
+	c++ $(CXXFLAGS) -c $< -o $@
+
+o/json11.o:	json/json11/json11.cpp
+	c++ $(CXXFLAGS) -c $< -o $@
+
+o/vampipe-convert.o:	utilities/vampipe-convert.cpp capnproto/vamp.capnp.h capnproto/VampnProto.h json/VampJson.h
 	c++ $(CXXFLAGS) $(INCFLAGS) -c $< -o $@
 
-utilities/json-to-capnp.o:	utilities/json-to-capnp.cpp capnproto/vamp.capnp.h capnproto/VampnProto.h json/VampJson.h
+o/json-to-capnp.o:	utilities/json-to-capnp.cpp capnproto/vamp.capnp.h capnproto/VampnProto.h json/VampJson.h
 	c++ $(CXXFLAGS) $(INCFLAGS) -c $< -o $@
 
-utilities/json-cli.o:	utilities/json-cli.cpp json/VampJson.h
+o/json-cli.o:	utilities/json-cli.cpp json/VampJson.h
 	c++ $(CXXFLAGS) $(INCFLAGS) -c $< -o $@
 
 test:	all
@@ -31,7 +37,7 @@
 	VAMP_PATH=./vamp-plugin-sdk/examples test/test-json-to-capnp.sh
 
 clean:
-	rm -f */*.o capnp/vamp.capnp.h capnp/vamp.capnp.c++
+	rm -f */*.o capnproto/vamp.capnp.h capnproto/vamp.capnp.c++
 
 distclean:	clean
 	rm -f bin/*
--- a/capnproto/VampnProto.h	Tue May 24 11:07:59 2016 +0100
+++ b/capnproto/VampnProto.h	Tue May 24 12:00:38 2016 +0100
@@ -748,6 +748,7 @@
         case VampRequest::Request::Which::FINISH:
             return RRType::Finish;
         }
+        return RRType::NotValid;
     }
 
     static RRType
@@ -764,12 +765,13 @@
         case VampResponse::Response::Which::FINISH:
             return RRType::Finish;
         }
+        return RRType::NotValid;
     }
     
     static void
     readVampRequest_List(const VampRequest::Reader &r) {
         if (getRequestResponseType(r) != RRType::List) {
-            throw std::runtime_error("not a list request");
+            throw std::logic_error("not a list request");
         }
     }
 
@@ -777,7 +779,7 @@
     readVampResponse_List(std::vector<Vamp::HostExt::PluginStaticData> &v,
                           const VampResponse::Reader &r) {
         if (getRequestResponseType(r) != RRType::List) {
-            throw std::runtime_error("not a list response");
+            throw std::logic_error("not a list response");
         }
         v.clear();
         if (r.getSuccess()) {
@@ -789,6 +791,94 @@
         }
     }
     
+    static void
+    readVampRequest_Load(Vamp::HostExt::LoadRequest &req,
+                         const VampRequest::Reader &r) {
+        if (getRequestResponseType(r) != RRType::Load) {
+            throw std::logic_error("not a load request");
+        }
+        readLoadRequest(req, r.getRequest().getLoad());
+    }
+
+    static void
+    readVampResponse_Load(Vamp::HostExt::LoadResponse &resp,
+                          const VampResponse::Reader &r,
+                          PluginHandleMapper &mapper) {
+        if (getRequestResponseType(r) != RRType::Load) {
+            throw std::logic_error("not a load response");
+        }
+        resp = {};
+        if (r.getSuccess()) {
+            readLoadResponse(resp, r.getResponse().getLoad(), mapper);
+        }
+    }
+    
+    static void
+    readVampRequest_Configure(Vamp::HostExt::ConfigurationRequest &req,
+                              const VampRequest::Reader &r,
+                              PluginHandleMapper &mapper) {
+        if (getRequestResponseType(r) != RRType::Configure) {
+            throw std::logic_error("not a configuration request");
+        }
+        readConfigurationRequest(req, r.getRequest().getConfigure(), mapper);
+    }
+
+    static void
+    readVampResponse_Configure(Vamp::HostExt::ConfigurationResponse &resp,
+                               const VampResponse::Reader &r) {
+        if (getRequestResponseType(r) != RRType::Configure) {
+            throw std::logic_error("not a configuration response");
+        }
+        resp = {};
+        if (r.getSuccess()) {
+            readConfigurationResponse(resp, r.getResponse().getConfigure());
+        }
+    }
+    
+    static void
+    readVampRequest_Process(Vamp::HostExt::ProcessRequest &req,
+                            const VampRequest::Reader &r,
+                            PluginHandleMapper &mapper) {
+        if (getRequestResponseType(r) != RRType::Process) {
+            throw std::logic_error("not a process request");
+        }
+        readProcessRequest(req, r.getRequest().getProcess(), mapper);
+    }
+
+    static void
+    readVampResponse_Process(Vamp::HostExt::ProcessResponse &resp,
+                             const VampResponse::Reader &r) {
+        if (getRequestResponseType(r) != RRType::Process) {
+            throw std::logic_error("not a process response");
+        }
+        resp = {};
+        if (r.getSuccess()) {
+            readProcessResponse(resp, r.getResponse().getProcess());
+        }
+    }
+    
+    static void
+    readVampRequest_Finish(Vamp::Plugin *&finishPlugin,
+                           const VampRequest::Reader &r,
+                           PluginHandleMapper &mapper) {
+        if (getRequestResponseType(r) != RRType::Finish) {
+            throw std::logic_error("not a finish request");
+        }
+        finishPlugin = mapper.handleToPlugin
+            (r.getRequest().getFinish().getPluginHandle());
+    }
+
+    static void
+    readVampResponse_Finish(Vamp::HostExt::ProcessResponse &resp,
+                            const VampResponse::Reader &r) {
+        if (getRequestResponseType(r) != RRType::Finish) {
+            throw std::logic_error("not a finish response");
+        }
+        resp = {};
+        if (r.getSuccess()) {
+            readProcessResponse(resp, r.getResponse().getFinish());
+        }
+    }
 };
 
 }
--- a/utilities/vampipe-convert.cpp	Tue May 24 11:07:59 2016 +0100
+++ b/utilities/vampipe-convert.cpp	Tue May 24 12:00:38 2016 +0100
@@ -140,19 +140,29 @@
     }
     
     Json j = convertRequestJson(input);
+
     rr.type = VampJson::getRequestResponseType(j);
 
-    if (rr.type == RRType::Load) {
+    switch (rr.type) {
+
+    case RRType::List:
+	VampJson::toVampRequest_List(j); // type check only
+	break;
+    case RRType::Load:
 	rr.loadRequest = VampJson::toVampRequest_Load(j);
-
-    } else if (rr.type == RRType::Configure) {
-	rr.configurationRequest = VampJson::toVampRequest_Configure(j, rr.mapper);
-
-    } else if (rr.type == RRType::Process) {
+	break;
+    case RRType::Configure:
+	rr.configurationRequest =
+	    VampJson::toVampRequest_Configure(j, rr.mapper);
+	break;
+    case RRType::Process:
 	rr.processRequest = VampJson::toVampRequest_Process(j, rr.mapper);
-
-    } else if (rr.type == RRType::Finish) {
+	break;
+    case RRType::Finish:
 	rr.finishPlugin = VampJson::toVampRequest_Finish(j, rr.mapper);
+	break;
+    case RRType::NotValid:
+	break;
     }
 
     return rr;
@@ -163,20 +173,26 @@
 {
     Json j;
 
-    if (rr.type == RRType::List) {
+    switch (rr.type) {
+
+    case RRType::List:
 	j = VampJson::fromVampRequest_List();
-	
-    } else if (rr.type == RRType::Load) {
+	break;
+    case RRType::Load:
 	j = VampJson::fromVampRequest_Load(rr.loadRequest);
-	
-    } else if (rr.type == RRType::Configure) {
-	j = VampJson::fromVampRequest_Configure(rr.configurationRequest, rr.mapper);
-	
-    } else if (rr.type == RRType::Process) {
+	break;
+    case RRType::Configure:
+	j = VampJson::fromVampRequest_Configure(rr.configurationRequest,
+						rr.mapper);
+	break;
+    case RRType::Process:
 	j = VampJson::fromVampRequest_Process(rr.processRequest, rr.mapper);
-	
-    } else if (rr.type == RRType::Finish) {
+	break;
+    case RRType::Finish:
 	j = VampJson::fromVampRequest_Finish(rr.finishPlugin, rr.mapper);
+	break;
+    case RRType::NotValid:
+	break;
     }
 
     cout << j.dump() << endl;
@@ -195,22 +211,28 @@
     }
 
     Json j = convertResponseJson(input);
+
     rr.type = VampJson::getRequestResponseType(j);
 
-    if (rr.type == RRType::List) {
+    switch (rr.type) {
+
+    case RRType::List:
 	rr.listResponse = VampJson::toVampResponse_List(j);
-	
-    } else if (rr.type == RRType::Load) {
+	break;
+    case RRType::Load:
 	rr.loadResponse = VampJson::toVampResponse_Load(j, rr.mapper);
-
-    } else if (rr.type == RRType::Configure) {
+	break;
+    case RRType::Configure:
 	rr.configurationResponse = VampJson::toVampResponse_Configure(j);
-
-    } else if (rr.type == RRType::Process) {
+	break;
+    case RRType::Process: 
 	rr.processResponse = VampJson::toVampResponse_Process(j);
-
-    } else if (rr.type == RRType::Finish) {
+	break;
+    case RRType::Finish:
 	rr.finishResponse = VampJson::toVampResponse_Finish(j);
+	break;
+    case RRType::NotValid:
+	break;
     }
 
     return rr;
@@ -221,16 +243,102 @@
 {
     Json j;
 
-    if (rr.type == RRType::List) {
+    switch (rr.type) {
+
+    case RRType::List:
 	j = VampJson::fromVampResponse_List("", rr.listResponse);
-	
-    } else if (rr.type == RRType::Load) {
+	break;
+    case RRType::Load:
 	j = VampJson::fromVampResponse_Load(rr.loadResponse, rr.mapper);
+	break;
+    case RRType::Configure:
+	j = VampJson::fromVampResponse_Configure(rr.configurationResponse);
+	break;
+    case RRType::Process:
+	j = VampJson::fromVampResponse_Process(rr.processResponse);
+	break;
+    case RRType::Finish:
+	j = VampJson::fromVampResponse_Finish(rr.finishResponse);
+	break;
+    case RRType::NotValid:
+	break;
     }
 
-    //!!!
+    cout << j.dump() << endl;
+}
 
-    cout << j.dump() << endl;
+RequestOrResponse
+readRequestCapnp()
+{
+    RequestOrResponse rr;
+    rr.direction = RequestOrResponse::Request;
+
+    ::capnp::PackedFdMessageReader message(0); // stdin
+    VampRequest::Reader reader = message.getRoot<VampRequest>();
+    
+    rr.type = VampnProto::getRequestResponseType(reader);
+
+    switch (rr.type) {
+
+    case RRType::List:
+	VampnProto::readVampRequest_List(reader); // type check only
+	break;
+    case RRType::Load:
+	VampnProto::readVampRequest_Load(rr.loadRequest, reader);
+	break;
+    case RRType::Configure:
+	VampnProto::readVampRequest_Configure(rr.configurationRequest, reader,
+					      rr.mapper);
+	break;
+    case RRType::Process:
+	VampnProto::readVampRequest_Process(rr.processRequest, reader,
+					    rr.mapper);
+	break;
+    case RRType::Finish:
+	VampnProto::readVampRequest_Finish(rr.finishPlugin, reader,
+					   rr.mapper);
+	break;
+    case RRType::NotValid:
+	break;
+    }
+
+    return rr;
+}
+
+RequestOrResponse
+readResponseCapnp()
+{
+    RequestOrResponse rr;
+    rr.direction = RequestOrResponse::Response;
+
+    ::capnp::PackedFdMessageReader message(0); // stdin
+    VampResponse::Reader reader = message.getRoot<VampResponse>();
+    
+    rr.type = VampnProto::getRequestResponseType(reader);
+
+    switch (rr.type) {
+
+    case RRType::List:
+	VampnProto::readVampResponse_List(rr.listResponse, reader);
+	break;
+    case RRType::Load:
+	VampnProto::readVampResponse_Load(rr.loadResponse, reader, rr.mapper);
+	break;
+    case RRType::Configure:
+	VampnProto::readVampResponse_Configure(rr.configurationResponse,
+					       reader);
+	break;
+    case RRType::Process:
+	VampnProto::readVampResponse_Process(rr.processResponse, reader);
+	break;
+    case RRType::Finish:
+	VampnProto::readVampResponse_Finish(rr.finishResponse, reader);
+	break;
+    case RRType::NotValid:
+	break;
+    }
+
+    return rr;
 }
 
 RequestOrResponse
@@ -242,8 +350,14 @@
 	} else {
 	    return readResponseJson();
 	}
+    } else if (format == "capnp") {
+	if (direction == RequestOrResponse::Request) {
+	    return readRequestCapnp();
+	} else {
+	    return readResponseCapnp();
+	}
     } else {
-	throw runtime_error("unknown or unimplemented format \"" + format + "\"");
+	throw runtime_error("unknown input format \"" + format + "\"");
     }
 }
 
@@ -257,7 +371,7 @@
 	    writeResponseJson(rr);
 	}
     } else {
-	throw runtime_error("unknown or unimplemented format \"" + format + "\"");
+	throw runtime_error("unknown output format \"" + format + "\"");
     }
 }
 
@@ -268,7 +382,7 @@
     }
 
     string informat = "json", outformat = "json";
-    RequestOrResponse::Direction direction;
+    RequestOrResponse::Direction direction = RequestOrResponse::Request;
     bool haveDirection = false;
     
     for (int i = 1; i < argc; ++i) {
@@ -277,11 +391,11 @@
 	bool final = (i + 1 == argc);
 	
 	if (arg == "-i") {
-	    if (informat != "" || final) usage();
+	    if (final) usage();
 	    else informat = argv[++i];
 
 	} else if (arg == "-o") {
-	    if (outformat != "" || final) usage();
+	    if (final) usage();
 	    else outformat = argv[++i];
 
 	} else if (arg == "request") {