Mercurial > hg > svcore
diff transform/ModelTransformerFactory.h @ 911:73c2fd9a7dbe
Merge from branch tony_integration
author | Chris Cannam |
---|---|
date | Wed, 14 May 2014 09:54:20 +0100 |
parents | a2689db084f4 |
children | 85879408f665 06579b8ffb7b |
line wrap: on
line diff
--- a/transform/ModelTransformerFactory.h Wed May 07 15:17:58 2014 +0100 +++ b/transform/ModelTransformerFactory.h Wed May 14 09:54:20 2014 +0100 @@ -18,6 +18,7 @@ #include "Transform.h" #include "TransformDescription.h" +#include "FeatureExtractionModelTransformer.h" #include "ModelTransformer.h" @@ -26,6 +27,7 @@ #include <QMap> #include <map> #include <set> +#include <vector> class AudioPlaySource; @@ -68,6 +70,15 @@ size_t startFrame = 0, size_t duration = 0, UserConfigurator *configurator = 0); + + class AdditionalModelHandler { + public: + virtual ~AdditionalModelHandler() { } + + // Exactly one of these functions will be called + virtual void moreModelsAvailable(std::vector<Model *> models) = 0; + virtual void noMoreModelsAvailable() = 0; + }; /** * Return the output model resulting from applying the named @@ -80,12 +91,54 @@ * problem occurs, return 0. Set message if there is any error or * warning to report. * + * Some transforms may return additional models at the end of + * processing. (For example, a transform that splits an output + * into multiple one-per-bin models.) If an additionalModelHandler + * is provided here, its moreModelsAvailable method will be called + * when those models become available, and ownership of those + * models will be transferred to the handler. Otherwise (if the + * handler is null) any such models will be discarded. + * * The returned model is owned by the caller and must be deleted * when no longer needed. */ Model *transform(const Transform &transform, const ModelTransformer::Input &input, - QString &message); + QString &message, + AdditionalModelHandler *handler = 0); + + /** + * Return the multiple output models resulting from applying the + * named transforms to the given input model. The transforms may + * differ only in output identifier for the plugin: they must all + * use the same plugin, parameters, and programs. The plugin will + * be run once only, but more than one output will be harvested + * (as appropriate). Models will be returned in the same order as + * the transforms were given. The plugin may still be working in + * the background when the model is returned; check the output + * models' isReady completion statuses for more details. + * + * If a transform is unknown or the transforms are insufficiently + * closely related or the input model is not an appropriate type + * for the given transform, or if some other problem occurs, + * return 0. Set message if there is any error or warning to + * report. + * + * Some transforms may return additional models at the end of + * processing. (For example, a transform that splits an output + * into multiple one-per-bin models.) If an additionalModelHandler + * is provided here, its moreModelsAvailable method will be called + * when those models become available, and ownership of those + * models will be transferred to the handler. Otherwise (if the + * handler is null) any such models will be discarded. + * + * The returned models are owned by the caller and must be deleted + * when no longer needed. + */ + std::vector<Model *> transformMultiple(const Transforms &transform, + const ModelTransformer::Input &input, + QString &message, + AdditionalModelHandler *handler = 0); protected slots: void transformerFinished(); @@ -93,7 +146,7 @@ void modelAboutToBeDeleted(Model *); protected: - ModelTransformer *createTransformer(const Transform &transform, + ModelTransformer *createTransformer(const Transforms &transforms, const ModelTransformer::Input &input); typedef std::map<TransformId, QString> TransformerConfigurationMap; @@ -102,6 +155,9 @@ typedef std::set<ModelTransformer *> TransformerSet; TransformerSet m_runningTransformers; + typedef std::map<ModelTransformer *, AdditionalModelHandler *> HandlerMap; + HandlerMap m_handlers; + static ModelTransformerFactory *m_instance; };