lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam and QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _TRANSFORM_FACTORY_H_ lbajardsilogic@0: #define _TRANSFORM_FACTORY_H_ lbajardsilogic@0: lbajardsilogic@0: #include "Transform.h" lbajardsilogic@0: #include "PluginTransform.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: namespace Vamp { class PluginBase; } lbajardsilogic@0: lbajardsilogic@0: class AudioCallbackPlaySource; lbajardsilogic@0: lbajardsilogic@0: class TransformFactory : public QObject lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: virtual ~TransformFactory(); lbajardsilogic@0: lbajardsilogic@0: static TransformFactory *getInstance(); lbajardsilogic@0: lbajardsilogic@0: // The identifier is intended to be computer-referenceable, and lbajardsilogic@0: // unique within the application. The name is intended to be lbajardsilogic@0: // human readable. In principle it doesn't have to be unique, but lbajardsilogic@0: // the factory will add suffixes to ensure that it is, all the lbajardsilogic@0: // same (just to avoid user confusion). The friendly name is a lbajardsilogic@0: // shorter version of the name. The type is also intended to be lbajardsilogic@0: // user-readable, for use in menus. lbajardsilogic@0: lbajardsilogic@0: struct TransformDesc { lbajardsilogic@0: lbajardsilogic@0: TransformDesc() { } lbajardsilogic@0: TransformDesc(QString _type, QString _category, lbajardsilogic@0: TransformId _identifier, QString _name, lbajardsilogic@0: QString _friendlyName, QString _description, lbajardsilogic@0: QString _maker, QString _units, bool _configurable) : lbajardsilogic@0: type(_type), category(_category), lbajardsilogic@0: identifier(_identifier), name(_name), lbajardsilogic@0: friendlyName(_friendlyName), description(_description), lbajardsilogic@0: maker(_maker), units(_units), configurable(_configurable) { } lbajardsilogic@0: lbajardsilogic@0: QString type; // e.g. feature extraction plugin lbajardsilogic@0: QString category; // e.g. time > onsets lbajardsilogic@0: TransformId identifier; // e.g. vamp:vamp-aubio:aubioonset lbajardsilogic@0: QString name; // plugin's name if 1 output, else "name: output" lbajardsilogic@0: QString friendlyName; // short text for layer name lbajardsilogic@0: QString description; // sentence describing transform lbajardsilogic@0: QString maker; lbajardsilogic@0: QString units; lbajardsilogic@0: bool configurable; lbajardsilogic@0: lbajardsilogic@0: bool operator<(const TransformDesc &od) const { lbajardsilogic@0: return (name < od.name); lbajardsilogic@0: }; lbajardsilogic@0: }; lbajardsilogic@0: typedef std::vector TransformList; lbajardsilogic@0: lbajardsilogic@0: TransformList getAllTransforms(); lbajardsilogic@0: lbajardsilogic@0: std::vector getAllTransformTypes(); lbajardsilogic@0: lbajardsilogic@0: std::vector getTransformCategories(QString transformType); lbajardsilogic@0: std::vector getTransformMakers(QString transformType); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Get a configuration XML string for the given transform (by lbajardsilogic@0: * asking the user, most likely). Returns the selected input lbajardsilogic@0: * model if the transform is acceptable, 0 if the operation should lbajardsilogic@0: * be cancelled. Audio callback play source may be used to lbajardsilogic@0: * audition effects plugins, if provided. lbajardsilogic@0: */ lbajardsilogic@0: Model *getConfigurationForTransform(TransformId identifier, lbajardsilogic@0: const std::vector &candidateInputModels, lbajardsilogic@0: PluginTransform::ExecutionContext &context, lbajardsilogic@0: QString &configurationXml, lbajardsilogic@0: AudioCallbackPlaySource *source = 0); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Get the default execution context for the given transform lbajardsilogic@0: * and input model (if known). lbajardsilogic@0: */ lbajardsilogic@0: PluginTransform::ExecutionContext getDefaultContextForTransform(TransformId identifier, lbajardsilogic@0: Model *inputModel = 0); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the output model resulting from applying the named lbajardsilogic@0: * transform to the given input model. The transform may still be lbajardsilogic@0: * working in the background when the model is returned; check the lbajardsilogic@0: * output model's isReady completion status for more details. lbajardsilogic@0: * lbajardsilogic@0: * If the transform is unknown or the input model is not an lbajardsilogic@0: * appropriate type for the given transform, or if some other lbajardsilogic@0: * problem occurs, return 0. lbajardsilogic@0: * lbajardsilogic@0: * The returned model is owned by the caller and must be deleted lbajardsilogic@0: * when no longer needed. lbajardsilogic@0: */ lbajardsilogic@0: Model *transform(TransformId identifier, Model *inputModel, lbajardsilogic@0: const PluginTransform::ExecutionContext &context, lbajardsilogic@0: QString configurationXml = ""); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Full name of a transform, suitable for putting on a menu. lbajardsilogic@0: */ lbajardsilogic@0: QString getTransformName(TransformId identifier); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Brief but friendly name of a transform, suitable for use lbajardsilogic@0: * as the name of the output layer. lbajardsilogic@0: */ lbajardsilogic@0: QString getTransformFriendlyName(TransformId identifier); lbajardsilogic@0: lbajardsilogic@0: QString getTransformUnits(TransformId identifier); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return true if the transform has any configurable parameters, lbajardsilogic@0: * i.e. if getConfigurationForTransform can ever return a non-trivial lbajardsilogic@0: * (not equivalent to empty) configuration string. lbajardsilogic@0: */ lbajardsilogic@0: bool isTransformConfigurable(TransformId identifier); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * If the transform has a prescribed number or range of channel lbajardsilogic@0: * inputs, return true and set minChannels and maxChannels to the lbajardsilogic@0: * minimum and maximum number of channel inputs the transform can lbajardsilogic@0: * accept. Return false if it doesn't care. lbajardsilogic@0: */ lbajardsilogic@0: bool getTransformChannelRange(TransformId identifier, lbajardsilogic@0: int &minChannels, int &maxChannels); lbajardsilogic@0: lbajardsilogic@0: protected slots: lbajardsilogic@0: void transformFinished(); lbajardsilogic@0: lbajardsilogic@0: void modelAboutToBeDeleted(Model *); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: Transform *createTransform(TransformId identifier, Model *inputModel, lbajardsilogic@0: const PluginTransform::ExecutionContext &context, lbajardsilogic@0: QString configurationXml); lbajardsilogic@0: lbajardsilogic@0: struct TransformIdent lbajardsilogic@0: { lbajardsilogic@0: TransformId identifier; lbajardsilogic@0: QString configurationXml; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: typedef std::map TransformConfigurationMap; lbajardsilogic@0: TransformConfigurationMap m_lastConfigurations; lbajardsilogic@0: lbajardsilogic@0: typedef std::map TransformDescriptionMap; lbajardsilogic@0: TransformDescriptionMap m_transforms; lbajardsilogic@0: lbajardsilogic@0: typedef std::set TransformSet; lbajardsilogic@0: TransformSet m_runningTransforms; lbajardsilogic@0: lbajardsilogic@0: void populateTransforms(); lbajardsilogic@0: void populateFeatureExtractionPlugins(TransformDescriptionMap &); lbajardsilogic@0: void populateRealTimePlugins(TransformDescriptionMap &); lbajardsilogic@0: lbajardsilogic@0: bool getChannelRange(TransformId identifier, lbajardsilogic@0: Vamp::PluginBase *plugin, int &min, int &max); lbajardsilogic@0: lbajardsilogic@0: static TransformFactory *m_instance; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: #endif