svcore  1.9
Transform.cpp
Go to the documentation of this file.
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4  Sonic Visualiser
5  An audio file viewer and annotation editor.
6  Centre for Digital Music, Queen Mary, University of London.
7  This file copyright 2006-2007 Chris Cannam and QMUL.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of the
12  License, or (at your option) any later version. See the file
13  COPYING included with this distribution for more information.
14 */
15 
16 #include "Transform.h"
17 
19 
21 
22 #include <QXmlAttributes>
23 
24 #include <QDomDocument>
25 #include <QDomElement>
26 #include <QDomNamedNodeMap>
27 #include <QDomAttr>
28 
29 #include <QTextStream>
30 
31 #include <iostream>
32 
34  m_summaryType(NoSummary),
35  m_stepSize(0),
36  m_blockSize(0),
37  m_windowType(HanningWindow),
38  m_sampleRate(0)
39 {
40 }
41 
42 Transform::Transform(QString xml) :
43  m_summaryType(NoSummary),
44  m_stepSize(0),
45  m_blockSize(0),
46  m_windowType(HanningWindow),
47  m_sampleRate(0)
48 {
49  QDomDocument doc;
50 
51  QString error;
52  int errorLine;
53  int errorColumn;
54 
55  if (!doc.setContent(xml, false, &error, &errorLine, &errorColumn)) {
56  cerr << "Transform::Transform: Error in parsing XML: "
57  << error << " at line " << errorLine
58  << ", column " << errorColumn << endl;
59  cerr << "Input follows:" << endl;
60  cerr << xml << endl;
61  cerr << "Input ends." << endl;
62  return;
63  }
64 
65  QDomElement transformElt = doc.firstChildElement("transform");
66  QDomNamedNodeMap attrNodes = transformElt.attributes();
67  QXmlAttributes attrs;
68 
69  for (int i = 0; i < attrNodes.length(); ++i) {
70  QDomAttr attr = attrNodes.item(i).toAttr();
71  if (!attr.isNull()) attrs.append(attr.name(), "", "", attr.value());
72  }
73 
74  setFromXmlAttributes(attrs);
75 
76  for (QDomElement paramElt = transformElt.firstChildElement("parameter");
77  !paramElt.isNull();
78  paramElt = paramElt.nextSiblingElement("parameter")) {
79 
80  QDomNamedNodeMap paramAttrs = paramElt.attributes();
81 
82  QDomAttr nameAttr = paramAttrs.namedItem("name").toAttr();
83  if (nameAttr.isNull() || nameAttr.value() == "") continue;
84 
85  QDomAttr valueAttr = paramAttrs.namedItem("value").toAttr();
86  if (valueAttr.isNull() || valueAttr.value() == "") continue;
87 
88  setParameter(nameAttr.value(), valueAttr.value().toFloat());
89  }
90 
91  for (QDomElement configElt = transformElt.firstChildElement("configuration");
92  !configElt.isNull();
93  configElt = configElt.nextSiblingElement("configuration")) {
94 
95  QDomNamedNodeMap configAttrs = configElt.attributes();
96 
97  QDomAttr nameAttr = configAttrs.namedItem("name").toAttr();
98  if (nameAttr.isNull() || nameAttr.value() == "") continue;
99 
100  QDomAttr valueAttr = configAttrs.namedItem("value").toAttr();
101  if (valueAttr.isNull() || valueAttr.value() == "") continue;
102 
103  setConfigurationValue(nameAttr.value(), valueAttr.value());
104  }
105 }
106 
108 {
109 }
110 
111 bool
113 {
114  bool identical =
115  m_id == t.m_id &&
116  m_parameters == t.m_parameters &&
118  m_program == t.m_program &&
120  m_stepSize == t.m_stepSize &&
121  m_blockSize == t.m_blockSize &&
122  m_windowType == t.m_windowType &&
123  m_startTime == t.m_startTime &&
124  m_duration == t.m_duration &&
126 /*
127  SVDEBUG << "Transform::operator==: identical = " << identical << endl;
128  cerr << "A = " << endl;
129  cerr << toXmlString() << endl;
130  cerr << "B = " << endl;
131  cerr << t.toXmlString() << endl;
132 */
133  return identical;
134 }
135 
136 bool
138 {
139  if (m_id != t.m_id) {
140  return m_id < t.m_id;
141  }
142  if (m_parameters != t.m_parameters) {
143  return mapLessThan<QString, float>(m_parameters, t.m_parameters);
144  }
145  if (m_configuration != t.m_configuration) {
146  return mapLessThan<QString, QString>(m_configuration, t.m_configuration);
147  }
148  if (m_program != t.m_program) {
149  return m_program < t.m_program;
150  }
151  if (m_summaryType != t.m_summaryType) {
152  return int(m_summaryType) < int(t.m_summaryType);
153  }
154  if (m_stepSize != t.m_stepSize) {
155  return m_stepSize < t.m_stepSize;
156  }
157  if (m_blockSize != t.m_blockSize) {
158  return m_blockSize < t.m_blockSize;
159  }
160  if (m_windowType != t.m_windowType) {
161  return m_windowType < t.m_windowType;
162  }
163  if (m_startTime != t.m_startTime) {
164  return m_startTime < t.m_startTime;
165  }
166  if (m_duration != t.m_duration) {
167  return m_duration < t.m_duration;
168  }
169  if (m_sampleRate != t.m_sampleRate) {
170  return m_sampleRate < t.m_sampleRate;
171  }
172  return false;
173 }
174 
175 void
177 {
178  m_id = id;
179 }
180 
183 {
184  return m_id;
185 }
186 
187 QString
188 Transform::createIdentifier(QString type, QString soName, QString label,
189  QString output)
190 {
191  QString pluginId = PluginIdentifier::createIdentifier(type, soName, label);
192  return pluginId + ":" + output;
193 }
194 
195 void
196 Transform::parseIdentifier(QString identifier,
197  QString &type, QString &soName,
198  QString &label, QString &output)
199 {
200  output = identifier.section(':', 3);
201  PluginIdentifier::parseIdentifier(identifier.section(':', 0, 2),
202  type, soName, label);
203 }
204 
207 {
209  return FeatureExtraction;
210  } else {
211  // We don't have an unknown/invalid return value, so always
212  // return this
213  return RealTimeEffect;
214  }
215 }
216 
217 QString
219 {
220  return m_id.section(':', 0, 2);
221 }
222 
223 QString
225 {
226  return m_id.section(':', 3);
227 }
228 
229 void
230 Transform::setPluginIdentifier(QString pluginIdentifier)
231 {
232  m_id = pluginIdentifier + ':' + getOutput();
233 }
234 
235 void
236 Transform::setOutput(QString output)
237 {
238  m_id = getPluginIdentifier() + ':' + output;
239 }
240 
243  QString output)
244 {
245  return pluginIdentifier + ':' + output;
246 }
247 
250 {
251  return m_parameters;
252 }
253 
254 void
256 {
257  m_parameters = pm;
258 }
259 
260 void
261 Transform::setParameter(QString name, float value)
262 {
263 // SVDEBUG << "Transform::setParameter(" << name// << ") -> " << value << endl;
264  m_parameters[name] = value;
265 }
266 
269 {
270  return m_configuration;
271 }
272 
273 void
275 {
276  m_configuration = cm;
277 }
278 
279 void
280 Transform::setConfigurationValue(QString name, QString value)
281 {
282  SVDEBUG << "Transform::setConfigurationValue(" << name << ") -> " << value << endl;
283  m_configuration[name] = value;
284 }
285 
286 QString
288 {
289  return m_pluginVersion;
290 }
291 
292 void
294 {
295  m_pluginVersion = version;
296 }
297 
298 QString
300 {
301  return m_program;
302 }
303 
304 void
305 Transform::setProgram(QString program)
306 {
307  m_program = program;
308 }
309 
312 {
313  return m_summaryType;
314 }
315 
316 void
318 {
319  m_summaryType = type;
320 }
321 
322 int
324 {
325  return m_stepSize;
326 }
327 
328 void
330 {
331  m_stepSize = s;
332 }
333 
334 int
336 {
337  return m_blockSize;
338 }
339 
340 void
342 {
343  m_blockSize = s;
344 }
345 
348 {
349  return m_windowType;
350 }
351 
352 void
354 {
355  m_windowType = type;
356 }
357 
358 RealTime
360 {
361  return m_startTime;
362 }
363 
364 void
366 {
367  m_startTime = t;
368 }
369 
370 RealTime
372 {
373  return m_duration;
374 }
375 
376 void
378 {
379  m_duration = d;
380 }
381 
382 float
384 {
385  return m_sampleRate;
386 }
387 
388 void
390 {
391  m_sampleRate = rate;
392 }
393 
394 void
395 Transform::toXml(QTextStream &out, QString indent, QString extraAttributes) const
396 {
397  out << indent;
398 
399  bool haveContent = true;
400  if (m_parameters.empty() && m_configuration.empty()) haveContent = false;
401 
402  out << QString("<transform\n id=\"%1\"\n pluginVersion=\"%2\"\n program=\"%3\"\n stepSize=\"%4\"\n blockSize=\"%5\"\n windowType=\"%6\"\n startTime=\"%7\"\n duration=\"%8\"\n sampleRate=\"%9\"")
403  .arg(encodeEntities(m_id))
406  .arg(m_stepSize)
407  .arg(m_blockSize)
409  .arg(encodeEntities(m_startTime.toString().c_str()))
410  .arg(encodeEntities(m_duration.toString().c_str()))
411  .arg(m_sampleRate);
412 
413  if (m_summaryType != NoSummary) {
414  out << QString("\n summaryType=\"%1\"").arg(summaryTypeToString(m_summaryType));
415  }
416 
417  if (extraAttributes != "") {
418  out << " " << extraAttributes;
419  }
420 
421  if (haveContent) {
422 
423  out << ">\n";
424 
425  for (ParameterMap::const_iterator i = m_parameters.begin();
426  i != m_parameters.end(); ++i) {
427  out << indent << " "
428  << QString("<parameter name=\"%1\" value=\"%2\"/>\n")
429  .arg(encodeEntities(i->first))
430  .arg(i->second);
431  }
432 
433  for (ConfigurationMap::const_iterator i = m_configuration.begin();
434  i != m_configuration.end(); ++i) {
435  out << indent << " "
436  << QString("<configuration name=\"%1\" value=\"%2\"/>\n")
437  .arg(encodeEntities(i->first))
438  .arg(encodeEntities(i->second));
439  }
440 
441  out << indent << "</transform>\n";
442 
443  } else {
444 
445  out << "/>\n";
446  }
447 }
448 
451 {
452  str = str.toLower();
453  if (str == "minimum" || str == "min") return Minimum;
454  if (str == "maximum" || str == "max") return Maximum;
455  if (str == "mean") return Mean;
456  if (str == "median") return Median;
457  if (str == "mode") return Mode;
458  if (str == "sum") return Sum;
459  if (str == "variance") return Variance;
460  if (str == "standard-deviation" || str == "standardDeviation" ||
461  str == "standard deviation" || str == "sd") return StandardDeviation;
462  if (str == "count") return Count;
463  if (str == "") return NoSummary;
464  SVDEBUG << "Transform::stringToSummaryType: unknown summary type \""
465  << str << "\"" << endl;
466  return NoSummary;
467 }
468 
469 QString
471 {
472  switch (type) {
473  case Minimum: return "min";
474  case Maximum: return "max";
475  case Mean: return "mean";
476  case Median: return "median";
477  case Mode: return "mode";
478  case Sum: return "sum";
479  case Variance: return "variance";
480  case StandardDeviation: return "sd";
481  case Count: return "count";
482  case NoSummary: return "";
483  default:
484  SVDEBUG << "Transform::summaryTypeToString: unexpected summary type "
485  << int(type) << endl;
486  return "";
487  }
488 }
489 
490 void
491 Transform::setFromXmlAttributes(const QXmlAttributes &attrs)
492 {
493  if (attrs.value("id") != "") {
494  setIdentifier(attrs.value("id"));
495  }
496 
497  if (attrs.value("pluginVersion") != "") {
498  setPluginVersion(attrs.value("pluginVersion"));
499  }
500 
501  if (attrs.value("program") != "") {
502  setProgram(attrs.value("program"));
503  }
504 
505  if (attrs.value("stepSize") != "") {
506  setStepSize(attrs.value("stepSize").toInt());
507  }
508 
509  if (attrs.value("blockSize") != "") {
510  setBlockSize(attrs.value("blockSize").toInt());
511  }
512 
513  if (attrs.value("windowType") != "") {
515  (attrs.value("windowType").toStdString()));
516  }
517 
518  if (attrs.value("startTime") != "") {
519  setStartTime(RealTime::fromString(attrs.value("startTime").toStdString()));
520  }
521 
522  if (attrs.value("duration") != "") {
523  setStartTime(RealTime::fromString(attrs.value("duration").toStdString()));
524  }
525 
526  if (attrs.value("sampleRate") != "") {
527  setSampleRate(attrs.value("sampleRate").toFloat());
528  }
529 
530  if (attrs.value("summaryType") != "") {
531  setSummaryType(stringToSummaryType(attrs.value("summaryType")));
532  }
533 }
534 
QString getPluginVersion() const
Definition: Transform.cpp:287
SummaryType getSummaryType() const
Definition: Transform.cpp:311
void setFromXmlAttributes(const QXmlAttributes &)
Set the main transform data from the given XML attributes.
Definition: Transform.cpp:491
static RealTime fromString(std::string)
Convert a string as obtained from toString back to a RealTime object.
Definition: RealTime.cpp:208
Transform()
Construct a new Transform with default data and no identifier.
Definition: Transform.cpp:33
void setSampleRate(float rate)
Definition: Transform.cpp:389
void setDuration(RealTime d)
Definition: Transform.cpp:377
float getSampleRate() const
Definition: Transform.cpp:383
void setWindowType(WindowType type)
Definition: Transform.cpp:353
Definition: Window.h:40
QString getProgram() const
Definition: Transform.cpp:299
const ConfigurationMap & getConfiguration() const
Definition: Transform.cpp:268
WindowType getWindowType() const
Definition: Transform.cpp:347
bool operator==(const Transform &) const
Compare two Transforms.
Definition: Transform.cpp:112
void setPluginVersion(QString version)
Definition: Transform.cpp:293
int m_blockSize
Definition: Transform.h:193
std::map< QString, QString > ConfigurationMap
Definition: Transform.h:91
static void parseIdentifier(QString identifier, QString &type, QString &soName, QString &label)
void setStartTime(RealTime t)
Definition: Transform.cpp:365
float m_sampleRate
Definition: Transform.h:197
static QString createIdentifier(QString type, QString soName, QString label)
int m_stepSize
Definition: Transform.h:192
WindowType
Definition: Window.h:27
static TransformId getIdentifierForPluginOutput(QString pluginIdentifier, QString output="")
Definition: Transform.cpp:242
QString getOutput() const
Definition: Transform.cpp:224
ConfigurationMap m_configuration
Definition: Transform.h:188
WindowType m_windowType
Definition: Transform.h:194
RealTime m_duration
Definition: Transform.h:196
virtual ~Transform()
Definition: Transform.cpp:107
static QString encodeEntities(QString)
static void parseIdentifier(QString identifier, QString &type, QString &soName, QString &label, QString &output)
Definition: Transform.cpp:196
void setOutput(QString output)
Definition: Transform.cpp:236
void setIdentifier(TransformId id)
Definition: Transform.cpp:176
void setPluginIdentifier(QString pluginIdentifier)
Definition: Transform.cpp:230
QString m_program
Definition: Transform.h:191
RealTime getStartTime() const
Definition: Transform.cpp:359
Type getType() const
Definition: Transform.cpp:206
SummaryType m_summaryType
Definition: Transform.h:189
void setConfigurationValue(QString name, QString value)
Definition: Transform.cpp:280
void setConfiguration(const ConfigurationMap &cm)
Definition: Transform.cpp:274
int getStepSize() const
Definition: Transform.cpp:323
void setBlockSize(int s)
Definition: Transform.cpp:341
bool operator<(const Transform &) const
Order two Transforms, so that they can be used as keys in containers.
Definition: Transform.cpp:137
std::map< QString, float > ParameterMap
Definition: Transform.h:85
void toXml(QTextStream &stream, QString indent="", QString extraAttributes="") const
Stream this exportable object out to XML on a text stream.
Definition: Transform.cpp:395
#define SVDEBUG
Definition: Debug.h:42
QString m_pluginVersion
Definition: Transform.h:190
TransformId getIdentifier() const
Definition: Transform.cpp:182
static SummaryType stringToSummaryType(QString)
Definition: Transform.cpp:450
const ParameterMap & getParameters() const
Definition: Transform.cpp:249
void setSummaryType(SummaryType type)
Definition: Transform.cpp:317
static QString createIdentifier(QString type, QString soName, QString label, QString output)
Definition: Transform.cpp:188
ParameterMap m_parameters
Definition: Transform.h:187
int getBlockSize() const
Definition: Transform.cpp:335
void setParameter(QString name, float value)
Definition: Transform.cpp:261
void setProgram(QString program)
Definition: Transform.cpp:305
RealTime m_startTime
Definition: Transform.h:195
std::string toString(bool align=false) const
Return a human-readable debug-type string to full precision (probably not a format to show to a user ...
Definition: RealTime.cpp:191
QString getPluginIdentifier() const
Definition: Transform.cpp:218
QString TransformId
Definition: Transform.h:30
static QString summaryTypeToString(SummaryType)
Definition: Transform.cpp:470
void setStepSize(int s)
Definition: Transform.cpp:329
static FeatureExtractionPluginFactory * instanceFor(QString identifier)
void setParameters(const ParameterMap &pm)
Definition: Transform.cpp:255
TransformId m_id
Definition: Transform.h:163
RealTime represents time values to nanosecond precision with accurate arithmetic and frame-rate conve...
Definition: RealTime.h:35
RealTime getDuration() const
Definition: Transform.cpp:371