comparison vamp-server/server.cpp @ 97:427c4c725085

Bring in the Request/Response classes that were in the Vamp SDK, adding them to vamp-support in here instead
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 13 Oct 2016 18:05:35 +0100
parents 21f8af53eaf0
children cd438188e3f9 6fad5154778e
comparison
equal deleted inserted replaced
96:215c9fb6b7a4 97:427c4c725085
1 1
2 #include "vamp-capnp/VampnProto.h" 2 #include "vamp-capnp/VampnProto.h"
3 #include "vamp-support/RequestOrResponse.h" 3 #include "vamp-support/RequestOrResponse.h"
4 #include "vamp-support/CountingPluginHandleMapper.h" 4 #include "vamp-support/CountingPluginHandleMapper.h"
5 #include "vamp-support/LoaderRequests.h"
5 6
6 #include <iostream> 7 #include <iostream>
7 #include <sstream> 8 #include <sstream>
8 #include <stdexcept> 9 #include <stdexcept>
9 10
11 12
12 #include <map> 13 #include <map>
13 #include <set> 14 #include <set>
14 15
15 using namespace std; 16 using namespace std;
16 using namespace piper; 17 using namespace piper_vamp;
17 using namespace Vamp; 18 using namespace Vamp;
18 using namespace Vamp::HostExt;
19 19
20 void usage() 20 void usage()
21 { 21 {
22 string myname = "piper-vamp-server"; 22 string myname = "piper-vamp-server";
23 cerr << "\n" << myname << 23 cerr << "\n" << myname <<
29 exit(2); 29 exit(2);
30 } 30 }
31 31
32 static CountingPluginHandleMapper mapper; 32 static CountingPluginHandleMapper mapper;
33 33
34 static RequestOrResponse::RpcId readId(const RpcRequest::Reader &r) 34 static RequestOrResponse::RpcId readId(const piper::RpcRequest::Reader &r)
35 { 35 {
36 int number; 36 int number;
37 string tag; 37 string tag;
38 switch (r.getId().which()) { 38 switch (r.getId().which()) {
39 case RpcRequest::Id::Which::NUMBER: 39 case piper::RpcRequest::Id::Which::NUMBER:
40 number = r.getId().getNumber(); 40 number = r.getId().getNumber();
41 return { RequestOrResponse::RpcId::Number, number, "" }; 41 return { RequestOrResponse::RpcId::Number, number, "" };
42 case RpcRequest::Id::Which::TAG: 42 case piper::RpcRequest::Id::Which::TAG:
43 tag = r.getId().getTag(); 43 tag = r.getId().getTag();
44 return { RequestOrResponse::RpcId::Tag, 0, tag }; 44 return { RequestOrResponse::RpcId::Tag, 0, tag };
45 case RpcRequest::Id::Which::NONE: 45 case piper::RpcRequest::Id::Which::NONE:
46 return { RequestOrResponse::RpcId::Absent, 0, "" }; 46 return { RequestOrResponse::RpcId::Absent, 0, "" };
47 } 47 }
48 return {}; 48 return {};
49 } 49 }
50 50
51 static void buildId(RpcResponse::Builder &b, const RequestOrResponse::RpcId &id) 51 static void buildId(piper::RpcResponse::Builder &b, const RequestOrResponse::RpcId &id)
52 { 52 {
53 switch (id.type) { 53 switch (id.type) {
54 case RequestOrResponse::RpcId::Number: 54 case RequestOrResponse::RpcId::Number:
55 b.getId().setNumber(id.number); 55 b.getId().setNumber(id.number);
56 break; 56 break;
75 if (buffered.tryGetReadBuffer() == nullptr) { 75 if (buffered.tryGetReadBuffer() == nullptr) {
76 rr.type = RRType::NotValid; 76 rr.type = RRType::NotValid;
77 return rr; 77 return rr;
78 } 78 }
79 79
80 ::capnp::InputStreamMessageReader message(buffered); 80 capnp::InputStreamMessageReader message(buffered);
81 RpcRequest::Reader reader = message.getRoot<RpcRequest>(); 81 piper::RpcRequest::Reader reader = message.getRoot<piper::RpcRequest>();
82 82
83 rr.type = VampnProto::getRequestResponseType(reader); 83 rr.type = VampnProto::getRequestResponseType(reader);
84 rr.id = readId(reader); 84 rr.id = readId(reader);
85 85
86 switch (rr.type) { 86 switch (rr.type) {
109 } 109 }
110 110
111 void 111 void
112 writeResponseCapnp(RequestOrResponse &rr) 112 writeResponseCapnp(RequestOrResponse &rr)
113 { 113 {
114 ::capnp::MallocMessageBuilder message; 114 capnp::MallocMessageBuilder message;
115 RpcResponse::Builder builder = message.initRoot<RpcResponse>(); 115 piper::RpcResponse::Builder builder = message.initRoot<piper::RpcResponse>();
116 116
117 buildId(builder, rr.id); 117 buildId(builder, rr.id);
118 118
119 if (!rr.success) { 119 if (!rr.success) {
120 120
148 } 148 }
149 149
150 void 150 void
151 writeExceptionCapnp(const std::exception &e, RRType type) 151 writeExceptionCapnp(const std::exception &e, RRType type)
152 { 152 {
153 ::capnp::MallocMessageBuilder message; 153 capnp::MallocMessageBuilder message;
154 RpcResponse::Builder builder = message.initRoot<RpcResponse>(); 154 piper::RpcResponse::Builder builder = message.initRoot<piper::RpcResponse>();
155 VampnProto::buildRpcResponse_Exception(builder, e, type); 155 VampnProto::buildRpcResponse_Exception(builder, e, type);
156 156
157 writeMessageToFd(1, message); 157 writeMessageToFd(1, message);
158 } 158 }
159 159
162 { 162 {
163 RequestOrResponse response; 163 RequestOrResponse response;
164 response.direction = RequestOrResponse::Response; 164 response.direction = RequestOrResponse::Response;
165 response.type = request.type; 165 response.type = request.type;
166 166
167 auto loader = PluginLoader::getInstance();
168
169 switch (request.type) { 167 switch (request.type) {
170 168
171 case RRType::List: 169 case RRType::List:
172 response.listResponse = loader->listPluginData(); 170 response.listResponse = LoaderRequests().listPluginData();
173 response.success = true; 171 response.success = true;
174 break; 172 break;
175 173
176 case RRType::Load: 174 case RRType::Load:
177 response.loadResponse = loader->loadPlugin(request.loadRequest); 175 response.loadResponse = LoaderRequests().loadPlugin(request.loadRequest);
178 if (response.loadResponse.plugin != nullptr) { 176 if (response.loadResponse.plugin != nullptr) {
179 mapper.addPlugin(response.loadResponse.plugin); 177 mapper.addPlugin(response.loadResponse.plugin);
180 cerr << "loaded plugin, handle = " << mapper.pluginToHandle(response.loadResponse.plugin) << endl; 178 cerr << "loaded plugin, handle = " << mapper.pluginToHandle(response.loadResponse.plugin) << endl;
181 response.success = true; 179 response.success = true;
182 } 180 }
188 auto h = mapper.pluginToHandle(creq.plugin); 186 auto h = mapper.pluginToHandle(creq.plugin);
189 if (mapper.isConfigured(h)) { 187 if (mapper.isConfigured(h)) {
190 throw runtime_error("plugin has already been configured"); 188 throw runtime_error("plugin has already been configured");
191 } 189 }
192 190
193 response.configurationResponse = loader->configurePlugin(creq); 191 response.configurationResponse = LoaderRequests().configurePlugin(creq);
194 192
195 if (!response.configurationResponse.outputs.empty()) { 193 if (!response.configurationResponse.outputs.empty()) {
196 mapper.markConfigured 194 mapper.markConfigured
197 (h, creq.configuration.channelCount, creq.configuration.blockSize); 195 (h, creq.configuration.channelCount, creq.configuration.blockSize);
198 response.success = true; 196 response.success = true;