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