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