Mercurial > hg > svcore
comparison transform/ModelTransformerFactory.cpp @ 1703:b17fb3a4560c single-point
Add haveRunningTransformers() and mutex
author | Chris Cannam |
---|---|
date | Thu, 09 May 2019 16:01:04 +0100 |
parents | 70e172e6cc59 |
children | 8efce64dd85e |
comparison
equal
deleted
inserted
replaced
1701:81f50b70bdef | 1703:b17fb3a4560c |
---|---|
32 | 32 |
33 #include <iostream> | 33 #include <iostream> |
34 #include <set> | 34 #include <set> |
35 | 35 |
36 #include <QRegExp> | 36 #include <QRegExp> |
37 #include <QMutexLocker> | |
37 | 38 |
38 using std::vector; | 39 using std::vector; |
39 | 40 |
40 ModelTransformerFactory * | 41 ModelTransformerFactory * |
41 ModelTransformerFactory::m_instance = new ModelTransformerFactory; | 42 ModelTransformerFactory::m_instance = new ModelTransformerFactory; |
57 AudioPlaySource *source, | 58 AudioPlaySource *source, |
58 sv_frame_t startFrame, | 59 sv_frame_t startFrame, |
59 sv_frame_t duration, | 60 sv_frame_t duration, |
60 UserConfigurator *configurator) | 61 UserConfigurator *configurator) |
61 { | 62 { |
63 QMutexLocker locker(&m_mutex); | |
64 | |
62 ModelTransformer::Input input(nullptr); | 65 ModelTransformer::Input input(nullptr); |
63 | 66 |
64 if (candidateInputModels.empty()) return input; | 67 if (candidateInputModels.empty()) return input; |
65 | 68 |
66 //!!! This will need revision -- we'll have to have a callback | 69 //!!! This will need revision -- we'll have to have a callback |
210 const ModelTransformer::Input &input, | 213 const ModelTransformer::Input &input, |
211 QString &message, | 214 QString &message, |
212 AdditionalModelHandler *handler) | 215 AdditionalModelHandler *handler) |
213 { | 216 { |
214 SVDEBUG << "ModelTransformerFactory::transformMultiple: Constructing transformer with input model " << input.getModel() << endl; | 217 SVDEBUG << "ModelTransformerFactory::transformMultiple: Constructing transformer with input model " << input.getModel() << endl; |
218 | |
219 QMutexLocker locker(&m_mutex); | |
215 | 220 |
216 ModelTransformer *t = createTransformer(transforms, input); | 221 ModelTransformer *t = createTransformer(transforms, input); |
217 if (!t) return vector<Model *>(); | 222 if (!t) return vector<Model *>(); |
218 | 223 |
219 if (handler) { | 224 if (handler) { |
253 } | 258 } |
254 | 259 |
255 void | 260 void |
256 ModelTransformerFactory::transformerFinished() | 261 ModelTransformerFactory::transformerFinished() |
257 { | 262 { |
263 QMutexLocker locker(&m_mutex); | |
264 | |
258 QObject *s = sender(); | 265 QObject *s = sender(); |
259 ModelTransformer *transformer = dynamic_cast<ModelTransformer *>(s); | 266 ModelTransformer *transformer = dynamic_cast<ModelTransformer *>(s); |
260 | 267 |
261 // SVDEBUG << "ModelTransformerFactory::transformerFinished(" << transformer << ")" << endl; | 268 // SVDEBUG << "ModelTransformerFactory::transformerFinished(" << transformer << ")" << endl; |
262 | 269 |
297 void | 304 void |
298 ModelTransformerFactory::modelAboutToBeDeleted(Model *m) | 305 ModelTransformerFactory::modelAboutToBeDeleted(Model *m) |
299 { | 306 { |
300 TransformerSet affected; | 307 TransformerSet affected; |
301 | 308 |
302 for (TransformerSet::iterator i = m_runningTransformers.begin(); | 309 { |
303 i != m_runningTransformers.end(); ++i) { | 310 QMutexLocker locker(&m_mutex); |
304 | 311 |
305 ModelTransformer *t = *i; | 312 for (TransformerSet::iterator i = m_runningTransformers.begin(); |
306 | 313 i != m_runningTransformers.end(); ++i) { |
307 if (t->getInputModel() == m) { | 314 |
308 affected.insert(t); | 315 ModelTransformer *t = *i; |
309 } else { | 316 |
310 vector<Model *> mm = t->getOutputModels(); | 317 if (t->getInputModel() == m) { |
311 for (int i = 0; i < (int)mm.size(); ++i) { | 318 affected.insert(t); |
312 if (mm[i] == m) affected.insert(t); | 319 } else { |
320 vector<Model *> mm = t->getOutputModels(); | |
321 for (int i = 0; i < (int)mm.size(); ++i) { | |
322 if (mm[i] == m) affected.insert(t); | |
323 } | |
313 } | 324 } |
314 } | 325 } |
315 } | 326 } |
316 | 327 |
317 for (TransformerSet::iterator i = affected.begin(); | 328 for (TransformerSet::iterator i = affected.begin(); |
325 // transformerFinished, which will remove from | 336 // transformerFinished, which will remove from |
326 // m_runningTransformers and delete. | 337 // m_runningTransformers and delete. |
327 } | 338 } |
328 } | 339 } |
329 | 340 |
341 bool | |
342 ModelTransformerFactory::haveRunningTransformers() const | |
343 { | |
344 QMutexLocker locker(&m_mutex); | |
345 | |
346 return (!m_runningTransformers.empty()); | |
347 } |