comparison vamp-client/CapnpRRClient.h @ 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 215c9fb6b7a4
children bbb99f94e225
comparison
equal deleted inserted replaced
96:215c9fb6b7a4 97:427c4c725085
10 #include "vamp-support/AssignedPluginHandleMapper.h" 10 #include "vamp-support/AssignedPluginHandleMapper.h"
11 #include "vamp-capnp/VampnProto.h" 11 #include "vamp-capnp/VampnProto.h"
12 12
13 #include <capnp/serialize.h> 13 #include <capnp/serialize.h>
14 14
15 namespace piper { 15 namespace piper_vamp {
16 namespace vampclient { 16 namespace client {
17 17
18 class CapnpRRClient : public PluginClient, 18 class CapnpRRClient : public PluginClient,
19 public Loader 19 public Loader
20 { 20 {
21 // unsigned to avoid undefined behaviour on possible wrap 21 // unsigned to avoid undefined behaviour on possible wrap
22 typedef uint32_t ReqId; 22 typedef uint32_t ReqId;
23 23
24 class CompletenessChecker : public MessageCompletenessChecker { 24 class CompletenessChecker : public MessageCompletenessChecker {
54 //!!! but the rest are only supposed to be called by the plugin -- 54 //!!! but the rest are only supposed to be called by the plugin --
55 //!!! sort out the api here 55 //!!! sort out the api here
56 56
57 // Loader methods: 57 // Loader methods:
58 58
59 Vamp::HostExt::ListResponse 59 ListResponse
60 listPluginData() override { 60 listPluginData() override {
61 61
62 if (!m_transport->isOK()) { 62 if (!m_transport->isOK()) {
63 throw std::runtime_error("Piper server failed to start"); 63 throw std::runtime_error("Piper server failed to start");
64 } 64 }
65 65
66 capnp::MallocMessageBuilder message; 66 capnp::MallocMessageBuilder message;
67 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); 67 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>();
68 VampnProto::buildRpcRequest_List(builder); 68 VampnProto::buildRpcRequest_List(builder);
69 ReqId id = getId(); 69 ReqId id = getId();
70 builder.getId().setNumber(id); 70 builder.getId().setNumber(id);
71 71
72 auto karr = call(message); 72 auto karr = call(message);
73 73
74 capnp::FlatArrayMessageReader responseMessage(karr); 74 capnp::FlatArrayMessageReader responseMessage(karr);
75 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 75 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>();
76 76
77 checkResponseType(reader, RpcResponse::Response::Which::LIST, id); 77 checkResponseType(reader, piper::RpcResponse::Response::Which::LIST, id);
78 78
79 Vamp::HostExt::ListResponse lr; 79 ListResponse lr;
80 VampnProto::readListResponse(lr, reader.getResponse().getList()); 80 VampnProto::readListResponse(lr, reader.getResponse().getList());
81 return lr; 81 return lr;
82 } 82 }
83 83
84 Vamp::HostExt::LoadResponse 84 LoadResponse
85 loadPlugin(const Vamp::HostExt::LoadRequest &req) override { 85 loadPlugin(const LoadRequest &req) override {
86 86
87 if (!m_transport->isOK()) { 87 if (!m_transport->isOK()) {
88 throw std::runtime_error("Piper server failed to start"); 88 throw std::runtime_error("Piper server failed to start");
89 } 89 }
90 90
91 Vamp::HostExt::LoadResponse resp; 91 LoadResponse resp;
92 PluginHandleMapper::Handle handle = serverLoad(req.pluginKey, 92 PluginHandleMapper::Handle handle = serverLoad(req.pluginKey,
93 req.inputSampleRate, 93 req.inputSampleRate,
94 req.adapterFlags, 94 req.adapterFlags,
95 resp.staticData, 95 resp.staticData,
96 resp.defaultConfiguration); 96 resp.defaultConfiguration);
111 // PluginClient methods: 111 // PluginClient methods:
112 112
113 virtual 113 virtual
114 Vamp::Plugin::OutputList 114 Vamp::Plugin::OutputList
115 configure(PluginStub *plugin, 115 configure(PluginStub *plugin,
116 Vamp::HostExt::PluginConfiguration config) override { 116 PluginConfiguration config) override {
117 117
118 if (!m_transport->isOK()) { 118 if (!m_transport->isOK()) {
119 throw std::runtime_error("Piper server failed to start"); 119 throw std::runtime_error("Piper server failed to start");
120 } 120 }
121 121
122 Vamp::HostExt::ConfigurationRequest request; 122 ConfigurationRequest request;
123 request.plugin = plugin; 123 request.plugin = plugin;
124 request.configuration = config; 124 request.configuration = config;
125 125
126 capnp::MallocMessageBuilder message; 126 capnp::MallocMessageBuilder message;
127 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); 127 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>();
128 128
129 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper); 129 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper);
130 ReqId id = getId(); 130 ReqId id = getId();
131 builder.getId().setNumber(id); 131 builder.getId().setNumber(id);
132 132
133 auto karr = call(message); 133 auto karr = call(message);
134 134
135 capnp::FlatArrayMessageReader responseMessage(karr); 135 capnp::FlatArrayMessageReader responseMessage(karr);
136 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 136 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>();
137 137
138 //!!! handle (explicit) error case 138 //!!! handle (explicit) error case
139 139
140 checkResponseType(reader, RpcResponse::Response::Which::CONFIGURE, id); 140 checkResponseType(reader, piper::RpcResponse::Response::Which::CONFIGURE, id);
141 141
142 Vamp::HostExt::ConfigurationResponse cr; 142 ConfigurationResponse cr;
143 VampnProto::readConfigurationResponse(cr, 143 VampnProto::readConfigurationResponse(cr,
144 reader.getResponse().getConfigure(), 144 reader.getResponse().getConfigure(),
145 m_mapper); 145 m_mapper);
146 146
147 return cr.outputs; 147 return cr.outputs;
155 155
156 if (!m_transport->isOK()) { 156 if (!m_transport->isOK()) {
157 throw std::runtime_error("Piper server failed to start"); 157 throw std::runtime_error("Piper server failed to start");
158 } 158 }
159 159
160 Vamp::HostExt::ProcessRequest request; 160 ProcessRequest request;
161 request.plugin = plugin; 161 request.plugin = plugin;
162 request.inputBuffers = inputBuffers; 162 request.inputBuffers = inputBuffers;
163 request.timestamp = timestamp; 163 request.timestamp = timestamp;
164 164
165 capnp::MallocMessageBuilder message; 165 capnp::MallocMessageBuilder message;
166 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); 166 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>();
167 VampnProto::buildRpcRequest_Process(builder, request, m_mapper); 167 VampnProto::buildRpcRequest_Process(builder, request, m_mapper);
168 ReqId id = getId(); 168 ReqId id = getId();
169 builder.getId().setNumber(id); 169 builder.getId().setNumber(id);
170 170
171 auto karr = call(message); 171 auto karr = call(message);
172 172
173 capnp::FlatArrayMessageReader responseMessage(karr); 173 capnp::FlatArrayMessageReader responseMessage(karr);
174 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 174 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>();
175 175
176 //!!! handle (explicit) error case 176 //!!! handle (explicit) error case
177 177
178 checkResponseType(reader, RpcResponse::Response::Which::PROCESS, id); 178 checkResponseType(reader, piper::RpcResponse::Response::Which::PROCESS, id);
179 179
180 Vamp::HostExt::ProcessResponse pr; 180 ProcessResponse pr;
181 VampnProto::readProcessResponse(pr, 181 VampnProto::readProcessResponse(pr,
182 reader.getResponse().getProcess(), 182 reader.getResponse().getProcess(),
183 m_mapper); 183 m_mapper);
184 184
185 return pr.features; 185 return pr.features;
190 190
191 if (!m_transport->isOK()) { 191 if (!m_transport->isOK()) {
192 throw std::runtime_error("Piper server failed to start"); 192 throw std::runtime_error("Piper server failed to start");
193 } 193 }
194 194
195 Vamp::HostExt::FinishRequest request; 195 FinishRequest request;
196 request.plugin = plugin; 196 request.plugin = plugin;
197 197
198 capnp::MallocMessageBuilder message; 198 capnp::MallocMessageBuilder message;
199 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); 199 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>();
200 200
201 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper); 201 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper);
202 ReqId id = getId(); 202 ReqId id = getId();
203 builder.getId().setNumber(id); 203 builder.getId().setNumber(id);
204 204
205 auto karr = call(message); 205 auto karr = call(message);
206 206
207 capnp::FlatArrayMessageReader responseMessage(karr); 207 capnp::FlatArrayMessageReader responseMessage(karr);
208 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 208 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>();
209 209
210 //!!! handle (explicit) error case 210 //!!! handle (explicit) error case
211 211
212 checkResponseType(reader, RpcResponse::Response::Which::FINISH, id); 212 checkResponseType(reader, piper::RpcResponse::Response::Which::FINISH, id);
213 213
214 Vamp::HostExt::ProcessResponse pr; 214 FinishResponse pr;
215 VampnProto::readFinishResponse(pr, 215 VampnProto::readFinishResponse(pr,
216 reader.getResponse().getFinish(), 216 reader.getResponse().getFinish(),
217 m_mapper); 217 m_mapper);
218 218
219 m_mapper.removePlugin(m_mapper.pluginToHandle(plugin)); 219 m_mapper.removePlugin(m_mapper.pluginToHandle(plugin));
224 return pr.features; 224 return pr.features;
225 } 225 }
226 226
227 virtual void 227 virtual void
228 reset(PluginStub *plugin, 228 reset(PluginStub *plugin,
229 Vamp::HostExt::PluginConfiguration config) override { 229 PluginConfiguration config) override {
230 230
231 // Reload the plugin on the server side, and configure it as requested 231 // Reload the plugin on the server side, and configure it as requested
232 232
233 if (!m_transport->isOK()) { 233 if (!m_transport->isOK()) {
234 throw std::runtime_error("Piper server failed to start"); 234 throw std::runtime_error("Piper server failed to start");
236 236
237 if (m_mapper.havePlugin(plugin)) { 237 if (m_mapper.havePlugin(plugin)) {
238 (void)finish(plugin); // server-side unload 238 (void)finish(plugin); // server-side unload
239 } 239 }
240 240
241 Vamp::HostExt::PluginStaticData psd; 241 PluginStaticData psd;
242 Vamp::HostExt::PluginConfiguration defaultConfig; 242 PluginConfiguration defaultConfig;
243 PluginHandleMapper::Handle handle = 243 PluginHandleMapper::Handle handle =
244 serverLoad(plugin->getPluginKey(), 244 serverLoad(plugin->getPluginKey(),
245 plugin->getInputSampleRate(), 245 plugin->getInputSampleRate(),
246 plugin->getAdapterFlags(), 246 plugin->getAdapterFlags(),
247 psd, defaultConfig); 247 psd, defaultConfig);
270 memcpy(karr.begin(), buffer.data(), words * wordSize); 270 memcpy(karr.begin(), buffer.data(), words * wordSize);
271 return karr; 271 return karr;
272 } 272 }
273 273
274 void 274 void
275 checkResponseType(const RpcResponse::Reader &r, 275 checkResponseType(const piper::RpcResponse::Reader &r,
276 RpcResponse::Response::Which type, 276 piper::RpcResponse::Response::Which type,
277 ReqId id) { 277 ReqId id) {
278 278
279 if (r.getResponse().which() != type) { 279 if (r.getResponse().which() != type) {
280 throw std::runtime_error("Wrong response type"); 280 throw std::runtime_error("Wrong response type");
281 } 281 }
292 return toKJArray(responseBuffer); 292 return toKJArray(responseBuffer);
293 } 293 }
294 294
295 PluginHandleMapper::Handle 295 PluginHandleMapper::Handle
296 serverLoad(std::string key, float inputSampleRate, int adapterFlags, 296 serverLoad(std::string key, float inputSampleRate, int adapterFlags,
297 Vamp::HostExt::PluginStaticData &psd, 297 PluginStaticData &psd,
298 Vamp::HostExt::PluginConfiguration &defaultConfig) { 298 PluginConfiguration &defaultConfig) {
299 299
300 Vamp::HostExt::LoadRequest request; 300 LoadRequest request;
301 request.pluginKey = key; 301 request.pluginKey = key;
302 request.inputSampleRate = inputSampleRate; 302 request.inputSampleRate = inputSampleRate;
303 request.adapterFlags = adapterFlags; 303 request.adapterFlags = adapterFlags;
304 304
305 capnp::MallocMessageBuilder message; 305 capnp::MallocMessageBuilder message;
306 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); 306 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>();
307 307
308 VampnProto::buildRpcRequest_Load(builder, request); 308 VampnProto::buildRpcRequest_Load(builder, request);
309 ReqId id = getId(); 309 ReqId id = getId();
310 builder.getId().setNumber(id); 310 builder.getId().setNumber(id);
311 311
313 313
314 //!!! ... --> will also need some way to kill this process 314 //!!! ... --> will also need some way to kill this process
315 //!!! (from another thread) 315 //!!! (from another thread)
316 316
317 capnp::FlatArrayMessageReader responseMessage(karr); 317 capnp::FlatArrayMessageReader responseMessage(karr);
318 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 318 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>();
319 319
320 //!!! handle (explicit) error case 320 //!!! handle (explicit) error case
321 321
322 checkResponseType(reader, RpcResponse::Response::Which::LOAD, id); 322 checkResponseType(reader, piper::RpcResponse::Response::Which::LOAD, id);
323 323
324 const LoadResponse::Reader &lr = reader.getResponse().getLoad(); 324 const piper::LoadResponse::Reader &lr = reader.getResponse().getLoad();
325 VampnProto::readExtractorStaticData(psd, lr.getStaticData()); 325 VampnProto::readExtractorStaticData(psd, lr.getStaticData());
326 VampnProto::readConfiguration(defaultConfig, lr.getDefaultConfiguration()); 326 VampnProto::readConfiguration(defaultConfig, lr.getDefaultConfiguration());
327 return lr.getHandle(); 327 return lr.getHandle();
328 }; 328 };
329 329