annotate sv/document/SVFileReader.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 7bd5773d4372
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 #include "SVFileReader.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "layer/Layer.h"
lbajardsilogic@0 19 #include "view/View.h"
lbajardsilogic@0 20 #include "base/PlayParameters.h"
lbajardsilogic@0 21 #include "base/PlayParameterRepository.h"
lbajardsilogic@0 22
lbajardsilogic@0 23 #include "data/fileio/AudioFileReaderFactory.h"
lbajardsilogic@0 24 #include "data/fileio/FileFinder.h"
lbajardsilogic@0 25 #include "data/fileio/RemoteFile.h"
lbajardsilogic@0 26
lbajardsilogic@0 27 #include "data/model/WaveFileModel.h"
lbajardsilogic@0 28 #include "data/model/EditableDenseThreeDimensionalModel.h"
lbajardsilogic@0 29 #include "data/model/SparseOneDimensionalModel.h"
lbajardsilogic@0 30 #include "data/model/SparseTimeValueModel.h"
lbajardsilogic@0 31 #include "data/model/NoteModel.h"
lbajardsilogic@0 32 #include "data/model/TextModel.h"
lbajardsilogic@47 33 #include "data/model/IntervalModel.h"
lbajardsilogic@0 34
lbajardsilogic@0 35 #include "view/Pane.h"
lbajardsilogic@0 36
lbajardsilogic@0 37 #include "Document.h"
lbajardsilogic@0 38
lbajardsilogic@0 39 #include <QString>
lbajardsilogic@0 40 #include <QMessageBox>
lbajardsilogic@0 41 #include <QFileDialog>
lbajardsilogic@0 42
lbajardsilogic@0 43 #include <iostream>
lbajardsilogic@0 44
lbajardsilogic@0 45 SVFileReader::SVFileReader(Document *document,
lbajardsilogic@0 46 SVFileReaderPaneCallback &callback,
lbajardsilogic@0 47 QString location) :
lbajardsilogic@0 48 m_document(document),
lbajardsilogic@0 49 m_paneCallback(callback),
lbajardsilogic@0 50 m_location(location),
lbajardsilogic@0 51 m_currentPane(0),
lbajardsilogic@0 52 m_currentDataset(0),
lbajardsilogic@0 53 m_currentDerivedModel(0),
lbajardsilogic@0 54 m_currentDerivedModelId(-1),
lbajardsilogic@0 55 m_currentPlayParameters(0),
lbajardsilogic@0 56 m_datasetSeparator(" "),
lbajardsilogic@0 57 m_inRow(false),
lbajardsilogic@0 58 m_rowNumber(0),
lbajardsilogic@0 59 m_ok(false)
lbajardsilogic@0 60 {
lbajardsilogic@0 61 }
lbajardsilogic@0 62
lbajardsilogic@0 63 void
lbajardsilogic@0 64 SVFileReader::parse(const QString &xmlData)
lbajardsilogic@0 65 {
lbajardsilogic@0 66 QXmlInputSource inputSource;
lbajardsilogic@0 67 inputSource.setData(xmlData);
lbajardsilogic@0 68 parse(inputSource);
lbajardsilogic@0 69 }
lbajardsilogic@0 70
lbajardsilogic@0 71 void
lbajardsilogic@0 72 SVFileReader::parse(QXmlInputSource &inputSource)
lbajardsilogic@0 73 {
lbajardsilogic@0 74 QXmlSimpleReader reader;
lbajardsilogic@0 75 reader.setContentHandler(this);
lbajardsilogic@0 76 reader.setErrorHandler(this);
lbajardsilogic@0 77 m_ok = reader.parse(inputSource);
lbajardsilogic@0 78 }
lbajardsilogic@0 79
lbajardsilogic@0 80 bool
lbajardsilogic@0 81 SVFileReader::isOK()
lbajardsilogic@0 82 {
lbajardsilogic@0 83 return m_ok;
lbajardsilogic@0 84 }
lbajardsilogic@0 85
lbajardsilogic@0 86 SVFileReader::~SVFileReader()
lbajardsilogic@0 87 {
lbajardsilogic@0 88 if (!m_awaitingDatasets.empty()) {
lbajardsilogic@0 89 std::cerr << "WARNING: SV-XML: File ended with "
lbajardsilogic@0 90 << m_awaitingDatasets.size() << " unfilled model dataset(s)"
lbajardsilogic@0 91 << std::endl;
lbajardsilogic@0 92 }
lbajardsilogic@0 93
lbajardsilogic@0 94 std::set<Model *> unaddedModels;
lbajardsilogic@0 95
lbajardsilogic@0 96 for (std::map<int, Model *>::iterator i = m_models.begin();
lbajardsilogic@0 97 i != m_models.end(); ++i) {
lbajardsilogic@0 98 if (m_addedModels.find(i->second) == m_addedModels.end()) {
lbajardsilogic@0 99 unaddedModels.insert(i->second);
lbajardsilogic@0 100 }
lbajardsilogic@0 101 }
lbajardsilogic@0 102
lbajardsilogic@0 103 if (!unaddedModels.empty()) {
lbajardsilogic@0 104 std::cerr << "WARNING: SV-XML: File contained "
lbajardsilogic@0 105 << unaddedModels.size() << " unused models"
lbajardsilogic@0 106 << std::endl;
lbajardsilogic@0 107 while (!unaddedModels.empty()) {
lbajardsilogic@0 108 delete *unaddedModels.begin();
lbajardsilogic@0 109 unaddedModels.erase(unaddedModels.begin());
lbajardsilogic@0 110 }
lbajardsilogic@0 111 }
lbajardsilogic@0 112 }
lbajardsilogic@0 113
lbajardsilogic@0 114 bool
lbajardsilogic@0 115 SVFileReader::startElement(const QString &, const QString &,
lbajardsilogic@0 116 const QString &qName,
lbajardsilogic@0 117 const QXmlAttributes &attributes)
lbajardsilogic@0 118 {
lbajardsilogic@0 119 QString name = qName.toLower();
lbajardsilogic@0 120
lbajardsilogic@0 121 bool ok = false;
lbajardsilogic@0 122
lbajardsilogic@0 123 // Valid element names:
lbajardsilogic@0 124 //
lbajardsilogic@0 125 // sv
lbajardsilogic@0 126 // data
lbajardsilogic@0 127 // dataset
lbajardsilogic@0 128 // display
lbajardsilogic@0 129 // derivation
lbajardsilogic@0 130 // playparameters
lbajardsilogic@0 131 // layer
lbajardsilogic@0 132 // model
lbajardsilogic@0 133 // point
lbajardsilogic@0 134 // row
lbajardsilogic@0 135 // view
lbajardsilogic@0 136 // window
lbajardsilogic@0 137
lbajardsilogic@0 138 if (name == "sv") {
lbajardsilogic@0 139
lbajardsilogic@0 140 // nothing needed
lbajardsilogic@0 141 ok = true;
lbajardsilogic@0 142
lbajardsilogic@0 143 } else if (name == "data") {
lbajardsilogic@0 144
lbajardsilogic@0 145 // nothing needed
lbajardsilogic@0 146 m_inData = true;
lbajardsilogic@0 147 ok = true;
lbajardsilogic@0 148
lbajardsilogic@0 149 } else if (name == "display") {
lbajardsilogic@0 150
lbajardsilogic@0 151 // nothing needed
lbajardsilogic@0 152 ok = true;
lbajardsilogic@0 153
lbajardsilogic@0 154 } else if (name == "window") {
lbajardsilogic@0 155
lbajardsilogic@0 156 ok = readWindow(attributes);
lbajardsilogic@0 157
lbajardsilogic@0 158 } else if (name == "model") {
lbajardsilogic@0 159
lbajardsilogic@0 160 ok = readModel(attributes);
lbajardsilogic@0 161
lbajardsilogic@0 162 } else if (name == "dataset") {
lbajardsilogic@0 163
lbajardsilogic@0 164 ok = readDatasetStart(attributes);
lbajardsilogic@0 165
lbajardsilogic@0 166 } else if (name == "bin") {
lbajardsilogic@0 167
lbajardsilogic@0 168 ok = addBinToDataset(attributes);
lbajardsilogic@0 169
lbajardsilogic@0 170 } else if (name == "point") {
lbajardsilogic@0 171
lbajardsilogic@0 172 ok = addPointToDataset(attributes);
lbajardsilogic@0 173
lbajardsilogic@0 174 } else if (name == "row") {
lbajardsilogic@0 175
lbajardsilogic@0 176 ok = addRowToDataset(attributes);
lbajardsilogic@0 177
lbajardsilogic@47 178 } else if (name == "interval") {
lbajardsilogic@47 179
lbajardsilogic@47 180 ok = addIntervalToDataset(attributes);
lbajardsilogic@47 181
lbajardsilogic@0 182 } else if (name == "layer") {
lbajardsilogic@0 183
lbajardsilogic@0 184 addUnaddedModels(); // all models must be specified before first layer
lbajardsilogic@0 185 ok = readLayer(attributes);
lbajardsilogic@0 186
lbajardsilogic@0 187 } else if (name == "view") {
lbajardsilogic@0 188
lbajardsilogic@0 189 m_inView = true;
lbajardsilogic@0 190 ok = readView(attributes);
lbajardsilogic@0 191
lbajardsilogic@0 192 } else if (name == "derivation") {
lbajardsilogic@0 193
lbajardsilogic@0 194 ok = readDerivation(attributes);
lbajardsilogic@0 195
lbajardsilogic@0 196 } else if (name == "playparameters") {
lbajardsilogic@0 197
lbajardsilogic@0 198 ok = readPlayParameters(attributes);
lbajardsilogic@0 199
lbajardsilogic@0 200 } else if (name == "plugin") {
lbajardsilogic@0 201
lbajardsilogic@0 202 ok = readPlugin(attributes);
lbajardsilogic@0 203
lbajardsilogic@0 204 } else if (name == "selections") {
lbajardsilogic@0 205
lbajardsilogic@0 206 m_inSelections = true;
lbajardsilogic@0 207 ok = true;
lbajardsilogic@0 208
lbajardsilogic@0 209 } else if (name == "selection") {
lbajardsilogic@0 210
lbajardsilogic@0 211 ok = readSelection(attributes);
lbajardsilogic@0 212 }
lbajardsilogic@0 213
lbajardsilogic@0 214 if (!ok) {
lbajardsilogic@0 215 std::cerr << "WARNING: SV-XML: Failed to completely process element \""
lbajardsilogic@0 216 << name.toLocal8Bit().data() << "\"" << std::endl;
lbajardsilogic@0 217 }
lbajardsilogic@0 218
lbajardsilogic@0 219 return true;
lbajardsilogic@0 220 }
lbajardsilogic@0 221
lbajardsilogic@0 222 bool
lbajardsilogic@0 223 SVFileReader::characters(const QString &text)
lbajardsilogic@0 224 {
lbajardsilogic@0 225 bool ok = false;
lbajardsilogic@0 226
lbajardsilogic@0 227 if (m_inRow) {
lbajardsilogic@0 228 ok = readRowData(text);
lbajardsilogic@0 229 if (!ok) {
lbajardsilogic@0 230 std::cerr << "WARNING: SV-XML: Failed to read row data content for row " << m_rowNumber << std::endl;
lbajardsilogic@0 231 }
lbajardsilogic@0 232 }
lbajardsilogic@0 233
lbajardsilogic@0 234 return true;
lbajardsilogic@0 235 }
lbajardsilogic@0 236
lbajardsilogic@0 237 bool
lbajardsilogic@0 238 SVFileReader::endElement(const QString &, const QString &,
lbajardsilogic@0 239 const QString &qName)
lbajardsilogic@0 240 {
lbajardsilogic@0 241 QString name = qName.toLower();
lbajardsilogic@0 242
lbajardsilogic@0 243 if (name == "dataset") {
lbajardsilogic@0 244
lbajardsilogic@0 245 if (m_currentDataset) {
lbajardsilogic@0 246
lbajardsilogic@0 247 bool foundInAwaiting = false;
lbajardsilogic@0 248
lbajardsilogic@0 249 for (std::map<int, int>::iterator i = m_awaitingDatasets.begin();
lbajardsilogic@0 250 i != m_awaitingDatasets.end(); ++i) {
lbajardsilogic@0 251 if (m_models[i->second] == m_currentDataset) {
lbajardsilogic@0 252 m_awaitingDatasets.erase(i);
lbajardsilogic@0 253 foundInAwaiting = true;
lbajardsilogic@0 254 break;
lbajardsilogic@0 255 }
lbajardsilogic@0 256 }
lbajardsilogic@0 257
lbajardsilogic@0 258 if (!foundInAwaiting) {
lbajardsilogic@0 259 std::cerr << "WARNING: SV-XML: Dataset precedes model, or no model uses dataset" << std::endl;
lbajardsilogic@0 260 }
lbajardsilogic@0 261 }
lbajardsilogic@0 262
lbajardsilogic@0 263 m_currentDataset = 0;
lbajardsilogic@0 264
lbajardsilogic@0 265 } else if (name == "data") {
lbajardsilogic@0 266
lbajardsilogic@0 267 addUnaddedModels();
lbajardsilogic@0 268 m_inData = false;
lbajardsilogic@0 269
lbajardsilogic@0 270 } else if (name == "derivation") {
lbajardsilogic@0 271
lbajardsilogic@0 272 if (!m_currentDerivedModel) {
lbajardsilogic@0 273 if (m_currentDerivedModel < 0) {
lbajardsilogic@0 274 std::cerr << "WARNING: SV-XML: Bad derivation output model id "
lbajardsilogic@0 275 << m_currentDerivedModelId << std::endl;
lbajardsilogic@0 276 } else if (m_models[m_currentDerivedModelId]) {
lbajardsilogic@0 277 std::cerr << "WARNING: SV-XML: Derivation has existing model "
lbajardsilogic@0 278 << m_currentDerivedModelId
lbajardsilogic@0 279 << " as target, not regenerating" << std::endl;
lbajardsilogic@0 280 } else {
lbajardsilogic@0 281 m_currentDerivedModel = m_models[m_currentDerivedModelId] =
lbajardsilogic@0 282 m_document->addDerivedModel(m_currentTransform,
lbajardsilogic@0 283 m_currentTransformSource,
lbajardsilogic@0 284 m_currentTransformContext,
lbajardsilogic@0 285 m_currentTransformConfiguration);
lbajardsilogic@0 286 }
lbajardsilogic@0 287 } else {
lbajardsilogic@0 288 m_document->addDerivedModel(m_currentTransform,
lbajardsilogic@0 289 m_currentTransformSource,
lbajardsilogic@0 290 m_currentTransformContext,
lbajardsilogic@0 291 m_currentDerivedModel,
lbajardsilogic@0 292 m_currentTransformConfiguration);
lbajardsilogic@0 293 }
lbajardsilogic@0 294
lbajardsilogic@0 295 m_addedModels.insert(m_currentDerivedModel);
lbajardsilogic@0 296 m_currentDerivedModel = 0;
lbajardsilogic@0 297 m_currentDerivedModelId = -1;
lbajardsilogic@0 298 m_currentTransform = "";
lbajardsilogic@0 299 m_currentTransformConfiguration = "";
lbajardsilogic@0 300
lbajardsilogic@0 301 } else if (name == "row") {
lbajardsilogic@0 302 m_inRow = false;
lbajardsilogic@0 303 } else if (name == "view") {
lbajardsilogic@0 304 m_inView = false;
lbajardsilogic@0 305 } else if (name == "selections") {
lbajardsilogic@0 306 m_inSelections = false;
lbajardsilogic@0 307 } else if (name == "playparameters") {
lbajardsilogic@0 308 m_currentPlayParameters = 0;
lbajardsilogic@0 309 }
lbajardsilogic@0 310
lbajardsilogic@0 311 return true;
lbajardsilogic@0 312 }
lbajardsilogic@0 313
lbajardsilogic@0 314 bool
lbajardsilogic@0 315 SVFileReader::error(const QXmlParseException &exception)
lbajardsilogic@0 316 {
lbajardsilogic@0 317 m_errorString =
lbajardsilogic@0 318 QString("ERROR: SV-XML: %1 at line %2, column %3")
lbajardsilogic@0 319 .arg(exception.message())
lbajardsilogic@0 320 .arg(exception.lineNumber())
lbajardsilogic@0 321 .arg(exception.columnNumber());
lbajardsilogic@0 322 std::cerr << m_errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@0 323 return QXmlDefaultHandler::error(exception);
lbajardsilogic@0 324 }
lbajardsilogic@0 325
lbajardsilogic@0 326 bool
lbajardsilogic@0 327 SVFileReader::fatalError(const QXmlParseException &exception)
lbajardsilogic@0 328 {
lbajardsilogic@0 329 m_errorString =
lbajardsilogic@0 330 QString("FATAL ERROR: SV-XML: %1 at line %2, column %3")
lbajardsilogic@0 331 .arg(exception.message())
lbajardsilogic@0 332 .arg(exception.lineNumber())
lbajardsilogic@0 333 .arg(exception.columnNumber());
lbajardsilogic@0 334 std::cerr << m_errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@0 335 return QXmlDefaultHandler::fatalError(exception);
lbajardsilogic@0 336 }
lbajardsilogic@0 337
lbajardsilogic@0 338
lbajardsilogic@0 339 #define READ_MANDATORY(TYPE, NAME, CONVERSION) \
lbajardsilogic@0 340 TYPE NAME = attributes.value(#NAME).trimmed().CONVERSION(&ok); \
lbajardsilogic@0 341 if (!ok) { \
lbajardsilogic@0 342 std::cerr << "WARNING: SV-XML: Missing or invalid mandatory " #TYPE " attribute \"" #NAME "\"" << std::endl; \
lbajardsilogic@0 343 return false; \
lbajardsilogic@0 344 }
lbajardsilogic@0 345
lbajardsilogic@0 346 bool
lbajardsilogic@0 347 SVFileReader::readWindow(const QXmlAttributes &attributes)
lbajardsilogic@0 348 {
lbajardsilogic@0 349 bool ok = false;
lbajardsilogic@0 350
lbajardsilogic@0 351 READ_MANDATORY(int, width, toInt);
lbajardsilogic@0 352 READ_MANDATORY(int, height, toInt);
lbajardsilogic@0 353
lbajardsilogic@0 354 m_paneCallback.setWindowSize(width, height);
lbajardsilogic@0 355 return true;
lbajardsilogic@0 356 }
lbajardsilogic@0 357
lbajardsilogic@0 358 void
lbajardsilogic@0 359 SVFileReader::addUnaddedModels()
lbajardsilogic@0 360 {
lbajardsilogic@0 361 std::set<Model *> unaddedModels;
lbajardsilogic@0 362
lbajardsilogic@0 363 for (std::map<int, Model *>::iterator i = m_models.begin();
lbajardsilogic@0 364 i != m_models.end(); ++i) {
lbajardsilogic@0 365 if (m_addedModels.find(i->second) == m_addedModels.end()) {
lbajardsilogic@0 366 unaddedModels.insert(i->second);
lbajardsilogic@0 367 }
lbajardsilogic@0 368 }
lbajardsilogic@0 369
lbajardsilogic@0 370 for (std::set<Model *>::iterator i = unaddedModels.begin();
lbajardsilogic@0 371 i != unaddedModels.end(); ++i) {
lbajardsilogic@0 372 m_document->addImportedModel(*i);
lbajardsilogic@0 373 m_addedModels.insert(*i);
lbajardsilogic@0 374 }
lbajardsilogic@0 375 }
lbajardsilogic@0 376
lbajardsilogic@0 377 bool
lbajardsilogic@0 378 SVFileReader::readModel(const QXmlAttributes &attributes)
lbajardsilogic@0 379 {
lbajardsilogic@0 380 bool ok = false;
lbajardsilogic@0 381
lbajardsilogic@0 382 READ_MANDATORY(int, id, toInt);
lbajardsilogic@0 383
lbajardsilogic@0 384 if (m_models.find(id) != m_models.end()) {
lbajardsilogic@0 385 std::cerr << "WARNING: SV-XML: Ignoring duplicate model id " << id
lbajardsilogic@0 386 << std::endl;
lbajardsilogic@0 387 return false;
lbajardsilogic@0 388 }
lbajardsilogic@0 389
lbajardsilogic@0 390 QString name = attributes.value("name");
lbajardsilogic@0 391
lbajardsilogic@0 392 READ_MANDATORY(int, sampleRate, toInt);
lbajardsilogic@0 393
lbajardsilogic@0 394 QString type = attributes.value("type").trimmed();
lbajardsilogic@0 395 bool mainModel = (attributes.value("mainModel").trimmed() == "true");
lbajardsilogic@0 396
lbajardsilogic@0 397 if (type == "wavefile") {
lbajardsilogic@0 398
lbajardsilogic@0 399 WaveFileModel *model = 0;
lbajardsilogic@0 400 FileFinder *ff = FileFinder::getInstance();
lbajardsilogic@0 401 QString originalPath = attributes.value("file");
lbajardsilogic@0 402 QString path = ff->find(FileFinder::AudioFile,
lbajardsilogic@0 403 originalPath, m_location);
lbajardsilogic@0 404 QUrl url(path);
lbajardsilogic@0 405
lbajardsilogic@0 406 if (RemoteFile::canHandleScheme(url)) {
lbajardsilogic@0 407
lbajardsilogic@0 408 RemoteFile rf(url);
lbajardsilogic@0 409 rf.wait();
lbajardsilogic@0 410
lbajardsilogic@0 411 if (rf.isOK()) {
lbajardsilogic@0 412
lbajardsilogic@0 413 model = new WaveFileModel(rf.getLocalFilename(), path);
lbajardsilogic@0 414 if (!model->isOK()) {
lbajardsilogic@0 415 delete model;
lbajardsilogic@0 416 model = 0;
lbajardsilogic@0 417 //!!! and delete local file?
lbajardsilogic@0 418 }
lbajardsilogic@0 419 }
lbajardsilogic@0 420 } else {
lbajardsilogic@0 421
lbajardsilogic@0 422 model = new WaveFileModel(path);
lbajardsilogic@0 423 if (!model->isOK()) {
lbajardsilogic@0 424 delete model;
lbajardsilogic@0 425 model = 0;
lbajardsilogic@0 426 }
lbajardsilogic@0 427 }
lbajardsilogic@0 428
lbajardsilogic@0 429 if (!model) return false;
lbajardsilogic@0 430
lbajardsilogic@0 431 m_models[id] = model;
lbajardsilogic@0 432 if (mainModel) {
lbajardsilogic@0 433 m_document->setMainModel(model);
lbajardsilogic@0 434 m_addedModels.insert(model);
lbajardsilogic@0 435 }
lbajardsilogic@0 436 // Derived models will be added when their derivation
lbajardsilogic@0 437 // is found.
lbajardsilogic@0 438
lbajardsilogic@0 439 return true;
lbajardsilogic@0 440
lbajardsilogic@0 441 } else if (type == "dense") {
lbajardsilogic@0 442
lbajardsilogic@0 443 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@0 444
lbajardsilogic@0 445 // Currently the only dense model we support here is the dense
lbajardsilogic@0 446 // 3d model. Dense time-value models are always file-backed
lbajardsilogic@0 447 // waveform data, at this point, and they come in as wavefile
lbajardsilogic@0 448 // models.
lbajardsilogic@0 449
lbajardsilogic@0 450 if (dimensions == 3) {
lbajardsilogic@0 451
lbajardsilogic@0 452 READ_MANDATORY(int, windowSize, toInt);
lbajardsilogic@0 453 READ_MANDATORY(int, yBinCount, toInt);
lbajardsilogic@0 454
lbajardsilogic@0 455 EditableDenseThreeDimensionalModel *model =
lbajardsilogic@0 456 new EditableDenseThreeDimensionalModel
lbajardsilogic@0 457 (sampleRate, windowSize, yBinCount);
lbajardsilogic@0 458
lbajardsilogic@0 459 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@0 460 if (ok) model->setMinimumLevel(minimum);
lbajardsilogic@0 461
lbajardsilogic@0 462 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@0 463 if (ok) model->setMaximumLevel(maximum);
lbajardsilogic@0 464
lbajardsilogic@0 465 int dataset = attributes.value("dataset").trimmed().toInt(&ok);
lbajardsilogic@0 466 if (ok) m_awaitingDatasets[dataset] = id;
lbajardsilogic@0 467
lbajardsilogic@0 468 m_models[id] = model;
lbajardsilogic@0 469 return true;
lbajardsilogic@0 470
lbajardsilogic@0 471 } else {
lbajardsilogic@0 472
lbajardsilogic@0 473 std::cerr << "WARNING: SV-XML: Unexpected dense model dimension ("
lbajardsilogic@0 474 << dimensions << ")" << std::endl;
lbajardsilogic@0 475 }
lbajardsilogic@0 476 } else if (type == "sparse") {
lbajardsilogic@0 477
lbajardsilogic@0 478 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@0 479
lbajardsilogic@0 480 if (dimensions == 1) {
lbajardsilogic@0 481
lbajardsilogic@0 482 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@0 483
lbajardsilogic@0 484 SparseOneDimensionalModel *model = new SparseOneDimensionalModel
lbajardsilogic@0 485 (sampleRate, resolution);
lbajardsilogic@0 486 m_models[id] = model;
lbajardsilogic@0 487
lbajardsilogic@0 488 int dataset = attributes.value("dataset").trimmed().toInt(&ok);
lbajardsilogic@0 489 if (ok) m_awaitingDatasets[dataset] = id;
lbajardsilogic@0 490
lbajardsilogic@0 491 return true;
lbajardsilogic@0 492
lbajardsilogic@0 493 } else if (dimensions == 2 || dimensions == 3) {
lbajardsilogic@0 494
lbajardsilogic@0 495 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@0 496
lbajardsilogic@0 497 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@0 498 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@0 499 float valueQuantization =
lbajardsilogic@0 500 attributes.value("valueQuantization").trimmed().toFloat(&ok);
lbajardsilogic@0 501
lbajardsilogic@0 502 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@0 503
lbajardsilogic@0 504 QString units = attributes.value("units");
lbajardsilogic@0 505
lbajardsilogic@0 506 if (dimensions == 2) {
lbajardsilogic@0 507 if (attributes.value("subtype") == "text") {
lbajardsilogic@0 508 TextModel *model = new TextModel
lbajardsilogic@0 509 (sampleRate, resolution, notifyOnAdd);
lbajardsilogic@0 510 m_models[id] = model;
lbajardsilogic@0 511 } else {
lbajardsilogic@0 512 SparseTimeValueModel *model = new SparseTimeValueModel
lbajardsilogic@0 513 (sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@0 514 model->setScaleUnits(units);
lbajardsilogic@0 515 m_models[id] = model;
lbajardsilogic@0 516 }
lbajardsilogic@0 517 } else {
lbajardsilogic@0 518 NoteModel *model = new NoteModel
lbajardsilogic@0 519 (sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@0 520 model->setValueQuantization(valueQuantization);
lbajardsilogic@0 521 model->setScaleUnits(units);
lbajardsilogic@0 522 m_models[id] = model;
lbajardsilogic@0 523 }
lbajardsilogic@0 524
lbajardsilogic@0 525 int dataset = attributes.value("dataset").trimmed().toInt(&ok);
lbajardsilogic@0 526 if (ok) m_awaitingDatasets[dataset] = id;
lbajardsilogic@0 527
lbajardsilogic@0 528 return true;
lbajardsilogic@0 529
lbajardsilogic@0 530 } else {
lbajardsilogic@0 531
lbajardsilogic@0 532 std::cerr << "WARNING: SV-XML: Unexpected sparse model dimension ("
lbajardsilogic@0 533 << dimensions << ")" << std::endl;
lbajardsilogic@0 534 }
lbajardsilogic@47 535 } else if (type == "interval")
lbajardsilogic@47 536 {
lbajardsilogic@47 537 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@47 538 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@47 539 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@47 540 int dataset = attributes.value("dataset").trimmed().toInt(&ok);
lbajardsilogic@47 541 if (ok) m_awaitingDatasets[dataset] = id;
lbajardsilogic@47 542
lbajardsilogic@47 543 IntervalModel * model = new IntervalModel(sampleRate, resolution, notifyOnAdd);
lbajardsilogic@47 544 m_models[id] = model;
lbajardsilogic@47 545 return true;
lbajardsilogic@47 546
lbajardsilogic@47 547 } else {
lbajardsilogic@0 548
lbajardsilogic@0 549 std::cerr << "WARNING: SV-XML: Unexpected model type \""
lbajardsilogic@0 550 << type.toLocal8Bit().data() << "\" for model id " << id << std::endl;
lbajardsilogic@0 551 }
lbajardsilogic@0 552
lbajardsilogic@0 553 return false;
lbajardsilogic@0 554 }
lbajardsilogic@0 555
lbajardsilogic@0 556 bool
lbajardsilogic@0 557 SVFileReader::readView(const QXmlAttributes &attributes)
lbajardsilogic@0 558 {
lbajardsilogic@0 559 QString type = attributes.value("type");
lbajardsilogic@0 560 m_currentPane = 0;
lbajardsilogic@0 561
lbajardsilogic@0 562 if (type != "pane") {
lbajardsilogic@0 563 std::cerr << "WARNING: SV-XML: Unexpected view type \""
lbajardsilogic@0 564 << type.toLocal8Bit().data() << "\"" << std::endl;
lbajardsilogic@0 565 return false;
lbajardsilogic@0 566 }
lbajardsilogic@0 567
lbajardsilogic@0 568 m_currentPane = m_paneCallback.addPane();
lbajardsilogic@0 569
lbajardsilogic@0 570 if (!m_currentPane) {
lbajardsilogic@0 571 std::cerr << "WARNING: SV-XML: Internal error: Failed to add pane!"
lbajardsilogic@0 572 << std::endl;
lbajardsilogic@0 573 return false;
lbajardsilogic@0 574 }
lbajardsilogic@0 575
lbajardsilogic@0 576 bool ok = false;
lbajardsilogic@0 577
lbajardsilogic@0 578 View *view = m_currentPane;
lbajardsilogic@0 579
lbajardsilogic@0 580 // The view properties first
lbajardsilogic@0 581
lbajardsilogic@0 582 READ_MANDATORY(size_t, centre, toUInt);
lbajardsilogic@0 583 READ_MANDATORY(size_t, zoom, toUInt);
lbajardsilogic@0 584 READ_MANDATORY(int, followPan, toInt);
lbajardsilogic@0 585 READ_MANDATORY(int, followZoom, toInt);
lbajardsilogic@0 586 QString tracking = attributes.value("tracking");
lbajardsilogic@0 587
lbajardsilogic@0 588 // Specify the follow modes before we set the actual values
lbajardsilogic@0 589 view->setFollowGlobalPan(followPan);
lbajardsilogic@0 590 view->setFollowGlobalZoom(followZoom);
lbajardsilogic@0 591 view->setPlaybackFollow(tracking == "scroll" ? PlaybackScrollContinuous :
lbajardsilogic@0 592 tracking == "page" ? PlaybackScrollPage
lbajardsilogic@0 593 : PlaybackIgnore);
lbajardsilogic@0 594
lbajardsilogic@0 595 // Then set these values
lbajardsilogic@0 596 view->setCentreFrame(centre);
lbajardsilogic@0 597 view->setZoomLevel(zoom);
lbajardsilogic@0 598
lbajardsilogic@0 599 // And pane properties
lbajardsilogic@0 600 READ_MANDATORY(int, centreLineVisible, toInt);
lbajardsilogic@0 601 m_currentPane->setCentreLineVisible(centreLineVisible);
lbajardsilogic@0 602
lbajardsilogic@0 603 int height = attributes.value("height").toInt(&ok);
lbajardsilogic@0 604 if (ok) {
lbajardsilogic@0 605 m_currentPane->resize(m_currentPane->width(), height);
lbajardsilogic@0 606 }
lbajardsilogic@0 607
lbajardsilogic@0 608 return true;
lbajardsilogic@0 609 }
lbajardsilogic@0 610
lbajardsilogic@0 611 bool
lbajardsilogic@0 612 SVFileReader::readLayer(const QXmlAttributes &attributes)
lbajardsilogic@0 613 {
lbajardsilogic@0 614 QString type = attributes.value("type");
lbajardsilogic@0 615
lbajardsilogic@0 616 int id;
lbajardsilogic@0 617 bool ok = false;
lbajardsilogic@0 618 id = attributes.value("id").trimmed().toInt(&ok);
lbajardsilogic@0 619
lbajardsilogic@0 620 if (!ok) {
lbajardsilogic@0 621 std::cerr << "WARNING: SV-XML: No layer id for layer of type \""
lbajardsilogic@0 622 << type.toLocal8Bit().data()
lbajardsilogic@0 623 << "\"" << std::endl;
lbajardsilogic@0 624 return false;
lbajardsilogic@0 625 }
lbajardsilogic@0 626
lbajardsilogic@0 627 Layer *layer = 0;
lbajardsilogic@0 628 bool isNewLayer = false;
lbajardsilogic@0 629
lbajardsilogic@0 630 // Layers are expected to be defined in layer elements in the data
lbajardsilogic@0 631 // section, and referred to in layer elements in the view
lbajardsilogic@0 632 // sections. So if we're in the data section, we expect this
lbajardsilogic@0 633 // layer not to exist already; if we're in the view section, we
lbajardsilogic@0 634 // expect it to exist.
lbajardsilogic@0 635
lbajardsilogic@0 636 if (m_inData) {
lbajardsilogic@0 637
lbajardsilogic@0 638 if (m_layers.find(id) != m_layers.end()) {
lbajardsilogic@0 639 std::cerr << "WARNING: SV-XML: Ignoring duplicate layer id " << id
lbajardsilogic@0 640 << " in data section" << std::endl;
lbajardsilogic@0 641 return false;
lbajardsilogic@0 642 }
lbajardsilogic@0 643
lbajardsilogic@0 644 layer = m_layers[id] = m_document->createLayer
lbajardsilogic@0 645 (LayerFactory::getInstance()->getLayerTypeForName(type));
lbajardsilogic@0 646
lbajardsilogic@0 647 if (layer) {
lbajardsilogic@0 648 m_layers[id] = layer;
lbajardsilogic@0 649 isNewLayer = true;
lbajardsilogic@0 650 }
lbajardsilogic@0 651
lbajardsilogic@0 652 } else {
lbajardsilogic@0 653
lbajardsilogic@0 654 if (!m_currentPane) {
lbajardsilogic@0 655 std::cerr << "WARNING: SV-XML: No current pane for layer " << id
lbajardsilogic@0 656 << " in view section" << std::endl;
lbajardsilogic@0 657 return false;
lbajardsilogic@0 658 }
lbajardsilogic@0 659
lbajardsilogic@0 660 if (m_layers.find(id) != m_layers.end()) {
lbajardsilogic@0 661
lbajardsilogic@0 662 layer = m_layers[id];
lbajardsilogic@0 663
lbajardsilogic@0 664 } else {
lbajardsilogic@0 665 std::cerr << "WARNING: SV-XML: Layer id " << id
lbajardsilogic@0 666 << " in view section has not been defined -- defining it here"
lbajardsilogic@0 667 << std::endl;
lbajardsilogic@0 668
lbajardsilogic@0 669 layer = m_document->createLayer
lbajardsilogic@0 670 (LayerFactory::getInstance()->getLayerTypeForName(type));
lbajardsilogic@0 671
lbajardsilogic@0 672 if (layer) {
lbajardsilogic@0 673 m_layers[id] = layer;
lbajardsilogic@0 674 isNewLayer = true;
lbajardsilogic@0 675 }
lbajardsilogic@0 676 }
lbajardsilogic@0 677 }
lbajardsilogic@0 678
lbajardsilogic@0 679 if (!layer) {
lbajardsilogic@0 680 std::cerr << "WARNING: SV-XML: Failed to add layer of type \""
lbajardsilogic@0 681 << type.toLocal8Bit().data()
lbajardsilogic@0 682 << "\"" << std::endl;
lbajardsilogic@0 683 return false;
lbajardsilogic@0 684 }
lbajardsilogic@0 685
lbajardsilogic@0 686 if (isNewLayer) {
lbajardsilogic@0 687
lbajardsilogic@0 688 QString name = attributes.value("name");
lbajardsilogic@0 689 layer->setObjectName(name);
lbajardsilogic@0 690
lbajardsilogic@0 691 int modelId;
lbajardsilogic@0 692 bool modelOk = false;
lbajardsilogic@0 693 modelId = attributes.value("model").trimmed().toInt(&modelOk);
lbajardsilogic@0 694
lbajardsilogic@0 695 if (modelOk) {
lbajardsilogic@0 696 if (m_models.find(modelId) != m_models.end()) {
lbajardsilogic@0 697 Model *model = m_models[modelId];
lbajardsilogic@0 698 m_document->setModel(layer, model);
lbajardsilogic@0 699 } else {
lbajardsilogic@0 700 std::cerr << "WARNING: SV-XML: Unknown model id " << modelId
lbajardsilogic@0 701 << " in layer definition" << std::endl;
lbajardsilogic@0 702 }
lbajardsilogic@0 703 }
lbajardsilogic@0 704
lbajardsilogic@0 705 layer->setProperties(attributes);
lbajardsilogic@0 706 }
lbajardsilogic@0 707
lbajardsilogic@0 708 if (!m_inData && m_currentPane) {
lbajardsilogic@0 709
lbajardsilogic@0 710 QString visible = attributes.value("visible");
lbajardsilogic@0 711 bool dormant = (visible == "false");
lbajardsilogic@0 712
lbajardsilogic@0 713 // We need to do this both before and after adding the layer
lbajardsilogic@0 714 // to the view -- we need it to be dormant if appropriate
lbajardsilogic@0 715 // before it's actually added to the view so that any property
lbajardsilogic@0 716 // box gets the right state when it's added, but the add layer
lbajardsilogic@0 717 // command sets dormant to false because it assumes it may be
lbajardsilogic@0 718 // restoring a previously dormant layer, so we need to set it
lbajardsilogic@0 719 // again afterwards too. Hm
lbajardsilogic@0 720 layer->setLayerDormant(m_currentPane, dormant);
lbajardsilogic@0 721
lbajardsilogic@0 722 m_document->addLayerToView(m_currentPane, layer);
lbajardsilogic@0 723
lbajardsilogic@0 724 layer->setLayerDormant(m_currentPane, dormant);
lbajardsilogic@0 725 }
lbajardsilogic@0 726
lbajardsilogic@0 727 return true;
lbajardsilogic@0 728 }
lbajardsilogic@0 729
lbajardsilogic@0 730 bool
lbajardsilogic@0 731 SVFileReader::readDatasetStart(const QXmlAttributes &attributes)
lbajardsilogic@0 732 {
lbajardsilogic@0 733 bool ok = false;
lbajardsilogic@0 734
lbajardsilogic@0 735 READ_MANDATORY(int, id, toInt);
lbajardsilogic@0 736 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@0 737
lbajardsilogic@0 738 if (m_awaitingDatasets.find(id) == m_awaitingDatasets.end()) {
lbajardsilogic@0 739 std::cerr << "WARNING: SV-XML: Unwanted dataset " << id << std::endl;
lbajardsilogic@0 740 return false;
lbajardsilogic@0 741 }
lbajardsilogic@0 742
lbajardsilogic@0 743 int modelId = m_awaitingDatasets[id];
lbajardsilogic@0 744
lbajardsilogic@0 745 Model *model = 0;
lbajardsilogic@0 746 if (m_models.find(modelId) != m_models.end()) {
lbajardsilogic@0 747 model = m_models[modelId];
lbajardsilogic@0 748 } else {
lbajardsilogic@0 749 std::cerr << "WARNING: SV-XML: Internal error: Unknown model " << modelId
lbajardsilogic@0 750 << " expecting dataset " << id << std::endl;
lbajardsilogic@0 751 return false;
lbajardsilogic@0 752 }
lbajardsilogic@0 753
lbajardsilogic@0 754 bool good = false;
lbajardsilogic@0 755
lbajardsilogic@0 756 switch (dimensions) {
lbajardsilogic@0 757 case 1:
lbajardsilogic@0 758 if (dynamic_cast<SparseOneDimensionalModel *>(model)) good = true;
lbajardsilogic@0 759 break;
lbajardsilogic@0 760
lbajardsilogic@0 761 case 2:
lbajardsilogic@0 762 if (dynamic_cast<SparseTimeValueModel *>(model)) good = true;
lbajardsilogic@0 763 else if (dynamic_cast<TextModel *>(model)) good = true;
lbajardsilogic@0 764 break;
lbajardsilogic@0 765
lbajardsilogic@0 766 case 3:
lbajardsilogic@0 767 if (dynamic_cast<NoteModel *>(model)) good = true;
lbajardsilogic@0 768 else if (dynamic_cast<EditableDenseThreeDimensionalModel *>(model)) {
lbajardsilogic@0 769 m_datasetSeparator = attributes.value("separator");
lbajardsilogic@0 770 good = true;
lbajardsilogic@0 771 }
lbajardsilogic@47 772 else if (dynamic_cast<IntervalModel *>(model)) good = true;
lbajardsilogic@0 773 break;
lbajardsilogic@0 774 }
lbajardsilogic@0 775
lbajardsilogic@0 776 if (!good) {
lbajardsilogic@0 777 std::cerr << "WARNING: SV-XML: Model id " << modelId << " has wrong number of dimensions for " << dimensions << "-D dataset " << id << std::endl;
lbajardsilogic@0 778 m_currentDataset = 0;
lbajardsilogic@0 779 return false;
lbajardsilogic@0 780 }
lbajardsilogic@0 781
lbajardsilogic@0 782 m_currentDataset = model;
lbajardsilogic@0 783 return true;
lbajardsilogic@0 784 }
lbajardsilogic@0 785
lbajardsilogic@0 786 bool
lbajardsilogic@0 787 SVFileReader::addPointToDataset(const QXmlAttributes &attributes)
lbajardsilogic@0 788 {
lbajardsilogic@0 789 bool ok = false;
lbajardsilogic@0 790
lbajardsilogic@0 791 READ_MANDATORY(int, frame, toInt);
lbajardsilogic@0 792
lbajardsilogic@0 793 SparseOneDimensionalModel *sodm = dynamic_cast<SparseOneDimensionalModel *>
lbajardsilogic@0 794 (m_currentDataset);
lbajardsilogic@0 795
lbajardsilogic@0 796 if (sodm) {
lbajardsilogic@0 797 QString label = attributes.value("label");
lbajardsilogic@0 798 sodm->addPoint(SparseOneDimensionalModel::Point(frame, label));
lbajardsilogic@0 799 return true;
lbajardsilogic@0 800 }
lbajardsilogic@0 801
lbajardsilogic@0 802 SparseTimeValueModel *stvm = dynamic_cast<SparseTimeValueModel *>
lbajardsilogic@0 803 (m_currentDataset);
lbajardsilogic@0 804
lbajardsilogic@0 805 if (stvm) {
lbajardsilogic@0 806 float value = 0.0;
lbajardsilogic@0 807 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@0 808 QString label = attributes.value("label");
lbajardsilogic@0 809 stvm->addPoint(SparseTimeValueModel::Point(frame, value, label));
lbajardsilogic@0 810 return ok;
lbajardsilogic@0 811 }
lbajardsilogic@0 812
lbajardsilogic@0 813 NoteModel *nm = dynamic_cast<NoteModel *>(m_currentDataset);
lbajardsilogic@0 814
lbajardsilogic@0 815 if (nm) {
lbajardsilogic@0 816 float value = 0.0;
lbajardsilogic@0 817 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@0 818 size_t duration = 0;
lbajardsilogic@0 819 duration = attributes.value("duration").trimmed().toUInt(&ok);
lbajardsilogic@0 820 QString label = attributes.value("label");
lbajardsilogic@0 821 nm->addPoint(NoteModel::Point(frame, value, duration, label));
lbajardsilogic@0 822 return ok;
lbajardsilogic@0 823 }
lbajardsilogic@0 824
lbajardsilogic@0 825 TextModel *tm = dynamic_cast<TextModel *>(m_currentDataset);
lbajardsilogic@0 826
lbajardsilogic@0 827 if (tm) {
lbajardsilogic@0 828 float height = 0.0;
lbajardsilogic@0 829 height = attributes.value("height").trimmed().toFloat(&ok);
lbajardsilogic@0 830 QString label = attributes.value("label");
lbajardsilogic@0 831 tm->addPoint(TextModel::Point(frame, height, label));
lbajardsilogic@0 832 return ok;
lbajardsilogic@0 833 }
lbajardsilogic@0 834
lbajardsilogic@0 835 std::cerr << "WARNING: SV-XML: Point element found in non-point dataset" << std::endl;
lbajardsilogic@0 836
lbajardsilogic@0 837 return false;
lbajardsilogic@0 838 }
lbajardsilogic@0 839
lbajardsilogic@0 840 bool
lbajardsilogic@0 841 SVFileReader::addBinToDataset(const QXmlAttributes &attributes)
lbajardsilogic@0 842 {
lbajardsilogic@0 843 EditableDenseThreeDimensionalModel *dtdm =
lbajardsilogic@0 844 dynamic_cast<EditableDenseThreeDimensionalModel *>
lbajardsilogic@0 845 (m_currentDataset);
lbajardsilogic@0 846
lbajardsilogic@0 847 if (dtdm) {
lbajardsilogic@0 848
lbajardsilogic@0 849 bool ok = false;
lbajardsilogic@0 850 int n = attributes.value("number").trimmed().toInt(&ok);
lbajardsilogic@0 851 if (!ok) {
lbajardsilogic@0 852 std::cerr << "WARNING: SV-XML: Missing or invalid bin number"
lbajardsilogic@0 853 << std::endl;
lbajardsilogic@0 854 return false;
lbajardsilogic@0 855 }
lbajardsilogic@0 856
lbajardsilogic@0 857 QString name = attributes.value("name");
lbajardsilogic@0 858
lbajardsilogic@0 859 dtdm->setBinName(n, name);
lbajardsilogic@0 860 return true;
lbajardsilogic@0 861 }
lbajardsilogic@0 862
lbajardsilogic@0 863 std::cerr << "WARNING: SV-XML: Bin definition found in incompatible dataset" << std::endl;
lbajardsilogic@0 864
lbajardsilogic@0 865 return false;
lbajardsilogic@0 866 }
lbajardsilogic@0 867
lbajardsilogic@0 868
lbajardsilogic@0 869 bool
lbajardsilogic@0 870 SVFileReader::addRowToDataset(const QXmlAttributes &attributes)
lbajardsilogic@0 871 {
lbajardsilogic@0 872 m_inRow = false;
lbajardsilogic@0 873
lbajardsilogic@0 874 bool ok = false;
lbajardsilogic@0 875 m_rowNumber = attributes.value("n").trimmed().toInt(&ok);
lbajardsilogic@0 876 if (!ok) {
lbajardsilogic@0 877 std::cerr << "WARNING: SV-XML: Missing or invalid row number"
lbajardsilogic@0 878 << std::endl;
lbajardsilogic@0 879 return false;
lbajardsilogic@0 880 }
lbajardsilogic@0 881
lbajardsilogic@0 882 m_inRow = true;
lbajardsilogic@0 883
lbajardsilogic@0 884 // std::cerr << "SV-XML: In row " << m_rowNumber << std::endl;
lbajardsilogic@0 885
lbajardsilogic@0 886 return true;
lbajardsilogic@0 887 }
lbajardsilogic@0 888
lbajardsilogic@0 889 bool
lbajardsilogic@0 890 SVFileReader::readRowData(const QString &text)
lbajardsilogic@0 891 {
lbajardsilogic@0 892 EditableDenseThreeDimensionalModel *dtdm =
lbajardsilogic@0 893 dynamic_cast<EditableDenseThreeDimensionalModel *>
lbajardsilogic@0 894 (m_currentDataset);
lbajardsilogic@0 895
lbajardsilogic@0 896 bool warned = false;
lbajardsilogic@0 897
lbajardsilogic@0 898 if (dtdm) {
lbajardsilogic@0 899 QStringList data = text.split(m_datasetSeparator);
lbajardsilogic@0 900
lbajardsilogic@0 901 DenseThreeDimensionalModel::Column values;
lbajardsilogic@0 902
lbajardsilogic@0 903 for (QStringList::iterator i = data.begin(); i != data.end(); ++i) {
lbajardsilogic@0 904
lbajardsilogic@0 905 if (values.size() == dtdm->getHeight()) {
lbajardsilogic@0 906 if (!warned) {
lbajardsilogic@0 907 std::cerr << "WARNING: SV-XML: Too many y-bins in 3-D dataset row "
lbajardsilogic@0 908 << m_rowNumber << std::endl;
lbajardsilogic@0 909 warned = true;
lbajardsilogic@0 910 }
lbajardsilogic@0 911 }
lbajardsilogic@0 912
lbajardsilogic@0 913 bool ok;
lbajardsilogic@0 914 float value = i->toFloat(&ok);
lbajardsilogic@0 915 if (!ok) {
lbajardsilogic@0 916 std::cerr << "WARNING: SV-XML: Bad floating-point value "
lbajardsilogic@0 917 << i->toLocal8Bit().data()
lbajardsilogic@0 918 << " in row data" << std::endl;
lbajardsilogic@0 919 } else {
lbajardsilogic@0 920 values.push_back(value);
lbajardsilogic@0 921 }
lbajardsilogic@0 922 }
lbajardsilogic@0 923
lbajardsilogic@0 924 dtdm->setColumn(m_rowNumber, values);
lbajardsilogic@0 925 return true;
lbajardsilogic@0 926 }
lbajardsilogic@0 927
lbajardsilogic@0 928 std::cerr << "WARNING: SV-XML: Row data found in non-row dataset" << std::endl;
lbajardsilogic@0 929
lbajardsilogic@0 930 return false;
lbajardsilogic@0 931 }
lbajardsilogic@0 932
lbajardsilogic@0 933 bool
lbajardsilogic@0 934 SVFileReader::readDerivation(const QXmlAttributes &attributes)
lbajardsilogic@0 935 {
lbajardsilogic@0 936 int modelId = 0;
lbajardsilogic@0 937 bool modelOk = false;
lbajardsilogic@0 938 modelId = attributes.value("model").trimmed().toInt(&modelOk);
lbajardsilogic@0 939
lbajardsilogic@0 940 if (!modelOk) {
lbajardsilogic@0 941 std::cerr << "WARNING: SV-XML: No model id specified for derivation" << std::endl;
lbajardsilogic@0 942 return false;
lbajardsilogic@0 943 }
lbajardsilogic@0 944
lbajardsilogic@0 945 QString transform = attributes.value("transform");
lbajardsilogic@0 946
lbajardsilogic@0 947 if (m_models.find(modelId) != m_models.end()) {
lbajardsilogic@0 948 m_currentDerivedModel = m_models[modelId];
lbajardsilogic@0 949 } else {
lbajardsilogic@0 950 // we'll regenerate the model when the derivation element ends
lbajardsilogic@0 951 m_currentDerivedModel = 0;
lbajardsilogic@0 952 }
lbajardsilogic@0 953
lbajardsilogic@0 954 m_currentDerivedModelId = modelId;
lbajardsilogic@0 955
lbajardsilogic@0 956 int sourceId = 0;
lbajardsilogic@0 957 bool sourceOk = false;
lbajardsilogic@0 958 sourceId = attributes.value("source").trimmed().toInt(&sourceOk);
lbajardsilogic@0 959
lbajardsilogic@0 960 if (sourceOk && m_models[sourceId]) {
lbajardsilogic@0 961 m_currentTransformSource = m_models[sourceId];
lbajardsilogic@0 962 } else {
lbajardsilogic@0 963 m_currentTransformSource = m_document->getMainModel();
lbajardsilogic@0 964 }
lbajardsilogic@0 965
lbajardsilogic@0 966 m_currentTransform = transform;
lbajardsilogic@0 967 m_currentTransformConfiguration = "";
lbajardsilogic@0 968
lbajardsilogic@0 969 m_currentTransformContext = PluginTransform::ExecutionContext();
lbajardsilogic@0 970
lbajardsilogic@0 971 bool ok = false;
lbajardsilogic@0 972 int channel = attributes.value("channel").trimmed().toInt(&ok);
lbajardsilogic@0 973 if (ok) m_currentTransformContext.channel = channel;
lbajardsilogic@0 974
lbajardsilogic@0 975 int domain = attributes.value("domain").trimmed().toInt(&ok);
lbajardsilogic@0 976 if (ok) m_currentTransformContext.domain = Vamp::Plugin::InputDomain(domain);
lbajardsilogic@0 977
lbajardsilogic@0 978 int stepSize = attributes.value("stepSize").trimmed().toInt(&ok);
lbajardsilogic@0 979 if (ok) m_currentTransformContext.stepSize = stepSize;
lbajardsilogic@0 980
lbajardsilogic@0 981 int blockSize = attributes.value("blockSize").trimmed().toInt(&ok);
lbajardsilogic@0 982 if (ok) m_currentTransformContext.blockSize = blockSize;
lbajardsilogic@0 983
lbajardsilogic@0 984 int windowType = attributes.value("windowType").trimmed().toInt(&ok);
lbajardsilogic@0 985 if (ok) m_currentTransformContext.windowType = WindowType(windowType);
lbajardsilogic@0 986
lbajardsilogic@0 987 return true;
lbajardsilogic@0 988 }
lbajardsilogic@0 989
lbajardsilogic@47 990 bool
lbajardsilogic@47 991 SVFileReader::addIntervalToDataset(const QXmlAttributes &attributes)
lbajardsilogic@47 992 {
lbajardsilogic@47 993 bool ok = false;
lbajardsilogic@47 994
lbajardsilogic@47 995 IntervalModel *im = dynamic_cast<IntervalModel*>(m_currentDataset);
lbajardsilogic@47 996 if (im)
lbajardsilogic@47 997 {
lbajardsilogic@47 998 READ_MANDATORY(int, start, toInt);
lbajardsilogic@47 999 READ_MANDATORY(int, end, toInt);
lbajardsilogic@47 1000 QString label = attributes.value("label");
lbajardsilogic@47 1001 float value = 0.0;
lbajardsilogic@47 1002 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@47 1003 im->addInterval(start, end, label, value);
lbajardsilogic@47 1004 ok = true;
lbajardsilogic@47 1005 }
lbajardsilogic@47 1006 return ok;
lbajardsilogic@47 1007 }
lbajardsilogic@47 1008
lbajardsilogic@0 1009 bool
lbajardsilogic@0 1010 SVFileReader::readPlayParameters(const QXmlAttributes &attributes)
lbajardsilogic@0 1011 {
lbajardsilogic@0 1012 m_currentPlayParameters = 0;
lbajardsilogic@0 1013
lbajardsilogic@0 1014 int modelId = 0;
lbajardsilogic@0 1015 bool modelOk = false;
lbajardsilogic@0 1016 modelId = attributes.value("model").trimmed().toInt(&modelOk);
lbajardsilogic@0 1017
lbajardsilogic@0 1018 if (!modelOk) {
lbajardsilogic@0 1019 std::cerr << "WARNING: SV-XML: No model id specified for play parameters" << std::endl;
lbajardsilogic@0 1020 return false;
lbajardsilogic@0 1021 }
lbajardsilogic@0 1022
lbajardsilogic@0 1023 if (m_models.find(modelId) != m_models.end()) {
lbajardsilogic@0 1024
lbajardsilogic@0 1025 bool ok = false;
lbajardsilogic@0 1026
lbajardsilogic@0 1027 PlayParameters *parameters = PlayParameterRepository::getInstance()->
lbajardsilogic@0 1028 getPlayParameters(m_models[modelId]);
lbajardsilogic@0 1029
lbajardsilogic@0 1030 if (!parameters) {
lbajardsilogic@0 1031 std::cerr << "WARNING: SV-XML: Play parameters for model "
lbajardsilogic@0 1032 << modelId
lbajardsilogic@0 1033 << " not found - has model been added to document?"
lbajardsilogic@0 1034 << std::endl;
lbajardsilogic@0 1035 return false;
lbajardsilogic@0 1036 }
lbajardsilogic@0 1037
lbajardsilogic@0 1038 bool muted = (attributes.value("mute").trimmed() == "true");
lbajardsilogic@0 1039 parameters->setPlayMuted(muted);
lbajardsilogic@0 1040
lbajardsilogic@0 1041 float pan = attributes.value("pan").toFloat(&ok);
lbajardsilogic@0 1042 if (ok) parameters->setPlayPan(pan);
lbajardsilogic@0 1043
lbajardsilogic@0 1044 float gain = attributes.value("gain").toFloat(&ok);
lbajardsilogic@0 1045 if (ok) parameters->setPlayGain(gain);
lbajardsilogic@0 1046
lbajardsilogic@0 1047 QString pluginId = attributes.value("pluginId");
lbajardsilogic@0 1048 if (pluginId != "") parameters->setPlayPluginId(pluginId);
lbajardsilogic@0 1049
lbajardsilogic@0 1050 m_currentPlayParameters = parameters;
lbajardsilogic@0 1051
lbajardsilogic@0 1052 // std::cerr << "Current play parameters for model: " << m_models[modelId] << ": " << m_currentPlayParameters << std::endl;
lbajardsilogic@0 1053
lbajardsilogic@0 1054 } else {
lbajardsilogic@0 1055
lbajardsilogic@0 1056 std::cerr << "WARNING: SV-XML: Unknown model " << modelId
lbajardsilogic@0 1057 << " for play parameters" << std::endl;
lbajardsilogic@0 1058 return false;
lbajardsilogic@0 1059 }
lbajardsilogic@0 1060
lbajardsilogic@0 1061 return true;
lbajardsilogic@0 1062 }
lbajardsilogic@0 1063
lbajardsilogic@0 1064 bool
lbajardsilogic@0 1065 SVFileReader::readPlugin(const QXmlAttributes &attributes)
lbajardsilogic@0 1066 {
lbajardsilogic@0 1067 if (m_currentDerivedModelId < 0 && !m_currentPlayParameters) {
lbajardsilogic@0 1068 std::cerr << "WARNING: SV-XML: Plugin found outside derivation or play parameters" << std::endl;
lbajardsilogic@0 1069 return false;
lbajardsilogic@0 1070 }
lbajardsilogic@0 1071
lbajardsilogic@0 1072 QString configurationXml = "<plugin";
lbajardsilogic@0 1073
lbajardsilogic@0 1074 for (int i = 0; i < attributes.length(); ++i) {
lbajardsilogic@0 1075 configurationXml += QString(" %1=\"%2\"")
lbajardsilogic@0 1076 .arg(attributes.qName(i))
lbajardsilogic@0 1077 .arg(XmlExportable::encodeEntities(attributes.value(i)));
lbajardsilogic@0 1078 }
lbajardsilogic@0 1079
lbajardsilogic@0 1080 configurationXml += "/>";
lbajardsilogic@0 1081
lbajardsilogic@0 1082 if (m_currentPlayParameters) {
lbajardsilogic@0 1083 m_currentPlayParameters->setPlayPluginConfiguration(configurationXml);
lbajardsilogic@0 1084 } else {
lbajardsilogic@0 1085 m_currentTransformConfiguration += configurationXml;
lbajardsilogic@0 1086 }
lbajardsilogic@0 1087
lbajardsilogic@0 1088 return true;
lbajardsilogic@0 1089 }
lbajardsilogic@0 1090
lbajardsilogic@0 1091 bool
lbajardsilogic@0 1092 SVFileReader::readSelection(const QXmlAttributes &attributes)
lbajardsilogic@0 1093 {
lbajardsilogic@0 1094 bool ok;
lbajardsilogic@0 1095
lbajardsilogic@0 1096 READ_MANDATORY(int, start, toInt);
lbajardsilogic@0 1097 READ_MANDATORY(int, end, toInt);
lbajardsilogic@0 1098
lbajardsilogic@0 1099 m_paneCallback.addSelection(start, end);
lbajardsilogic@0 1100
lbajardsilogic@0 1101 return true;
lbajardsilogic@0 1102 }
lbajardsilogic@0 1103
lbajardsilogic@0 1104 SVFileReaderPaneCallback::~SVFileReaderPaneCallback()
lbajardsilogic@0 1105 {
lbajardsilogic@0 1106 }
lbajardsilogic@0 1107