annotate transform/TransformFactory.h @ 537:3cc4b7cd2aa5

* Merge from one-fftdataserver-per-fftmodel branch. This bit of reworking (which is not described very accurately by the title of the branch) turns the MatrixFile object into something that either reads or writes, but not both, and separates the FFT file cache reader and writer implementations separately. This allows the FFT data server to have a single thread owning writers and one reader per "customer" thread, and for all locking to be vastly simplified and concentrated in the data server alone (because none of the classes it makes use of is used in more than one thread at a time). The result is faster and more trustworthy code.
author Chris Cannam
date Tue, 27 Jan 2009 13:25:10 +0000
parents 1b8c748fd7ea
children 2d551c765d51
rev   line source
Chris@330 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@330 2
Chris@330 3 /*
Chris@330 4 Sonic Visualiser
Chris@330 5 An audio file viewer and annotation editor.
Chris@330 6 Centre for Digital Music, Queen Mary, University of London.
Chris@330 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@330 8
Chris@330 9 This program is free software; you can redistribute it and/or
Chris@330 10 modify it under the terms of the GNU General Public License as
Chris@330 11 published by the Free Software Foundation; either version 2 of the
Chris@330 12 License, or (at your option) any later version. See the file
Chris@330 13 COPYING included with this distribution for more information.
Chris@330 14 */
Chris@330 15
Chris@330 16 #ifndef _TRANSFORM_FACTORY_H_
Chris@330 17 #define _TRANSFORM_FACTORY_H_
Chris@330 18
Chris@330 19 #include "TransformDescription.h"
Chris@330 20
Chris@457 21 #include "base/TextMatcher.h"
Chris@457 22
Chris@475 23 #include <vamp-hostsdk/Plugin.h>
Chris@350 24
Chris@387 25 #include <QObject>
Chris@443 26 #include <QStringList>
Chris@460 27 #include <QThread>
Chris@460 28 #include <QMutex>
Chris@387 29
Chris@330 30 #include <map>
Chris@330 31 #include <set>
Chris@330 32
Chris@330 33 class TransformFactory : public QObject
Chris@330 34 {
Chris@330 35 Q_OBJECT
Chris@330 36
Chris@330 37 public:
Chris@457 38 TransformFactory();
Chris@330 39 virtual ~TransformFactory();
Chris@330 40
Chris@330 41 static TransformFactory *getInstance();
Chris@330 42
Chris@477 43 /**
Chris@477 44 * TransformFactory has a background thread that can populate
Chris@477 45 * uninstalled transforms from network RDF resources. It is not
Chris@477 46 * started by default, but it's a good idea to start it when the
Chris@477 47 * program starts up, if the uninstalled transforms may be of use
Chris@477 48 * later; otherwise there will be a bottleneck the first time
Chris@477 49 * they're requested.
Chris@477 50 *
Chris@477 51 * If this thread is not already running, start it now.
Chris@477 52 */
Chris@477 53 void startPopulationThread();
Chris@477 54
Chris@350 55 TransformList getAllTransformDescriptions();
Chris@350 56 TransformDescription getTransformDescription(TransformId id);
Chris@485 57 bool haveInstalledTransforms();
Chris@330 58
Chris@457 59 TransformList getUninstalledTransformDescriptions();
Chris@457 60 TransformDescription getUninstalledTransformDescription(TransformId id);
Chris@485 61 bool haveUninstalledTransforms(bool waitForCheckToComplete = false);
Chris@457 62
Chris@457 63 typedef enum {
Chris@457 64 TransformUnknown,
Chris@457 65 TransformInstalled,
Chris@457 66 TransformNotInstalled
Chris@457 67 } TransformInstallStatus;
Chris@457 68
Chris@457 69 TransformInstallStatus getTransformInstallStatus(TransformId id);
Chris@457 70
Chris@487 71 std::vector<TransformDescription::Type> getAllTransformTypes();
Chris@487 72 std::vector<QString> getTransformCategories(TransformDescription::Type);
Chris@487 73 std::vector<QString> getTransformMakers(TransformDescription::Type);
Chris@487 74 QString getTransformTypeName(TransformDescription::Type) const;
Chris@330 75
Chris@457 76 typedef std::map<TransformId, TextMatcher::Match> SearchResults;
Chris@443 77 SearchResults search(QString keyword);
Chris@443 78 SearchResults search(QStringList keywords);
Chris@443 79
Chris@330 80 /**
Chris@330 81 * Return true if the given transform is known.
Chris@330 82 */
Chris@330 83 bool haveTransform(TransformId identifier);
Chris@330 84
Chris@330 85 /**
Chris@350 86 * A single transform ID can lead to many possible Transforms,
Chris@350 87 * with different parameters and execution context settings.
Chris@350 88 * Return the default one for the given transform.
Chris@350 89 */
Chris@350 90 Transform getDefaultTransformFor(TransformId identifier, size_t rate = 0);
Chris@350 91
Chris@350 92 /**
Chris@330 93 * Full name of a transform, suitable for putting on a menu.
Chris@330 94 */
Chris@330 95 QString getTransformName(TransformId identifier);
Chris@330 96
Chris@330 97 /**
Chris@330 98 * Brief but friendly name of a transform, suitable for use
Chris@330 99 * as the name of the output layer.
Chris@330 100 */
Chris@330 101 QString getTransformFriendlyName(TransformId identifier);
Chris@330 102
Chris@330 103 QString getTransformUnits(TransformId identifier);
Chris@330 104
Chris@472 105 QString getTransformInfoUrl(TransformId identifier);
Chris@472 106
Chris@350 107 Vamp::Plugin::InputDomain getTransformInputDomain(TransformId identifier);
Chris@350 108
Chris@330 109 /**
Chris@330 110 * Return true if the transform has any configurable parameters,
Chris@330 111 * i.e. if getConfigurationForTransform can ever return a non-trivial
Chris@330 112 * (not equivalent to empty) configuration string.
Chris@330 113 */
Chris@330 114 bool isTransformConfigurable(TransformId identifier);
Chris@330 115
Chris@330 116 /**
Chris@330 117 * If the transform has a prescribed number or range of channel
Chris@330 118 * inputs, return true and set minChannels and maxChannels to the
Chris@330 119 * minimum and maximum number of channel inputs the transform can
Chris@330 120 * accept. Return false if it doesn't care.
Chris@330 121 */
Chris@330 122 bool getTransformChannelRange(TransformId identifier,
Chris@330 123 int &minChannels, int &maxChannels);
Chris@332 124
Chris@332 125 /**
Chris@351 126 * Load an appropriate plugin for the given transform and set the
Chris@351 127 * parameters, program and configuration strings on that plugin
Chris@351 128 * from the Transform object.
Chris@351 129 *
Chris@351 130 * Note that this requires that the transform has a meaningful
Chris@351 131 * sample rate set, as that is used as the rate for the plugin. A
Chris@351 132 * Transform can legitimately have rate set at zero (= "use the
Chris@351 133 * rate of the input source"), so the caller will need to test for
Chris@351 134 * this case.
Chris@351 135 *
Chris@351 136 * Returns the plugin thus loaded. This will be a
Chris@351 137 * Vamp::PluginBase, but not necessarily a Vamp::Plugin (only if
Chris@351 138 * the transform was a feature-extraction type -- call
Chris@351 139 * downcastVampPlugin if you only want Vamp::Plugins). Returns
Chris@351 140 * NULL if no suitable plugin was available.
Chris@352 141 *
Chris@352 142 * The returned plugin is owned by the caller, and should be
Chris@352 143 * deleted (using "delete") when no longer needed.
Chris@351 144 */
Chris@351 145 Vamp::PluginBase *instantiatePluginFor(const Transform &transform);
Chris@351 146
Chris@351 147 /**
Chris@351 148 * Convert a Vamp::PluginBase to a Vamp::Plugin, if it is one.
Chris@351 149 * Return NULL otherwise. This ill-fitting convenience function
Chris@351 150 * is really just a dynamic_cast wrapper.
Chris@351 151 */
Chris@351 152 Vamp::Plugin *downcastVampPlugin(Vamp::PluginBase *);
Chris@351 153
Chris@351 154 /**
Chris@332 155 * Set the plugin parameters, program and configuration strings on
Chris@332 156 * the given Transform object from the given plugin instance.
Chris@332 157 * Note that no check is made whether the plugin is actually the
Chris@332 158 * "correct" one for the transform.
Chris@332 159 */
Chris@332 160 void setParametersFromPlugin(Transform &transform, Vamp::PluginBase *plugin);
Chris@332 161
Chris@332 162 /**
Chris@350 163 * Set the parameters, program and configuration strings on the
Chris@350 164 * given plugin from the given Transform object.
Chris@350 165 */
Chris@350 166 void setPluginParameters(const Transform &transform, Vamp::PluginBase *plugin);
Chris@350 167
Chris@350 168 /**
Chris@332 169 * If the given Transform object has no processing step and block
Chris@332 170 * sizes set, set them to appropriate defaults for the given
Chris@332 171 * plugin.
Chris@332 172 */
Chris@332 173 void makeContextConsistentWithPlugin(Transform &transform, Vamp::PluginBase *plugin);
Chris@332 174
Chris@332 175 /**
Chris@350 176 * Retrieve a <plugin ... /> XML fragment that describes the
Chris@350 177 * plugin parameters, program and configuration data for the given
Chris@350 178 * transform.
Chris@350 179 *
Chris@350 180 * This function is provided for backward compatibility only. Use
Chris@350 181 * Transform::toXml where compatibility with PluginXml
Chris@350 182 * descriptions of transforms is not required.
Chris@332 183 */
Chris@350 184 QString getPluginConfigurationXml(const Transform &transform);
Chris@350 185
Chris@350 186 /**
Chris@350 187 * Set the plugin parameters, program and configuration strings on
Chris@350 188 * the given Transform object from the given <plugin ... /> XML
Chris@350 189 * fragment.
Chris@350 190 *
Chris@350 191 * This function is provided for backward compatibility only. Use
Chris@350 192 * Transform(QString) where compatibility with PluginXml
Chris@350 193 * descriptions of transforms is not required.
Chris@350 194 */
Chris@350 195 void setParametersFromPluginConfigurationXml(Transform &transform,
Chris@350 196 QString xml);
Chris@332 197
Chris@330 198 protected:
Chris@330 199 typedef std::map<TransformId, TransformDescription> TransformDescriptionMap;
Chris@457 200
Chris@330 201 TransformDescriptionMap m_transforms;
Chris@457 202 bool m_transformsPopulated;
Chris@457 203
Chris@457 204 TransformDescriptionMap m_uninstalledTransforms;
Chris@457 205 bool m_uninstalledTransformsPopulated;
Chris@330 206
Chris@330 207 void populateTransforms();
Chris@457 208 void populateUninstalledTransforms();
Chris@330 209 void populateFeatureExtractionPlugins(TransformDescriptionMap &);
Chris@330 210 void populateRealTimePlugins(TransformDescriptionMap &);
Chris@330 211
Chris@351 212 Vamp::PluginBase *instantiateDefaultPluginFor(TransformId id, size_t rate);
Chris@460 213 QMutex m_transformsMutex;
Chris@460 214 QMutex m_uninstalledTransformsMutex;
Chris@460 215
Chris@460 216 class UninstalledTransformsPopulateThread : public QThread
Chris@460 217 {
Chris@460 218 public:
Chris@460 219 UninstalledTransformsPopulateThread(TransformFactory *factory) :
Chris@460 220 m_factory(factory) {
Chris@460 221 }
Chris@481 222 virtual void run();
Chris@460 223 TransformFactory *m_factory;
Chris@460 224 };
Chris@460 225
Chris@477 226 UninstalledTransformsPopulateThread *m_thread;
Chris@479 227 bool m_populatingSlowly;
Chris@477 228
Chris@330 229 static TransformFactory *m_instance;
Chris@330 230 };
Chris@330 231
Chris@330 232
Chris@330 233 #endif