Mercurial > hg > piper-cpp
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; |