annotate transform/TransformFactory.h @ 193:4e030ebb6b36

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