Mercurial > hg > piper-cpp
comparison vamp-client/CapnpRRClient.h @ 126:2004ec2b653e
Ensure we read right up to end of buffered data after server exits; adjust waiting schedule on Windows (where waitForReadyRead is far too wasteful of sleep time)
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 28 Oct 2016 14:31:58 +0100 |
parents | ff3fd8d1b2dc |
children | 183fe1f03980 |
comparison
equal
deleted
inserted
replaced
125:ea06fae1567c | 126:2004ec2b653e |
---|---|
100 | 100 |
101 ListResponse | 101 ListResponse |
102 listPluginData() override { | 102 listPluginData() override { |
103 | 103 |
104 if (!m_transport->isOK()) { | 104 if (!m_transport->isOK()) { |
105 throw std::runtime_error("Piper server failed to start"); | 105 throw std::runtime_error("Piper server crashed or failed to start"); |
106 } | 106 } |
107 | 107 |
108 capnp::MallocMessageBuilder message; | 108 capnp::MallocMessageBuilder message; |
109 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>(); | 109 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>(); |
110 VampnProto::buildRpcRequest_List(builder); | 110 VampnProto::buildRpcRequest_List(builder); |
111 ReqId id = getId(); | 111 ReqId id = getId(); |
112 builder.getId().setNumber(id); | 112 builder.getId().setNumber(id); |
113 | 113 |
114 auto karr = call(message); | 114 auto karr = call(message, true); |
115 | 115 |
116 capnp::FlatArrayMessageReader responseMessage(karr); | 116 capnp::FlatArrayMessageReader responseMessage(karr); |
117 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); | 117 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); |
118 | 118 |
119 checkResponseType(reader, piper::RpcResponse::Response::Which::LIST, id); | 119 checkResponseType(reader, piper::RpcResponse::Response::Which::LIST, id); |
125 | 125 |
126 LoadResponse | 126 LoadResponse |
127 loadPlugin(const LoadRequest &req) override { | 127 loadPlugin(const LoadRequest &req) override { |
128 | 128 |
129 if (!m_transport->isOK()) { | 129 if (!m_transport->isOK()) { |
130 throw std::runtime_error("Piper server failed to start"); | 130 throw std::runtime_error("Piper server crashed or failed to start"); |
131 } | 131 } |
132 | 132 |
133 LoadResponse resp; | 133 LoadResponse resp; |
134 PluginHandleMapper::Handle handle = serverLoad(req.pluginKey, | 134 PluginHandleMapper::Handle handle = serverLoad(req.pluginKey, |
135 req.inputSampleRate, | 135 req.inputSampleRate, |
156 Vamp::Plugin::OutputList | 156 Vamp::Plugin::OutputList |
157 configure(PluginStub *plugin, | 157 configure(PluginStub *plugin, |
158 PluginConfiguration config) override { | 158 PluginConfiguration config) override { |
159 | 159 |
160 if (!m_transport->isOK()) { | 160 if (!m_transport->isOK()) { |
161 throw std::runtime_error("Piper server failed to start"); | 161 throw std::runtime_error("Piper server crashed or failed to start"); |
162 } | 162 } |
163 | 163 |
164 ConfigurationRequest request; | 164 ConfigurationRequest request; |
165 request.plugin = plugin; | 165 request.plugin = plugin; |
166 request.configuration = config; | 166 request.configuration = config; |
170 | 170 |
171 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper); | 171 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper); |
172 ReqId id = getId(); | 172 ReqId id = getId(); |
173 builder.getId().setNumber(id); | 173 builder.getId().setNumber(id); |
174 | 174 |
175 auto karr = call(message); | 175 auto karr = call(message, true); |
176 | 176 |
177 capnp::FlatArrayMessageReader responseMessage(karr); | 177 capnp::FlatArrayMessageReader responseMessage(karr); |
178 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); | 178 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); |
179 | 179 |
180 //!!! handle (explicit) error case | 180 //!!! handle (explicit) error case |
194 process(PluginStub *plugin, | 194 process(PluginStub *plugin, |
195 std::vector<std::vector<float> > inputBuffers, | 195 std::vector<std::vector<float> > inputBuffers, |
196 Vamp::RealTime timestamp) override { | 196 Vamp::RealTime timestamp) override { |
197 | 197 |
198 if (!m_transport->isOK()) { | 198 if (!m_transport->isOK()) { |
199 throw std::runtime_error("Piper server failed to start"); | 199 throw std::runtime_error("Piper server crashed or failed to start"); |
200 } | 200 } |
201 | 201 |
202 ProcessRequest request; | 202 ProcessRequest request; |
203 request.plugin = plugin; | 203 request.plugin = plugin; |
204 request.inputBuffers = inputBuffers; | 204 request.inputBuffers = inputBuffers; |
208 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>(); | 208 piper::RpcRequest::Builder builder = message.initRoot<piper::RpcRequest>(); |
209 VampnProto::buildRpcRequest_Process(builder, request, m_mapper); | 209 VampnProto::buildRpcRequest_Process(builder, request, m_mapper); |
210 ReqId id = getId(); | 210 ReqId id = getId(); |
211 builder.getId().setNumber(id); | 211 builder.getId().setNumber(id); |
212 | 212 |
213 auto karr = call(message); | 213 auto karr = call(message, false); |
214 | 214 |
215 capnp::FlatArrayMessageReader responseMessage(karr); | 215 capnp::FlatArrayMessageReader responseMessage(karr); |
216 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); | 216 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); |
217 | 217 |
218 //!!! handle (explicit) error case | 218 //!!! handle (explicit) error case |
229 | 229 |
230 virtual Vamp::Plugin::FeatureSet | 230 virtual Vamp::Plugin::FeatureSet |
231 finish(PluginStub *plugin) override { | 231 finish(PluginStub *plugin) override { |
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 crashed or failed to start"); |
235 } | 235 } |
236 | 236 |
237 FinishRequest request; | 237 FinishRequest request; |
238 request.plugin = plugin; | 238 request.plugin = plugin; |
239 | 239 |
242 | 242 |
243 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper); | 243 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper); |
244 ReqId id = getId(); | 244 ReqId id = getId(); |
245 builder.getId().setNumber(id); | 245 builder.getId().setNumber(id); |
246 | 246 |
247 auto karr = call(message); | 247 auto karr = call(message, true); |
248 | 248 |
249 capnp::FlatArrayMessageReader responseMessage(karr); | 249 capnp::FlatArrayMessageReader responseMessage(karr); |
250 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); | 250 piper::RpcResponse::Reader reader = responseMessage.getRoot<piper::RpcResponse>(); |
251 | 251 |
252 //!!! handle (explicit) error case | 252 //!!! handle (explicit) error case |
271 PluginConfiguration config) override { | 271 PluginConfiguration config) override { |
272 | 272 |
273 // Reload the plugin on the server side, and configure it as requested | 273 // Reload the plugin on the server side, and configure it as requested |
274 | 274 |
275 if (!m_transport->isOK()) { | 275 if (!m_transport->isOK()) { |
276 throw std::runtime_error("Piper server failed to start"); | 276 throw std::runtime_error("Piper server crashed or failed to start"); |
277 } | 277 } |
278 | 278 |
279 if (m_mapper.havePlugin(plugin)) { | 279 if (m_mapper.havePlugin(plugin)) { |
280 (void)finish(plugin); // server-side unload | 280 (void)finish(plugin); // server-side unload |
281 } | 281 } |
332 throw std::runtime_error("Wrong response id"); | 332 throw std::runtime_error("Wrong response id"); |
333 } | 333 } |
334 } | 334 } |
335 | 335 |
336 kj::Array<capnp::word> | 336 kj::Array<capnp::word> |
337 call(capnp::MallocMessageBuilder &message) { | 337 call(capnp::MallocMessageBuilder &message, bool slow) { |
338 auto arr = capnp::messageToFlatArray(message); | 338 auto arr = capnp::messageToFlatArray(message); |
339 auto responseBuffer = m_transport->call(arr.asChars().begin(), | 339 auto responseBuffer = m_transport->call(arr.asChars().begin(), |
340 arr.asChars().size()); | 340 arr.asChars().size(), |
341 slow); | |
341 return toKJArray(responseBuffer); | 342 return toKJArray(responseBuffer); |
342 } | 343 } |
343 | 344 |
344 PluginHandleMapper::Handle | 345 PluginHandleMapper::Handle |
345 serverLoad(std::string key, float inputSampleRate, int adapterFlags, | 346 serverLoad(std::string key, float inputSampleRate, int adapterFlags, |
356 | 357 |
357 VampnProto::buildRpcRequest_Load(builder, request); | 358 VampnProto::buildRpcRequest_Load(builder, request); |
358 ReqId id = getId(); | 359 ReqId id = getId(); |
359 builder.getId().setNumber(id); | 360 builder.getId().setNumber(id); |
360 | 361 |
361 auto karr = call(message); | 362 auto karr = call(message, false); |
362 | 363 |
363 //!!! ... --> will also need some way to kill this process | 364 //!!! ... --> will also need some way to kill this process |
364 //!!! (from another thread) | 365 //!!! (from another thread) |
365 | 366 |
366 capnp::FlatArrayMessageReader responseMessage(karr); | 367 capnp::FlatArrayMessageReader responseMessage(karr); |