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);