annotate sv/transform/TransformFactory.h @ 107:c3ac34b2e45b

correct bugs after DAN review
author lbajardsilogic
date Thu, 13 Sep 2007 12:42:44 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _TRANSFORM_FACTORY_H_
lbajardsilogic@0 17 #define _TRANSFORM_FACTORY_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include "Transform.h"
lbajardsilogic@0 20 #include "PluginTransform.h"
lbajardsilogic@0 21
lbajardsilogic@0 22 #include <map>
lbajardsilogic@0 23 #include <set>
lbajardsilogic@0 24
lbajardsilogic@0 25 namespace Vamp { class PluginBase; }
lbajardsilogic@0 26
lbajardsilogic@0 27 class AudioCallbackPlaySource;
lbajardsilogic@0 28
lbajardsilogic@0 29 class TransformFactory : public QObject
lbajardsilogic@0 30 {
lbajardsilogic@0 31 Q_OBJECT
lbajardsilogic@0 32
lbajardsilogic@0 33 public:
lbajardsilogic@0 34 virtual ~TransformFactory();
lbajardsilogic@0 35
lbajardsilogic@0 36 static TransformFactory *getInstance();
lbajardsilogic@0 37
lbajardsilogic@0 38 // The identifier is intended to be computer-referenceable, and
lbajardsilogic@0 39 // unique within the application. The name is intended to be
lbajardsilogic@0 40 // human readable. In principle it doesn't have to be unique, but
lbajardsilogic@0 41 // the factory will add suffixes to ensure that it is, all the
lbajardsilogic@0 42 // same (just to avoid user confusion). The friendly name is a
lbajardsilogic@0 43 // shorter version of the name. The type is also intended to be
lbajardsilogic@0 44 // user-readable, for use in menus.
lbajardsilogic@0 45
lbajardsilogic@0 46 struct TransformDesc {
lbajardsilogic@0 47
lbajardsilogic@0 48 TransformDesc() { }
lbajardsilogic@0 49 TransformDesc(QString _type, QString _category,
lbajardsilogic@0 50 TransformId _identifier, QString _name,
lbajardsilogic@0 51 QString _friendlyName, QString _description,
lbajardsilogic@0 52 QString _maker, QString _units, bool _configurable) :
lbajardsilogic@0 53 type(_type), category(_category),
lbajardsilogic@0 54 identifier(_identifier), name(_name),
lbajardsilogic@0 55 friendlyName(_friendlyName), description(_description),
lbajardsilogic@0 56 maker(_maker), units(_units), configurable(_configurable) { }
lbajardsilogic@0 57
lbajardsilogic@0 58 QString type; // e.g. feature extraction plugin
lbajardsilogic@0 59 QString category; // e.g. time > onsets
lbajardsilogic@0 60 TransformId identifier; // e.g. vamp:vamp-aubio:aubioonset
lbajardsilogic@0 61 QString name; // plugin's name if 1 output, else "name: output"
lbajardsilogic@0 62 QString friendlyName; // short text for layer name
lbajardsilogic@0 63 QString description; // sentence describing transform
lbajardsilogic@0 64 QString maker;
lbajardsilogic@0 65 QString units;
lbajardsilogic@0 66 bool configurable;
lbajardsilogic@0 67
lbajardsilogic@0 68 bool operator<(const TransformDesc &od) const {
lbajardsilogic@0 69 return (name < od.name);
lbajardsilogic@0 70 };
lbajardsilogic@0 71 };
lbajardsilogic@0 72 typedef std::vector<TransformDesc> TransformList;
lbajardsilogic@0 73
lbajardsilogic@0 74 TransformList getAllTransforms();
lbajardsilogic@0 75
lbajardsilogic@0 76 std::vector<QString> getAllTransformTypes();
lbajardsilogic@0 77
lbajardsilogic@0 78 std::vector<QString> getTransformCategories(QString transformType);
lbajardsilogic@0 79 std::vector<QString> getTransformMakers(QString transformType);
lbajardsilogic@0 80
lbajardsilogic@0 81 /**
lbajardsilogic@0 82 * Get a configuration XML string for the given transform (by
lbajardsilogic@0 83 * asking the user, most likely). Returns the selected input
lbajardsilogic@0 84 * model if the transform is acceptable, 0 if the operation should
lbajardsilogic@0 85 * be cancelled. Audio callback play source may be used to
lbajardsilogic@0 86 * audition effects plugins, if provided.
lbajardsilogic@0 87 */
lbajardsilogic@0 88 Model *getConfigurationForTransform(TransformId identifier,
lbajardsilogic@0 89 const std::vector<Model *> &candidateInputModels,
lbajardsilogic@0 90 PluginTransform::ExecutionContext &context,
lbajardsilogic@0 91 QString &configurationXml,
lbajardsilogic@0 92 AudioCallbackPlaySource *source = 0);
lbajardsilogic@0 93
lbajardsilogic@0 94 /**
lbajardsilogic@0 95 * Get the default execution context for the given transform
lbajardsilogic@0 96 * and input model (if known).
lbajardsilogic@0 97 */
lbajardsilogic@0 98 PluginTransform::ExecutionContext getDefaultContextForTransform(TransformId identifier,
lbajardsilogic@0 99 Model *inputModel = 0);
lbajardsilogic@0 100
lbajardsilogic@0 101 /**
lbajardsilogic@0 102 * Return the output model resulting from applying the named
lbajardsilogic@0 103 * transform to the given input model. The transform may still be
lbajardsilogic@0 104 * working in the background when the model is returned; check the
lbajardsilogic@0 105 * output model's isReady completion status for more details.
lbajardsilogic@0 106 *
lbajardsilogic@0 107 * If the transform is unknown or the input model is not an
lbajardsilogic@0 108 * appropriate type for the given transform, or if some other
lbajardsilogic@0 109 * problem occurs, return 0.
lbajardsilogic@0 110 *
lbajardsilogic@0 111 * The returned model is owned by the caller and must be deleted
lbajardsilogic@0 112 * when no longer needed.
lbajardsilogic@0 113 */
lbajardsilogic@0 114 Model *transform(TransformId identifier, Model *inputModel,
lbajardsilogic@0 115 const PluginTransform::ExecutionContext &context,
lbajardsilogic@0 116 QString configurationXml = "");
lbajardsilogic@0 117
lbajardsilogic@0 118 /**
lbajardsilogic@0 119 * Full name of a transform, suitable for putting on a menu.
lbajardsilogic@0 120 */
lbajardsilogic@0 121 QString getTransformName(TransformId identifier);
lbajardsilogic@0 122
lbajardsilogic@0 123 /**
lbajardsilogic@0 124 * Brief but friendly name of a transform, suitable for use
lbajardsilogic@0 125 * as the name of the output layer.
lbajardsilogic@0 126 */
lbajardsilogic@0 127 QString getTransformFriendlyName(TransformId identifier);
lbajardsilogic@0 128
lbajardsilogic@0 129 QString getTransformUnits(TransformId identifier);
lbajardsilogic@0 130
lbajardsilogic@0 131 /**
lbajardsilogic@0 132 * Return true if the transform has any configurable parameters,
lbajardsilogic@0 133 * i.e. if getConfigurationForTransform can ever return a non-trivial
lbajardsilogic@0 134 * (not equivalent to empty) configuration string.
lbajardsilogic@0 135 */
lbajardsilogic@0 136 bool isTransformConfigurable(TransformId identifier);
lbajardsilogic@0 137
lbajardsilogic@0 138 /**
lbajardsilogic@0 139 * If the transform has a prescribed number or range of channel
lbajardsilogic@0 140 * inputs, return true and set minChannels and maxChannels to the
lbajardsilogic@0 141 * minimum and maximum number of channel inputs the transform can
lbajardsilogic@0 142 * accept. Return false if it doesn't care.
lbajardsilogic@0 143 */
lbajardsilogic@0 144 bool getTransformChannelRange(TransformId identifier,
lbajardsilogic@0 145 int &minChannels, int &maxChannels);
lbajardsilogic@0 146
lbajardsilogic@0 147 protected slots:
lbajardsilogic@0 148 void transformFinished();
lbajardsilogic@0 149
lbajardsilogic@0 150 void modelAboutToBeDeleted(Model *);
lbajardsilogic@0 151
lbajardsilogic@0 152 protected:
lbajardsilogic@0 153 Transform *createTransform(TransformId identifier, Model *inputModel,
lbajardsilogic@0 154 const PluginTransform::ExecutionContext &context,
lbajardsilogic@0 155 QString configurationXml);
lbajardsilogic@0 156
lbajardsilogic@0 157 struct TransformIdent
lbajardsilogic@0 158 {
lbajardsilogic@0 159 TransformId identifier;
lbajardsilogic@0 160 QString configurationXml;
lbajardsilogic@0 161 };
lbajardsilogic@0 162
lbajardsilogic@0 163 typedef std::map<TransformId, QString> TransformConfigurationMap;
lbajardsilogic@0 164 TransformConfigurationMap m_lastConfigurations;
lbajardsilogic@0 165
lbajardsilogic@0 166 typedef std::map<TransformId, TransformDesc> TransformDescriptionMap;
lbajardsilogic@0 167 TransformDescriptionMap m_transforms;
lbajardsilogic@0 168
lbajardsilogic@0 169 typedef std::set<Transform *> TransformSet;
lbajardsilogic@0 170 TransformSet m_runningTransforms;
lbajardsilogic@0 171
lbajardsilogic@0 172 void populateTransforms();
lbajardsilogic@0 173 void populateFeatureExtractionPlugins(TransformDescriptionMap &);
lbajardsilogic@0 174 void populateRealTimePlugins(TransformDescriptionMap &);
lbajardsilogic@0 175
lbajardsilogic@0 176 bool getChannelRange(TransformId identifier,
lbajardsilogic@0 177 Vamp::PluginBase *plugin, int &min, int &max);
lbajardsilogic@0 178
lbajardsilogic@0 179 static TransformFactory *m_instance;
lbajardsilogic@0 180 };
lbajardsilogic@0 181
lbajardsilogic@0 182
lbajardsilogic@0 183 #endif