comparison vamp-client/PiperCapnpClient.h @ 91:c897c9a8daf1

Implement reset()
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 13 Oct 2016 11:33:19 +0100
parents 6429a99abcad
children 21f8af53eaf0
comparison
equal deleted inserted replaced
90:6429a99abcad 91:c897c9a8daf1
34 34
35 if (!m_transport->isOK()) { 35 if (!m_transport->isOK()) {
36 throw std::runtime_error("Piper server failed to start"); 36 throw std::runtime_error("Piper server failed to start");
37 } 37 }
38 38
39 Vamp::HostExt::PluginStaticData psd;
40 Vamp::HostExt::PluginConfiguration defaultConfig;
41 PluginHandleMapper::Handle handle =
42 serverLoad(key, inputSampleRate, adapterFlags, psd, defaultConfig);
43
44 Vamp::Plugin *plugin = new PiperStubPlugin(this,
45 key,
46 inputSampleRate,
47 adapterFlags,
48 psd,
49 defaultConfig);
50
51 m_mapper.addPlugin(handle, plugin);
52
53 return plugin;
54 }
55
56 PluginHandleMapper::Handle
57 serverLoad(std::string key, float inputSampleRate, int adapterFlags,
58 Vamp::HostExt::PluginStaticData &psd,
59 Vamp::HostExt::PluginConfiguration &defaultConfig) {
60
39 Vamp::HostExt::LoadRequest request; 61 Vamp::HostExt::LoadRequest request;
40 request.pluginKey = key; 62 request.pluginKey = key;
41 request.inputSampleRate = inputSampleRate; 63 request.inputSampleRate = inputSampleRate;
42 request.adapterFlags = adapterFlags; 64 request.adapterFlags = adapterFlags;
43 65
46 68
47 VampnProto::buildRpcRequest_Load(builder, request); 69 VampnProto::buildRpcRequest_Load(builder, request);
48 ReqId id = getId(); 70 ReqId id = getId();
49 builder.getId().setNumber(id); 71 builder.getId().setNumber(id);
50 72
51 auto arr = messageToFlatArray(message); 73 auto arr = capnp::messageToFlatArray(message);
52 74
53 auto responseBuffer = m_transport->call(arr.asChars().begin(), 75 auto responseBuffer = m_transport->call(arr.asChars().begin(),
54 arr.asChars().size()); 76 arr.asChars().size());
55 77
56 //!!! ... --> will also need some way to kill this process 78 //!!! ... --> will also need some way to kill this process
63 //!!! handle (explicit) error case 85 //!!! handle (explicit) error case
64 86
65 checkResponseType(reader, RpcResponse::Response::Which::LOAD, id); 87 checkResponseType(reader, RpcResponse::Response::Which::LOAD, id);
66 88
67 const LoadResponse::Reader &lr = reader.getResponse().getLoad(); 89 const LoadResponse::Reader &lr = reader.getResponse().getLoad();
68
69 Vamp::HostExt::PluginStaticData psd;
70 Vamp::HostExt::PluginConfiguration defaultConfig;
71 VampnProto::readExtractorStaticData(psd, lr.getStaticData()); 90 VampnProto::readExtractorStaticData(psd, lr.getStaticData());
72 VampnProto::readConfiguration(defaultConfig, lr.getDefaultConfiguration()); 91 VampnProto::readConfiguration(defaultConfig, lr.getDefaultConfiguration());
73 92 return lr.getHandle();
74 Vamp::Plugin *plugin = new PiperStubPlugin(this,
75 inputSampleRate,
76 psd,
77 defaultConfig);
78
79 m_mapper.addPlugin(lr.getHandle(), plugin);
80
81 return plugin;
82 }; 93 };
83 94
84 protected: 95 protected:
85 virtual 96 virtual
86 Vamp::Plugin::OutputList 97 Vamp::Plugin::OutputList
100 111
101 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper); 112 VampnProto::buildRpcRequest_Configure(builder, request, m_mapper);
102 ReqId id = getId(); 113 ReqId id = getId();
103 builder.getId().setNumber(id); 114 builder.getId().setNumber(id);
104 115
105 auto arr = messageToFlatArray(message); 116 auto arr = capnp::messageToFlatArray(message);
106 auto responseBuffer = m_transport->call(arr.asChars().begin(), 117 auto responseBuffer = m_transport->call(arr.asChars().begin(),
107 arr.asChars().size()); 118 arr.asChars().size());
108 auto karr = toKJArray(responseBuffer); 119 auto karr = toKJArray(responseBuffer);
109 capnp::FlatArrayMessageReader responseMessage(karr); 120 capnp::FlatArrayMessageReader responseMessage(karr);
110 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 121 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>();
141 152
142 VampnProto::buildRpcRequest_Process(builder, request, m_mapper); 153 VampnProto::buildRpcRequest_Process(builder, request, m_mapper);
143 ReqId id = getId(); 154 ReqId id = getId();
144 builder.getId().setNumber(id); 155 builder.getId().setNumber(id);
145 156
146 auto arr = messageToFlatArray(message); 157 auto arr = capnp::messageToFlatArray(message);
147 auto responseBuffer = m_transport->call(arr.asChars().begin(), 158 auto responseBuffer = m_transport->call(arr.asChars().begin(),
148 arr.asChars().size()); 159 arr.asChars().size());
149 auto karr = toKJArray(responseBuffer); 160 auto karr = toKJArray(responseBuffer);
150 capnp::FlatArrayMessageReader responseMessage(karr); 161 capnp::FlatArrayMessageReader responseMessage(karr);
151 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 162 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>();
177 188
178 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper); 189 VampnProto::buildRpcRequest_Finish(builder, request, m_mapper);
179 ReqId id = getId(); 190 ReqId id = getId();
180 builder.getId().setNumber(id); 191 builder.getId().setNumber(id);
181 192
182 auto arr = messageToFlatArray(message); 193 auto arr = capnp::messageToFlatArray(message);
183 auto responseBuffer = m_transport->call(arr.asChars().begin(), 194 auto responseBuffer = m_transport->call(arr.asChars().begin(),
184 arr.asChars().size()); 195 arr.asChars().size());
185 auto karr = toKJArray(responseBuffer); 196 auto karr = toKJArray(responseBuffer);
186 capnp::FlatArrayMessageReader responseMessage(karr); 197 capnp::FlatArrayMessageReader responseMessage(karr);
187 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>(); 198 RpcResponse::Reader reader = responseMessage.getRoot<RpcResponse>();
201 // to be calling us here 212 // to be calling us here
202 213
203 return pr.features; 214 return pr.features;
204 } 215 }
205 216
217 virtual void
218 reset(PiperStubPlugin *plugin,
219 Vamp::HostExt::PluginConfiguration config) override {
220
221 // Reload the plugin on the server side, and configure it as requested
222
223 if (!m_transport->isOK()) {
224 throw std::runtime_error("Piper server failed to start");
225 }
226
227 if (m_mapper.havePlugin(plugin)) {
228 (void)finish(plugin); // server-side unload
229 }
230
231 Vamp::HostExt::PluginStaticData psd;
232 Vamp::HostExt::PluginConfiguration defaultConfig;
233 PluginHandleMapper::Handle handle =
234 serverLoad(plugin->getPluginKey(),
235 plugin->getInputSampleRate(),
236 plugin->getAdapterFlags(),
237 psd, defaultConfig);
238
239 m_mapper.addPlugin(handle, plugin);
240
241 (void)configure(plugin, config);
242 }
243
206 private: 244 private:
207 AssignedPluginHandleMapper m_mapper; 245 AssignedPluginHandleMapper m_mapper;
208 ReqId getId() { 246 ReqId getId() {
209 //!!! todo: mutex 247 //!!! todo: mutex
210 static ReqId m_nextId = 0; 248 static ReqId m_nextId = 0;