annotate transform/Transform.h @ 1078:ce82bcdc95d0

Fail upfront if the file is going to be too large. We expect the caller to split up large data sets into several MatrixFiles
author Chris Cannam
date Wed, 10 Jun 2015 13:10:26 +0100
parents 26cf6d5251ec
children a2dbedc0cfee
rev   line source
Chris@320 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@320 2
Chris@320 3 /*
Chris@320 4 Sonic Visualiser
Chris@320 5 An audio file viewer and annotation editor.
Chris@320 6 Centre for Digital Music, Queen Mary, University of London.
Chris@328 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@320 8
Chris@320 9 This program is free software; you can redistribute it and/or
Chris@320 10 modify it under the terms of the GNU General Public License as
Chris@320 11 published by the Free Software Foundation; either version 2 of the
Chris@320 12 License, or (at your option) any later version. See the file
Chris@320 13 COPYING included with this distribution for more information.
Chris@320 14 */
Chris@320 15
Chris@320 16 #ifndef _TRANSFORM_H_
Chris@320 17 #define _TRANSFORM_H_
Chris@320 18
Chris@328 19 #include "base/XmlExportable.h"
Chris@328 20 #include "base/Window.h"
Chris@350 21 #include "base/RealTime.h"
Chris@328 22
Chris@486 23 #include <vamp-hostsdk/PluginBase.h>
Chris@486 24
Chris@328 25 #include <QString>
Chris@320 26
Chris@400 27 #include <map>
Chris@848 28 #include <vector>
Chris@400 29
Chris@320 30 typedef QString TransformId;
Chris@320 31
Chris@350 32 class QXmlAttributes;
Chris@350 33
Chris@328 34 class Transform : public XmlExportable
Chris@320 35 {
Chris@320 36 public:
Chris@350 37 /**
Chris@350 38 * Construct a new Transform with default data and no identifier.
Chris@350 39 * The Transform object will be meaningless until some data and an
Chris@350 40 * identifier have been set on it.
Chris@350 41 *
Chris@350 42 * To construct a Transform for use with a particular transform
Chris@350 43 * identifier, use TransformFactory::getDefaultTransformFor.
Chris@350 44 */
Chris@328 45 Transform();
Chris@350 46
Chris@350 47 /**
Chris@350 48 * Construct a Transform by parsing the given XML data string.
Chris@350 49 * This is the inverse of toXml.
Chris@350 50 */
Chris@350 51 Transform(QString xml);
Chris@350 52
Chris@320 53 virtual ~Transform();
Chris@320 54
Chris@350 55 /**
Chris@350 56 * Compare two Transforms. They only compare equal if every data
Chris@350 57 * element matches.
Chris@350 58 */
Chris@400 59 bool operator==(const Transform &) const;
Chris@400 60
Chris@400 61 /**
Chris@400 62 * Order two Transforms, so that they can be used as keys in
Chris@400 63 * containers.
Chris@400 64 */
Chris@400 65 bool operator<(const Transform &) const;
Chris@350 66
Chris@350 67 void setIdentifier(TransformId id);
Chris@350 68 TransformId getIdentifier() const;
Chris@320 69
Chris@328 70 enum Type { FeatureExtraction, RealTimeEffect };
Chris@328 71
Chris@328 72 Type getType() const;
Chris@328 73 QString getPluginIdentifier() const;
Chris@328 74 QString getOutput() const;
Chris@353 75
Chris@353 76 void setPluginIdentifier(QString pluginIdentifier);
Chris@353 77 void setOutput(QString output);
Chris@353 78
Chris@353 79 // Turn a plugin ID and output name into a transform ID. Note
Chris@353 80 // that our pluginIdentifier is the same thing as the Vamp SDK's
Chris@353 81 // PluginLoader::PluginKey.
Chris@353 82 static TransformId getIdentifierForPluginOutput(QString pluginIdentifier,
Chris@353 83 QString output = "");
Chris@328 84
Chris@328 85 typedef std::map<QString, float> ParameterMap;
Chris@328 86
Chris@350 87 const ParameterMap &getParameters() const;
Chris@350 88 void setParameters(const ParameterMap &pm);
Chris@350 89 void setParameter(QString name, float value);
Chris@328 90
Chris@328 91 typedef std::map<QString, QString> ConfigurationMap;
Chris@328 92
Chris@350 93 const ConfigurationMap &getConfiguration() const;
Chris@350 94 void setConfiguration(const ConfigurationMap &cm);
Chris@350 95 void setConfigurationValue(QString name, QString value);
Chris@328 96
Chris@508 97 enum SummaryType {
Chris@508 98
Chris@508 99 // This is the same as Vamp::PluginSummarisingAdapter::SummaryType
Chris@508 100 // except with NoSummary instead of UnknownSummaryType
Chris@508 101
Chris@508 102 Minimum = 0,
Chris@508 103 Maximum = 1,
Chris@508 104 Mean = 2,
Chris@508 105 Median = 3,
Chris@508 106 Mode = 4,
Chris@508 107 Sum = 5,
Chris@508 108 Variance = 6,
Chris@508 109 StandardDeviation = 7,
Chris@508 110 Count = 8,
Chris@508 111
Chris@508 112 NoSummary = 999
Chris@508 113 };
Chris@508 114 SummaryType getSummaryType() const;
Chris@508 115 void setSummaryType(SummaryType type);
Chris@508 116
Chris@366 117 QString getPluginVersion() const;
Chris@366 118 void setPluginVersion(QString version);
Chris@366 119
Chris@350 120 QString getProgram() const;
Chris@350 121 void setProgram(QString program);
Chris@328 122
Chris@930 123 int getStepSize() const;
Chris@930 124 void setStepSize(int s);
Chris@328 125
Chris@930 126 int getBlockSize() const;
Chris@930 127 void setBlockSize(int s);
Chris@328 128
Chris@350 129 WindowType getWindowType() const;
Chris@350 130 void setWindowType(WindowType type);
Chris@350 131
Chris@350 132 RealTime getStartTime() const;
Chris@350 133 void setStartTime(RealTime t);
Chris@350 134
Chris@350 135 RealTime getDuration() const; // 0 -> all
Chris@350 136 void setDuration(RealTime d);
Chris@350 137
Chris@1047 138 sv_samplerate_t getSampleRate() const; // 0 -> as input
Chris@1047 139 void setSampleRate(sv_samplerate_t rate);
Chris@328 140
Chris@328 141 void toXml(QTextStream &stream, QString indent = "",
Chris@328 142 QString extraAttributes = "") const;
Chris@328 143
Chris@350 144 /**
Chris@350 145 * Set the main transform data from the given XML attributes.
Chris@350 146 * This does not set the parameters or configuration, which are
Chris@350 147 * exported to separate XML elements rather than attributes of the
Chris@350 148 * transform element.
Chris@366 149 *
Chris@366 150 * Note that this only sets those attributes which are actually
Chris@366 151 * present in the argument. Any attributes not defined in the
Chris@366 152 * attribute will remain unchanged in the Transform. If your aim
Chris@366 153 * is to create a transform exactly matching the given attributes,
Chris@366 154 * ensure you start from an empty transform rather than one that
Chris@366 155 * has already been configured.
Chris@350 156 */
Chris@350 157 void setFromXmlAttributes(const QXmlAttributes &);
Chris@320 158
Chris@508 159 static SummaryType stringToSummaryType(QString);
Chris@508 160 static QString summaryTypeToString(SummaryType);
Chris@508 161
Chris@320 162 protected:
Chris@328 163 TransformId m_id; // pluginid:output, that is type:soname:label:output
Chris@328 164
Chris@328 165 static QString createIdentifier
Chris@328 166 (QString type, QString soName, QString label, QString output);
Chris@320 167
Chris@328 168 static void parseIdentifier
Chris@328 169 (QString identifier,
Chris@328 170 QString &type, QString &soName, QString &label, QString &output);
Chris@328 171
Chris@400 172 template <typename A, typename B>
Chris@400 173 bool mapLessThan(const std::map<A, B> &a, const std::map<A, B> &b) const {
Chris@400 174 // Return true if a is "less than" b. Ordering doesn't have
Chris@400 175 // to be meaningful, just consistent.
Chris@400 176 typename std::map<A, B>::const_iterator i;
Chris@400 177 typename std::map<A, B>::const_iterator j;
Chris@400 178 for (i = a.begin(), j = b.begin(); i != a.end(); ++i) {
Chris@400 179 if (j == b.end()) return false; // a is longer than b
Chris@400 180 if (i->first != j->first) return i->first < j->first;
Chris@400 181 if (i->second != j->second) return i->second < j->second;
Chris@400 182 }
Chris@400 183 if (j != b.end()) return true; // a is shorter than b
Chris@400 184 return false; // equal
Chris@400 185 }
Chris@400 186
Chris@328 187 ParameterMap m_parameters;
Chris@328 188 ConfigurationMap m_configuration;
Chris@508 189 SummaryType m_summaryType;
Chris@366 190 QString m_pluginVersion;
Chris@328 191 QString m_program;
Chris@930 192 int m_stepSize;
Chris@930 193 int m_blockSize;
Chris@328 194 WindowType m_windowType;
Chris@350 195 RealTime m_startTime;
Chris@350 196 RealTime m_duration;
Chris@1047 197 sv_samplerate_t m_sampleRate;
Chris@320 198 };
Chris@320 199
Chris@848 200 typedef std::vector<Transform> Transforms;
Chris@848 201
Chris@320 202 #endif
Chris@328 203