comparison framework/Document.cpp @ 673:d62fd61082a1

Merge from branch tuning-difference
author Chris Cannam
date Fri, 17 May 2019 09:46:22 +0100
parents ae7584dbd668
children 0d4236961c97
comparison
equal deleted inserted replaced
665:e19c609a7bec 673:d62fd61082a1
19 19
20 #include "data/model/WaveFileModel.h" 20 #include "data/model/WaveFileModel.h"
21 #include "data/model/WritableWaveFileModel.h" 21 #include "data/model/WritableWaveFileModel.h"
22 #include "data/model/DenseThreeDimensionalModel.h" 22 #include "data/model/DenseThreeDimensionalModel.h"
23 #include "data/model/DenseTimeValueModel.h" 23 #include "data/model/DenseTimeValueModel.h"
24 #include "data/model/FlexiNoteModel.h"
25 #include "data/model/AggregateWaveModel.h" 24 #include "data/model/AggregateWaveModel.h"
26 25
27 #include "layer/Layer.h" 26 #include "layer/Layer.h"
28 #include "widgets/CommandHistory.h" 27 #include "widgets/CommandHistory.h"
29 #include "base/Command.h" 28 #include "base/Command.h"
73 //!!! Document should really own the command history. atm we 72 //!!! Document should really own the command history. atm we
74 //still refer to it in various places that don't have access to 73 //still refer to it in various places that don't have access to
75 //the document, be nice to fix that 74 //the document, be nice to fix that
76 75
77 #ifdef DEBUG_DOCUMENT 76 #ifdef DEBUG_DOCUMENT
78 cerr << "\n\nDocument::~Document: about to clear command history" << endl; 77 SVDEBUG << "\n\nDocument::~Document: about to clear command history" << endl;
79 #endif 78 #endif
80 CommandHistory::getInstance()->clear(); 79 CommandHistory::getInstance()->clear();
81 80
82 #ifdef DEBUG_DOCUMENT 81 #ifdef DEBUG_DOCUMENT
83 SVDEBUG << "Document::~Document: about to delete layers" << endl; 82 SVDEBUG << "Document::~Document: about to delete layers" << endl;
89 if (!m_models.empty()) { 88 if (!m_models.empty()) {
90 SVDEBUG << "Document::~Document: WARNING: " 89 SVDEBUG << "Document::~Document: WARNING: "
91 << m_models.size() << " model(s) still remain -- " 90 << m_models.size() << " model(s) still remain -- "
92 << "should have been garbage collected when deleting layers" 91 << "should have been garbage collected when deleting layers"
93 << endl; 92 << endl;
94 while (!m_models.empty()) { 93 for (ModelRecord &rec: m_models) {
95 Model *model = m_models.begin()->first; 94 Model *model = rec.model;
96 if (model == m_mainModel) { 95 if (model == m_mainModel) {
97 // just in case! 96 // just in case!
98 SVDEBUG << "Document::~Document: WARNING: Main model is also" 97 SVDEBUG << "Document::~Document: WARNING: Main model is also"
99 << " in models list!" << endl; 98 << " in models list!" << endl;
100 } else if (model) { 99 } else if (model) {
101 model->aboutToDelete(); 100 model->aboutToDelete();
102 emit modelAboutToBeDeleted(model); 101 emit modelAboutToBeDeleted(model);
103 delete model; 102 delete model;
104 } 103 }
105 m_models.erase(m_models.begin()); 104 }
106 } 105 m_models.clear();
107 } 106 }
108 107
109 #ifdef DEBUG_DOCUMENT 108 #ifdef DEBUG_DOCUMENT
110 SVDEBUG << "Document::~Document: About to get rid of main model" 109 SVDEBUG << "Document::~Document: About to get rid of main model"
111 << endl; 110 << endl;
125 Layer *newLayer = LayerFactory::getInstance()->createLayer(type); 124 Layer *newLayer = LayerFactory::getInstance()->createLayer(type);
126 if (!newLayer) return nullptr; 125 if (!newLayer) return nullptr;
127 126
128 newLayer->setObjectName(getUniqueLayerName(newLayer->objectName())); 127 newLayer->setObjectName(getUniqueLayerName(newLayer->objectName()));
129 128
130 m_layers.insert(newLayer); 129 m_layers.push_back(newLayer);
131 130
132 #ifdef DEBUG_DOCUMENT 131 #ifdef DEBUG_DOCUMENT
133 SVDEBUG << "Document::createLayer: Added layer of type " << type 132 SVDEBUG << "Document::createLayer: Added layer of type " << type
134 << ", now have " << m_layers.size() << " layers" << endl; 133 << ", now have " << m_layers.size() << " layers" << endl;
135 #endif 134 #endif
153 { 152 {
154 LayerFactory::LayerTypeSet types = 153 LayerFactory::LayerTypeSet types =
155 LayerFactory::getInstance()->getValidLayerTypes(model); 154 LayerFactory::getInstance()->getValidLayerTypes(model);
156 155
157 if (types.empty()) { 156 if (types.empty()) {
158 cerr << "WARNING: Document::importLayer: no valid display layer for model" << endl; 157 SVCERR << "WARNING: Document::importLayer: no valid display layer for model" << endl;
159 return nullptr; 158 return nullptr;
160 } 159 }
161 160
162 //!!! for now, just use the first suitable layer type 161 //!!! for now, just use the first suitable layer type
163 LayerFactory::LayerType type = *types.begin(); 162 LayerFactory::LayerType type = *types.begin();
171 setModel(newLayer, model); 170 setModel(newLayer, model);
172 171
173 //!!! and all channels 172 //!!! and all channels
174 setChannel(newLayer, -1); 173 setChannel(newLayer, -1);
175 174
176 m_layers.insert(newLayer); 175 m_layers.push_back(newLayer);
177 176
178 #ifdef DEBUG_DOCUMENT 177 #ifdef DEBUG_DOCUMENT
179 SVDEBUG << "Document::createImportedLayer: Added layer of type " << type 178 SVDEBUG << "Document::createImportedLayer: Added layer of type " << type
180 << ", now have " << m_layers.size() << " layers" << endl; 179 << ", now have " << m_layers.size() << " layers" << endl;
181 #endif 180 #endif
275 m_primary = layers; 274 m_primary = layers;
276 } 275 }
277 276
278 void 277 void
279 moreModelsAvailable(vector<Model *> models) override { 278 moreModelsAvailable(vector<Model *> models) override {
280 std::cerr << "AdditionalModelConverter::moreModelsAvailable: " << models.size() << " model(s)" << std::endl; 279 SVDEBUG << "AdditionalModelConverter::moreModelsAvailable: " << models.size() << " model(s)" << endl;
281 // We can't automatically regenerate the additional models on 280 // We can't automatically regenerate the additional models on
282 // reload -- we should delete them instead 281 // reload -- we should delete them instead
283 QStringList names; 282 QStringList names;
284 foreach (Model *model, models) { 283 foreach (Model *model, models) {
285 m_doc->addAdditionalModel(model); 284 m_doc->addAdditionalModel(model);
291 delete this; 290 delete this;
292 } 291 }
293 292
294 void 293 void
295 noMoreModelsAvailable() override { 294 noMoreModelsAvailable() override {
296 std::cerr << "AdditionalModelConverter::noMoreModelsAvailable" << std::endl; 295 SVDEBUG << "AdditionalModelConverter::noMoreModelsAvailable" << endl;
297 m_handler->layersCreated(this, m_primary, vector<Layer *>()); 296 m_handler->layersCreated(this, m_primary, vector<Layer *>());
298 delete this; 297 delete this;
299 } 298 }
300 299
301 void cancel() { 300 void cancel() {
368 367
369 LayerFactory::LayerTypeSet types = 368 LayerFactory::LayerTypeSet types =
370 LayerFactory::getInstance()->getValidLayerTypes(newModel); 369 LayerFactory::getInstance()->getValidLayerTypes(newModel);
371 370
372 if (types.empty()) { 371 if (types.empty()) {
373 cerr << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << names[i] << endl; 372 SVCERR << "WARNING: Document::createLayerForTransformer: no valid display layer for output of transform " << names[i] << endl;
374 //!!! inadequate cleanup: 373 //!!! inadequate cleanup:
375 newModel->aboutToDelete(); 374 deleteModelFromList(newModel);
376 emit modelAboutToBeDeleted(newModel);
377 m_models.erase(newModel);
378 delete newModel;
379 return vector<Layer *>(); 375 return vector<Layer *>();
380 } 376 }
381 377
382 //!!! for now, just use the first suitable layer type 378 //!!! for now, just use the first suitable layer type
383 379
431 // model, or delete the layer for each layer that is currently 427 // model, or delete the layer for each layer that is currently
432 // using one of these. Carry out this replacement before we 428 // using one of these. Carry out this replacement before we
433 // delete any of the models. 429 // delete any of the models.
434 430
435 #ifdef DEBUG_DOCUMENT 431 #ifdef DEBUG_DOCUMENT
436 cerr << "Document::setMainModel: Have " 432 SVDEBUG << "Document::setMainModel: Have "
437 << m_layers.size() << " layers" << endl; 433 << m_layers.size() << " layers" << endl;
438 cerr << "Models now: "; 434 SVDEBUG << "Models now: ";
439 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { 435 for (const auto &r: m_models) {
440 cerr << i->first << " "; 436 SVDEBUG << r.model << " ";
441 } 437 }
442 cerr << endl; 438 SVDEBUG << endl;
443 cerr << "Old main model: " << oldMainModel << endl; 439 SVDEBUG << "Old main model: " << oldMainModel << endl;
444 #endif 440 #endif
445 441
446 for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { 442 for (Layer *layer: m_layers) {
447 443
448 Layer *layer = *i;
449 Model *model = layer->getModel(); 444 Model *model = layer->getModel();
450 445
451 #ifdef DEBUG_DOCUMENT 446 #ifdef DEBUG_DOCUMENT
452 cerr << "Document::setMainModel: inspecting model " 447 SVDEBUG << "Document::setMainModel: inspecting model "
453 << (model ? model->objectName(): "(null)") << " in layer " 448 << (model ? model->objectName(): "(null)") << " in layer "
454 << layer->objectName() << endl; 449 << layer->objectName() << endl;
455 #endif 450 #endif
456 451
457 if (model == oldMainModel) { 452 if (model == oldMainModel) {
458 #ifdef DEBUG_DOCUMENT 453 #ifdef DEBUG_DOCUMENT
459 cerr << "... it uses the old main model, replacing" << endl; 454 SVDEBUG << "... it uses the old main model, replacing" << endl;
460 #endif 455 #endif
461 LayerFactory::getInstance()->setModel(layer, m_mainModel); 456 LayerFactory::getInstance()->setModel(layer, m_mainModel);
462 continue; 457 continue;
463 } 458 }
464 459
465 if (!model) { 460 if (!model) {
466 cerr << "WARNING: Document::setMainModel: Null model in layer " 461 SVCERR << "WARNING: Document::setMainModel: Null model in layer "
467 << layer << endl; 462 << layer << endl;
468 // get rid of this hideous degenerate 463 // get rid of this hideous degenerate
469 obsoleteLayers.push_back(layer); 464 obsoleteLayers.push_back(layer);
470 continue; 465 continue;
471 } 466 }
472 467
473 if (m_models.find(model) == m_models.end()) { 468 auto mitr = findModelInList(model);
474 cerr << "WARNING: Document::setMainModel: Unknown model " 469
475 << model << " in layer " << layer << endl; 470 if (mitr == m_models.end()) {
471 SVCERR << "WARNING: Document::setMainModel: Unknown model "
472 << model << " in layer " << layer << endl;
476 // and this one 473 // and this one
477 obsoleteLayers.push_back(layer); 474 obsoleteLayers.push_back(layer);
478 continue; 475 continue;
479 } 476 }
480 477
481 if (m_models[model].source && 478 ModelRecord record = *mitr;
482 (m_models[model].source == oldMainModel)) { 479
483 480 if (record.source && (record.source == oldMainModel)) {
484 #ifdef DEBUG_DOCUMENT 481
485 cerr << "... it uses a model derived from the old main model, regenerating" << endl; 482 #ifdef DEBUG_DOCUMENT
483 SVDEBUG << "... it uses a model derived from the old main model, regenerating" << endl;
486 #endif 484 #endif
487 485
488 // This model was derived from the previous main 486 // This model was derived from the previous main
489 // model: regenerate it. 487 // model: regenerate it.
490 488
491 const Transform &transform = m_models[model].transform; 489 const Transform &transform = record.transform;
492 QString transformId = transform.getIdentifier(); 490 QString transformId = transform.getIdentifier();
493 491
494 //!!! We have a problem here if the number of channels in 492 //!!! We have a problem here if the number of channels in
495 //the main model has changed. 493 //the main model has changed.
496 494
497 QString message; 495 QString message;
498 Model *replacementModel = 496 Model *replacementModel =
499 addDerivedModel(transform, 497 addDerivedModel(transform,
500 ModelTransformer::Input 498 ModelTransformer::Input
501 (m_mainModel, m_models[model].channel), 499 (m_mainModel, record.channel),
502 message); 500 message);
503 501
504 if (!replacementModel) { 502 if (!replacementModel) {
505 cerr << "WARNING: Document::setMainModel: Failed to regenerate model for transform \"" 503 SVCERR << "WARNING: Document::setMainModel: Failed to regenerate model for transform \""
506 << transformId << "\"" << " in layer " << layer << endl; 504 << transformId << "\"" << " in layer " << layer << endl;
507 if (failedTransformers.find(transformId) 505 if (failedTransformers.find(transformId)
508 == failedTransformers.end()) { 506 == failedTransformers.end()) {
509 emit modelRegenerationFailed(layer->objectName(), 507 emit modelRegenerationFailed(layer->objectName(),
510 transformId, 508 transformId,
511 message); 509 message);
517 emit modelRegenerationWarning(layer->objectName(), 515 emit modelRegenerationWarning(layer->objectName(),
518 transformId, 516 transformId,
519 message); 517 message);
520 } 518 }
521 #ifdef DEBUG_DOCUMENT 519 #ifdef DEBUG_DOCUMENT
522 cerr << "Replacing model " << model << " (type " 520 SVDEBUG << "Replacing model " << model << " (type "
523 << typeid(*model).name() << ") with model " 521 << typeid(*model).name() << ") with model "
524 << replacementModel << " (type " 522 << replacementModel << " (type "
525 << typeid(*replacementModel).name() << ") in layer " 523 << typeid(*replacementModel).name() << ") in layer "
526 << layer << " (name " << layer->objectName() << ")" 524 << layer << " (name " << layer->objectName() << ")"
527 << endl; 525 << endl;
528 526
529 RangeSummarisableTimeValueModel *rm = 527 RangeSummarisableTimeValueModel *rm =
530 dynamic_cast<RangeSummarisableTimeValueModel *>(replacementModel); 528 dynamic_cast<RangeSummarisableTimeValueModel *>(replacementModel);
531 if (rm) { 529 if (rm) {
532 cerr << "new model has " << rm->getChannelCount() << " channels " << endl; 530 SVDEBUG << "new model has " << rm->getChannelCount() << " channels " << endl;
533 } else { 531 } else {
534 cerr << "new model " << replacementModel << " is not a RangeSummarisableTimeValueModel!" << endl; 532 SVDEBUG << "new model " << replacementModel << " is not a RangeSummarisableTimeValueModel!" << endl;
535 } 533 }
536 #endif 534 #endif
537 setModel(layer, replacementModel); 535 setModel(layer, replacementModel);
538 } 536 }
539 } 537 }
541 539
542 for (size_t k = 0; k < obsoleteLayers.size(); ++k) { 540 for (size_t k = 0; k < obsoleteLayers.size(); ++k) {
543 deleteLayer(obsoleteLayers[k], true); 541 deleteLayer(obsoleteLayers[k], true);
544 } 542 }
545 543
546 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 544 std::set<Model *> additionalModels;
547 if (i->second.additional) { 545 for (const auto &rec : m_models) {
548 Model *m = i->first; 546 if (rec.additional) {
549 m->aboutToDelete(); 547 additionalModels.insert(rec.model);
550 emit modelAboutToBeDeleted(m); 548 }
551 delete m; 549 }
552 } 550 for (Model *a: additionalModels) {
553 } 551 deleteModelFromList(a);
554 552 }
555 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 553
556 554 for (const auto &rec : m_models) {
557 Model *m = i->first; 555
556 Model *m = rec.model;
558 557
559 #ifdef DEBUG_DOCUMENT 558 #ifdef DEBUG_DOCUMENT
560 SVDEBUG << "considering alignment for model " << m << " (name \"" 559 SVDEBUG << "considering alignment for model " << m << " (name \""
561 << m->objectName() << "\")" << endl; 560 << m->objectName() << "\")" << endl;
562 #endif 561 #endif
578 } 577 }
579 578
580 if (m_autoAlignment) { 579 if (m_autoAlignment) {
581 SVDEBUG << "Document::setMainModel: auto-alignment is on, aligning model if possible" << endl; 580 SVDEBUG << "Document::setMainModel: auto-alignment is on, aligning model if possible" << endl;
582 alignModel(m_mainModel); 581 alignModel(m_mainModel);
582 } else {
583 SVDEBUG << "Document::setMainModel: auto-alignment is off" << endl;
583 } 584 }
584 585
585 emit mainModelChanged(m_mainModel); 586 emit mainModelChanged(m_mainModel);
586 587
587 delete oldMainModel; 588 delete oldMainModel;
590 void 591 void
591 Document::addAlreadyDerivedModel(const Transform &transform, 592 Document::addAlreadyDerivedModel(const Transform &transform,
592 const ModelTransformer::Input &input, 593 const ModelTransformer::Input &input,
593 Model *outputModelToAdd) 594 Model *outputModelToAdd)
594 { 595 {
595 if (m_models.find(outputModelToAdd) != m_models.end()) { 596 if (findModelInList(outputModelToAdd) != m_models.end()) {
596 cerr << "WARNING: Document::addAlreadyDerivedModel: Model already added" 597 SVCERR << "WARNING: Document::addAlreadyDerivedModel: Model already added"
597 << endl; 598 << endl;
598 return; 599 return;
599 } 600 }
600 601
601 #ifdef DEBUG_DOCUMENT 602 #ifdef DEBUG_DOCUMENT
602 if (input.getModel()) { 603 if (input.getModel()) {
603 cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl; 604 SVDEBUG << "Document::addAlreadyDerivedModel: source is " << input.getModel() << " \"" << input.getModel()->objectName() << "\"" << endl;
604 } else { 605 } else {
605 cerr << "Document::addAlreadyDerivedModel: source is " << input.getModel() << endl; 606 SVDEBUG << "Document::addAlreadyDerivedModel: source is " << input.getModel() << endl;
606 } 607 }
607 #endif 608 #endif
608 609
609 ModelRecord rec; 610 ModelRecord rec;
611 rec.model = outputModelToAdd;
610 rec.source = input.getModel(); 612 rec.source = input.getModel();
611 rec.channel = input.getChannel(); 613 rec.channel = input.getChannel();
612 rec.transform = transform; 614 rec.transform = transform;
613 rec.additional = false; 615 rec.additional = false;
614 rec.refcount = 0; 616 rec.refcount = 0;
615 617
616 outputModelToAdd->setSourceModel(input.getModel()); 618 outputModelToAdd->setSourceModel(input.getModel());
617 619
618 m_models[outputModelToAdd] = rec; 620 m_models.push_back(rec);
619 621
620 #ifdef DEBUG_DOCUMENT 622 #ifdef DEBUG_DOCUMENT
621 cerr << "Document::addAlreadyDerivedModel: Added model " << outputModelToAdd << endl; 623 SVDEBUG << "Document::addAlreadyDerivedModel: Added model " << outputModelToAdd << endl;
622 cerr << "Models now: "; 624 SVDEBUG << "Models now: ";
623 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { 625 for (const auto &rec : m_models) {
624 cerr << i->first << " "; 626 SVDEBUG << rec.model << " ";
625 } 627 }
626 cerr << endl; 628 SVDEBUG << endl;
627 #endif 629 #endif
628 630
629 emit modelAdded(outputModelToAdd); 631 emit modelAdded(outputModelToAdd);
630 } 632 }
631 633
632 634
633 void 635 void
634 Document::addImportedModel(Model *model) 636 Document::addImportedModel(Model *model)
635 { 637 {
636 if (m_models.find(model) != m_models.end()) { 638 if (findModelInList(model) != m_models.end()) {
637 cerr << "WARNING: Document::addImportedModel: Model already added" 639 SVCERR << "WARNING: Document::addImportedModel: Model already added"
638 << endl; 640 << endl;
639 return; 641 return;
640 } 642 }
641 643
642 ModelRecord rec; 644 ModelRecord rec;
645 rec.model = model;
643 rec.source = nullptr; 646 rec.source = nullptr;
644 rec.channel = 0; 647 rec.channel = 0;
645 rec.refcount = 0; 648 rec.refcount = 0;
646 rec.additional = false; 649 rec.additional = false;
647 650
648 m_models[model] = rec; 651 m_models.push_back(rec);
649 652
650 #ifdef DEBUG_DOCUMENT 653 #ifdef DEBUG_DOCUMENT
651 SVDEBUG << "Document::addImportedModel: Added model " << model << endl; 654 SVDEBUG << "Document::addImportedModel: Added model " << model << endl;
652 cerr << "Models now: "; 655 SVDEBUG << "Models now: ";
653 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { 656 for (const auto &rec : m_models) {
654 cerr << i->first << " "; 657 SVDEBUG << rec.model << " ";
655 } 658 }
656 cerr << endl; 659 SVDEBUG << endl;
657 #endif 660 #endif
658 661
659 if (m_autoAlignment) { 662 if (m_autoAlignment) {
660 SVDEBUG << "Document::addImportedModel: auto-alignment is on, aligning model if possible" << endl; 663 SVDEBUG << "Document::addImportedModel: auto-alignment is on, aligning model if possible" << endl;
661 alignModel(model); 664 alignModel(model);
667 } 670 }
668 671
669 void 672 void
670 Document::addAdditionalModel(Model *model) 673 Document::addAdditionalModel(Model *model)
671 { 674 {
672 if (m_models.find(model) != m_models.end()) { 675 if (findModelInList(model) != m_models.end()) {
673 cerr << "WARNING: Document::addAdditionalModel: Model already added" 676 SVCERR << "WARNING: Document::addAdditionalModel: Model already added"
674 << endl; 677 << endl;
675 return; 678 return;
676 } 679 }
677 680
678 ModelRecord rec; 681 ModelRecord rec;
682 rec.model = model;
679 rec.source = nullptr; 683 rec.source = nullptr;
680 rec.channel = 0; 684 rec.channel = 0;
681 rec.refcount = 0; 685 rec.refcount = 0;
682 rec.additional = true; 686 rec.additional = true;
683 687
684 m_models[model] = rec; 688 m_models.push_back(rec);
685 689
686 #ifdef DEBUG_DOCUMENT 690 #ifdef DEBUG_DOCUMENT
687 SVDEBUG << "Document::addAdditionalModel: Added model " << model << endl; 691 SVDEBUG << "Document::addAdditionalModel: Added model " << model << endl;
688 cerr << "Models now: "; 692 SVDEBUG << "Models now: ";
689 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { 693 for (const auto &rec : m_models) {
690 cerr << i->first << " "; 694 SVDEBUG << rec.model << " ";
691 } 695 }
692 cerr << endl; 696 SVDEBUG << endl;
693 #endif 697 #endif
694 698
695 if (m_autoAlignment) { 699 if (m_autoAlignment) {
696 SVDEBUG << "Document::addAdditionalModel: auto-alignment is on, aligning model if possible" << endl; 700 SVDEBUG << "Document::addAdditionalModel: auto-alignment is on, aligning model if possible" << endl;
697 alignModel(model); 701 alignModel(model);
704 Document::addAggregateModel(AggregateWaveModel *model) 708 Document::addAggregateModel(AggregateWaveModel *model)
705 { 709 {
706 connect(model, SIGNAL(modelInvalidated()), 710 connect(model, SIGNAL(modelInvalidated()),
707 this, SLOT(aggregateModelInvalidated())); 711 this, SLOT(aggregateModelInvalidated()));
708 m_aggregateModels.insert(model); 712 m_aggregateModels.insert(model);
713 SVDEBUG << "Document::addAggregateModel(" << model << ")" << endl;
709 } 714 }
710 715
711 void 716 void
712 Document::aggregateModelInvalidated() 717 Document::aggregateModelInvalidated()
713 { 718 {
714 QObject *s = sender(); 719 QObject *s = sender();
715 AggregateWaveModel *aggregate = qobject_cast<AggregateWaveModel *>(s); 720 AggregateWaveModel *aggregate = qobject_cast<AggregateWaveModel *>(s);
721 SVDEBUG << "Document::aggregateModelInvalidated(" << aggregate << ")" << endl;
716 if (aggregate) releaseModel(aggregate); 722 if (aggregate) releaseModel(aggregate);
717 } 723 }
718 724
719 Model * 725 Model *
720 Document::addDerivedModel(const Transform &transform, 726 Document::addDerivedModel(const Transform &transform,
721 const ModelTransformer::Input &input, 727 const ModelTransformer::Input &input,
722 QString &message) 728 QString &message)
723 { 729 {
724 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 730 for (auto &rec : m_models) {
725 if (i->second.transform == transform && 731 if (rec.transform == transform &&
726 i->second.source == input.getModel() && 732 rec.source == input.getModel() &&
727 i->second.channel == input.getChannel()) { 733 rec.channel == input.getChannel()) {
728 std::cerr << "derived model taken from map " << std::endl; 734 SVDEBUG << "derived model taken from map " << endl;
729 return i->first; 735 return rec.model;
730 } 736 }
731 } 737 }
732 738
733 Transforms tt; 739 Transforms tt;
734 tt.push_back(transform); 740 tt.push_back(transform);
769 getDefaultTransformFor(applied.getIdentifier(), 775 getDefaultTransformFor(applied.getIdentifier(),
770 applied.getSampleRate()) 776 applied.getSampleRate())
771 .getPluginVersion()); 777 .getPluginVersion());
772 778
773 if (!model) { 779 if (!model) {
774 cerr << "WARNING: Document::addDerivedModel: no output model for transform " << applied.getIdentifier() << endl; 780 SVCERR << "WARNING: Document::addDerivedModel: no output model for transform " << applied.getIdentifier() << endl;
775 } else { 781 } else {
776 addAlreadyDerivedModel(applied, input, model); 782 addAlreadyDerivedModel(applied, input, model);
777 } 783 }
778 } 784 }
779 785
797 return; 803 return;
798 } 804 }
799 805
800 bool toDelete = false; 806 bool toDelete = false;
801 807
802 if (m_models.find(model) != m_models.end()) { 808 ModelList::iterator mitr = findModelInList(model);
803 if (m_models[model].refcount == 0) { 809
810 if (mitr != m_models.end()) {
811 if (mitr->refcount == 0) {
804 SVCERR << "WARNING: Document::releaseModel: model " << model 812 SVCERR << "WARNING: Document::releaseModel: model " << model
805 << " reference count is zero already!" << endl; 813 << " reference count is zero already!" << endl;
806 } else { 814 } else {
807 if (--m_models[model].refcount == 0) { 815 #ifdef DEBUG_DOCUMENT
816 SVDEBUG << "Lowering refcount from " << mitr->refcount << endl;
817 #endif
818 if (--mitr->refcount == 0) {
808 toDelete = true; 819 toDelete = true;
809 } 820 }
810 } 821 }
811 } else if (m_aggregateModels.find(model) != m_aggregateModels.end()) { 822 } else if (m_aggregateModels.find(model) != m_aggregateModels.end()) {
812 #ifdef DEBUG_DOCUMENT 823 #ifdef DEBUG_DOCUMENT
821 832
822 if (toDelete) { 833 if (toDelete) {
823 834
824 int sourceCount = 0; 835 int sourceCount = 0;
825 836
826 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 837 for (auto &rec: m_models) {
827 if (i->second.source == model) { 838 if (rec.source == model) {
828 ++sourceCount; 839 ++sourceCount;
829 i->second.source = nullptr; 840 rec.source = nullptr;
830 } 841 }
831 } 842 }
832 843
833 if (sourceCount > 0) { 844 if (sourceCount > 0) {
834 SVDEBUG << "Document::releaseModel: Deleting model " 845 SVDEBUG << "Document::releaseModel: Deleting model "
835 << model << " even though it is source for " 846 << model << " even though it is source for "
836 << sourceCount << " other derived model(s) -- resetting " 847 << sourceCount << " other derived model(s) -- resetting "
837 << "their source fields appropriately" << endl; 848 << "their source fields appropriately" << endl;
838 } 849 }
839 850
840 model->aboutToDelete(); 851 deleteModelFromList(model);
841 emit modelAboutToBeDeleted(model);
842 m_models.erase(model);
843 852
844 #ifdef DEBUG_DOCUMENT 853 #ifdef DEBUG_DOCUMENT
845 SVDEBUG << "Document::releaseModel: Deleted model " << model << endl; 854 SVDEBUG << "Document::releaseModel: Deleted model " << model << endl;
846 cerr << "Models now: "; 855 SVDEBUG << "Models now: ";
847 for (ModelMap::const_iterator i = m_models.begin(); i != m_models.end(); ++i) { 856 for (const auto &r: m_models) {
848 cerr << i->first << " "; 857 SVDEBUG << r.model << " ";
849 } 858 }
850 cerr << endl; 859 SVDEBUG << endl;
851 #endif 860 #endif
852
853 delete model;
854 } 861 }
855 } 862 }
856 863
857 void 864 void
858 Document::deleteLayer(Layer *layer, bool force) 865 Document::deleteLayer(Layer *layer, bool force)
859 { 866 {
860 if (m_layerViewMap.find(layer) != m_layerViewMap.end() && 867 if (m_layerViewMap.find(layer) != m_layerViewMap.end() &&
861 m_layerViewMap[layer].size() > 0) { 868 m_layerViewMap[layer].size() > 0) {
862 869
863 cerr << "WARNING: Document::deleteLayer: Layer "
864 << layer << " [" << layer->objectName() << "]"
865 << " is still used in " << m_layerViewMap[layer].size()
866 << " views!" << endl;
867
868 if (force) { 870 if (force) {
869 871
870 #ifdef DEBUG_DOCUMENT 872 SVDEBUG << "NOTE: Document::deleteLayer: Layer "
871 cerr << "(force flag set -- deleting from all views)" << endl; 873 << layer << " [" << layer->objectName() << "]"
872 #endif 874 << " is still used in " << m_layerViewMap[layer].size()
873 875 << " views. Force flag set, so removing from them" << endl;
876
874 for (std::set<View *>::iterator j = m_layerViewMap[layer].begin(); 877 for (std::set<View *>::iterator j = m_layerViewMap[layer].begin();
875 j != m_layerViewMap[layer].end(); ++j) { 878 j != m_layerViewMap[layer].end(); ++j) {
876 // don't use removeLayerFromView, as it issues a command 879 // don't use removeLayerFromView, as it issues a command
877 layer->setLayerDormant(*j, true); 880 layer->setLayerDormant(*j, true);
878 (*j)->removeLayer(layer); 881 (*j)->removeLayer(layer);
879 } 882 }
880 883
881 m_layerViewMap.erase(layer); 884 m_layerViewMap.erase(layer);
882 885
883 } else { 886 } else {
887
888 SVCERR << "WARNING: Document::deleteLayer: Layer "
889 << layer << " [" << layer->objectName() << "]"
890 << " is still used in " << m_layerViewMap[layer].size()
891 << " views! Force flag is not set, so not deleting" << endl;
892
884 return; 893 return;
885 } 894 }
886 } 895 }
887 896
888 if (m_layers.find(layer) == m_layers.end()) { 897 bool found = false;
898 for (auto itr = m_layers.begin(); itr != m_layers.end(); ++itr) {
899 if (*itr == layer) {
900 found = true;
901 m_layers.erase(itr);
902 break;
903 }
904 }
905 if (!found) {
889 SVDEBUG << "Document::deleteLayer: Layer " 906 SVDEBUG << "Document::deleteLayer: Layer "
890 << layer << " (typeid " << typeid(layer).name() << 907 << layer << " (typeid " << typeid(layer).name() <<
891 ") does not exist, or has already been deleted " 908 ") does not exist, or has already been deleted "
892 << "(this may not be as serious as it sounds)" << endl; 909 << "(this may not be as serious as it sounds)" << endl;
893 return; 910 return;
894 } 911 }
895 912
896 m_layers.erase(layer);
897
898 #ifdef DEBUG_DOCUMENT 913 #ifdef DEBUG_DOCUMENT
899 SVDEBUG << "Document::deleteLayer: Removing (and about to release model), now have " 914 SVDEBUG << "Document::deleteLayer: Removing (and about to release model), now have "
900 << m_layers.size() << " layers" << endl; 915 << m_layers.size() << " layers" << endl;
901 #endif 916 #endif
902 917
909 void 924 void
910 Document::setModel(Layer *layer, Model *model) 925 Document::setModel(Layer *layer, Model *model)
911 { 926 {
912 if (model && 927 if (model &&
913 model != m_mainModel && 928 model != m_mainModel &&
914 m_models.find(model) == m_models.end()) { 929 findModelInList(model) == m_models.end()) {
915 cerr << "ERROR: Document::setModel: Layer " << layer 930 SVCERR << "ERROR: Document::setModel: Layer " << layer
916 << " (\"" << layer->objectName() 931 << " (\"" << layer->objectName()
917 << "\") wants to use unregistered model " << model 932 << "\") wants to use unregistered model " << model
918 << ": register the layer's model before setting it!" 933 << ": register the layer's model before setting it!"
919 << endl; 934 << endl;
920 return; 935 return;
930 << "\")" << endl; 945 << "\")" << endl;
931 return; 946 return;
932 } 947 }
933 948
934 if (model && model != m_mainModel) { 949 if (model && model != m_mainModel) {
935 m_models[model].refcount ++; 950 ModelList::iterator mitr = findModelInList(model);
951 if (mitr != m_models.end()) {
952 mitr->refcount ++;
953 }
936 } 954 }
937 955
938 if (model && previousModel) { 956 if (model && previousModel) {
939 PlayParameterRepository::getInstance()->copyParameters 957 PlayParameterRepository::getInstance()->copyParameters
940 (previousModel, model); 958 (previousModel, model);
941 } 959 }
942 960
943 LayerFactory::getInstance()->setModel(layer, model); 961 LayerFactory::getInstance()->setModel(layer, model);
944 // std::cerr << "layer type: " << LayerFactory::getInstance()->getLayerTypeName(LayerFactory::getInstance()->getLayerType(layer)) << std::endl;
945 962
946 if (previousModel) { 963 if (previousModel) {
947 releaseModel(previousModel); 964 releaseModel(previousModel);
948 } 965 }
949 } 966 }
959 { 976 {
960 Model *model = layer->getModel(); 977 Model *model = layer->getModel();
961 if (!model) { 978 if (!model) {
962 #ifdef DEBUG_DOCUMENT 979 #ifdef DEBUG_DOCUMENT
963 SVDEBUG << "Document::addLayerToView: Layer (\"" 980 SVDEBUG << "Document::addLayerToView: Layer (\""
964 << layer->objectName() << "\") with no model being added to view: " 981 << layer->objectName()
982 << "\") with no model being added to view: "
965 << "normally you want to set the model first" << endl; 983 << "normally you want to set the model first" << endl;
966 #endif 984 #endif
967 } else { 985 } else {
968 if (model != m_mainModel && 986 if (model != m_mainModel &&
969 m_models.find(model) == m_models.end()) { 987 findModelInList(model) == m_models.end()) {
970 cerr << "ERROR: Document::addLayerToView: Layer " << layer 988 SVCERR << "ERROR: Document::addLayerToView: Layer " << layer
971 << " has unregistered model " << model 989 << " has unregistered model " << model
972 << " -- register the layer's model before adding the layer!" << endl; 990 << " -- register the layer's model before adding the layer!" << endl;
973 return; 991 return;
974 } 992 }
975 } 993 }
991 bool firstView = (m_layerViewMap.find(layer) == m_layerViewMap.end() || 1009 bool firstView = (m_layerViewMap.find(layer) == m_layerViewMap.end() ||
992 m_layerViewMap[layer].empty()); 1010 m_layerViewMap[layer].empty());
993 1011
994 if (m_layerViewMap[layer].find(view) != 1012 if (m_layerViewMap[layer].find(view) !=
995 m_layerViewMap[layer].end()) { 1013 m_layerViewMap[layer].end()) {
996 cerr << "WARNING: Document::addToLayerViewMap:" 1014 SVCERR << "WARNING: Document::addToLayerViewMap:"
997 << " Layer " << layer << " -> view " << view << " already in" 1015 << " Layer " << layer << " -> view " << view << " already in"
998 << " layer view map -- internal inconsistency" << endl; 1016 << " layer view map -- internal inconsistency" << endl;
999 } 1017 }
1000 1018
1001 m_layerViewMap[layer].insert(view); 1019 m_layerViewMap[layer].insert(view);
1006 void 1024 void
1007 Document::removeFromLayerViewMap(Layer *layer, View *view) 1025 Document::removeFromLayerViewMap(Layer *layer, View *view)
1008 { 1026 {
1009 if (m_layerViewMap[layer].find(view) == 1027 if (m_layerViewMap[layer].find(view) ==
1010 m_layerViewMap[layer].end()) { 1028 m_layerViewMap[layer].end()) {
1011 cerr << "WARNING: Document::removeFromLayerViewMap:" 1029 SVCERR << "WARNING: Document::removeFromLayerViewMap:"
1012 << " Layer " << layer << " -> view " << view << " not in" 1030 << " Layer " << layer << " -> view " << view << " not in"
1013 << " layer view map -- internal inconsistency" << endl; 1031 << " layer view map -- internal inconsistency" << endl;
1014 } 1032 }
1015 1033
1016 m_layerViewMap[layer].erase(view); 1034 m_layerViewMap[layer].erase(view);
1030 (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) : 1048 (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) :
1031 candidate); 1049 candidate);
1032 1050
1033 bool duplicate = false; 1051 bool duplicate = false;
1034 1052
1035 for (LayerSet::iterator i = m_layers.begin(); i != m_layers.end(); ++i) { 1053 for (auto i = m_layers.begin(); i != m_layers.end(); ++i) {
1036 if ((*i)->objectName() == adjusted) { 1054 if ((*i)->objectName() == adjusted) {
1037 duplicate = true; 1055 duplicate = true;
1038 break; 1056 break;
1039 } 1057 }
1040 } 1058 }
1052 1070
1053 models.push_back(m_mainModel); 1071 models.push_back(m_mainModel);
1054 1072
1055 //!!! This will pick up all models, including those that aren't visible... 1073 //!!! This will pick up all models, including those that aren't visible...
1056 1074
1057 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 1075 for (ModelRecord &rec: m_models) {
1058 1076
1059 Model *model = i->first; 1077 Model *model = rec.model;
1060 if (!model || model == m_mainModel) continue; 1078 if (!model || model == m_mainModel) continue;
1061 DenseTimeValueModel *dtvm = dynamic_cast<DenseTimeValueModel *>(model); 1079 DenseTimeValueModel *dtvm = dynamic_cast<DenseTimeValueModel *>(model);
1062 1080
1063 if (dtvm) { 1081 if (dtvm) {
1064 models.push_back(dtvm); 1082 models.push_back(dtvm);
1070 1088
1071 bool 1089 bool
1072 Document::isKnownModel(const Model *model) const 1090 Document::isKnownModel(const Model *model) const
1073 { 1091 {
1074 if (model == m_mainModel) return true; 1092 if (model == m_mainModel) return true;
1075 return (m_models.find(const_cast<Model *>(model)) != m_models.end()); 1093 for (const ModelRecord &rec: m_models) {
1094 if (rec.model == model) return true;
1095 }
1096 return false;
1076 } 1097 }
1077 1098
1078 bool 1099 bool
1079 Document::canAlign() 1100 Document::canAlign()
1080 { 1101 {
1081 return Align::canAlign(); 1102 return Align::canAlign();
1082 } 1103 }
1083 1104
1084 void 1105 void
1085 Document::alignModel(Model *model) 1106 Document::alignModel(Model *model, bool forceRecalculate)
1086 { 1107 {
1087 SVDEBUG << "Document::alignModel(" << model << ")" << endl; 1108 SVDEBUG << "Document::alignModel(" << model << ", " << forceRecalculate
1088 1109 << ") (main model is " << m_mainModel << ")" << endl;
1089 if (!m_mainModel) {
1090 SVDEBUG << "(no main model to align to)" << endl;
1091 return;
1092 }
1093 1110
1094 RangeSummarisableTimeValueModel *rm = 1111 RangeSummarisableTimeValueModel *rm =
1095 dynamic_cast<RangeSummarisableTimeValueModel *>(model); 1112 dynamic_cast<RangeSummarisableTimeValueModel *>(model);
1096 if (!rm) { 1113 if (!rm) {
1097 SVDEBUG << "(main model is not alignable-to)" << endl; 1114 SVDEBUG << "(model " << rm << " is not an alignable sort)" << endl;
1098 return; 1115 return;
1099 } 1116 }
1100 1117
1118 if (!m_mainModel) {
1119 SVDEBUG << "(no main model to align to)" << endl;
1120 if (forceRecalculate && rm->getAlignment()) {
1121 SVDEBUG << "(but model is aligned, and forceRecalculate is true, "
1122 << "so resetting alignment to nil)" << endl;
1123 rm->setAlignment(nullptr);
1124 }
1125 return;
1126 }
1127
1101 if (rm->getAlignmentReference() == m_mainModel) { 1128 if (rm->getAlignmentReference() == m_mainModel) {
1102 SVDEBUG << "(model " << rm << " is already aligned to main model " << m_mainModel << ")" << endl; 1129 SVDEBUG << "(model " << rm << " is already aligned to main model "
1103 return; 1130 << m_mainModel << ")" << endl;
1131 if (!forceRecalculate) {
1132 return;
1133 } else {
1134 SVDEBUG << "(but forceRecalculate is true, so realigning anyway)"
1135 << endl;
1136 }
1104 } 1137 }
1105 1138
1106 if (model == m_mainModel) { 1139 if (model == m_mainModel) {
1107 // The reference has an empty alignment to itself. This makes 1140 // The reference has an empty alignment to itself. This makes
1108 // it possible to distinguish between the reference and any 1141 // it possible to distinguish between the reference and any
1109 // unaligned model just by looking at the model itself, 1142 // unaligned model just by looking at the model itself,
1110 // without also knowing what the main model is 1143 // without also knowing what the main model is
1111 SVDEBUG << "Document::alignModel(" << model << "): is main model, setting appropriately" << endl; 1144 SVDEBUG << "Document::alignModel(" << model
1145 << "): is main model, setting alignment to itself" << endl;
1112 rm->setAlignment(new AlignmentModel(model, model, nullptr)); 1146 rm->setAlignment(new AlignmentModel(model, model, nullptr));
1113 return; 1147 return;
1114 } 1148 }
1115 1149
1116 if (!m_align->alignModel(this, m_mainModel, rm)) { 1150 SVDEBUG << "Document::alignModel: aligning..." << endl;
1117 SVCERR << "Alignment failed: " << m_align->getError() << endl; 1151 if (rm->getAlignmentReference() != nullptr) {
1118 emit alignmentFailed(m_align->getError()); 1152 SVDEBUG << "(Note: model " << rm << " is currently aligned to model "
1153 << rm->getAlignmentReference() << "; this will replace that)"
1154 << endl;
1155 }
1156
1157 QString err;
1158 if (!m_align->alignModel(this, m_mainModel, rm, err)) {
1159 SVCERR << "Alignment failed: " << err << endl;
1160 emit alignmentFailed(err);
1119 } 1161 }
1120 } 1162 }
1121 1163
1122 void 1164 void
1123 Document::alignModels() 1165 Document::alignModels()
1124 { 1166 {
1125 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { 1167 for (const ModelRecord &rec: m_models) {
1126 alignModel(i->first); 1168 alignModel(rec.model);
1169 }
1170 alignModel(m_mainModel);
1171 }
1172
1173 void
1174 Document::realignModels()
1175 {
1176 for (const ModelRecord &rec: m_models) {
1177 alignModel(rec.model, true);
1127 } 1178 }
1128 alignModel(m_mainModel); 1179 alignModel(m_mainModel);
1129 } 1180 }
1130 1181
1131 Document::AddLayerCommand::AddLayerCommand(Document *d, 1182 Document::AddLayerCommand::AddLayerCommand(Document *d,
1273 out << indent + QString("<data%1%2>\n") 1324 out << indent + QString("<data%1%2>\n")
1274 .arg(extraAttributes == "" ? "" : " ").arg(extraAttributes); 1325 .arg(extraAttributes == "" ? "" : " ").arg(extraAttributes);
1275 1326
1276 if (m_mainModel) { 1327 if (m_mainModel) {
1277 1328
1329 #ifdef DEBUG_DOCUMENT
1330 SVDEBUG << "Document::toXml: writing main model" << endl;
1331 #endif
1332
1278 if (asTemplate) { 1333 if (asTemplate) {
1279 writePlaceholderMainModel(out, indent + " "); 1334 writePlaceholderMainModel(out, indent + " ");
1280 } else { 1335 } else {
1281 m_mainModel->toXml(out, indent + " ", "mainModel=\"true\""); 1336 m_mainModel->toXml(out, indent + " ", "mainModel=\"true\"");
1282 } 1337 }
1285 PlayParameterRepository::getInstance()->getPlayParameters(m_mainModel); 1340 PlayParameterRepository::getInstance()->getPlayParameters(m_mainModel);
1286 if (playParameters) { 1341 if (playParameters) {
1287 playParameters->toXml 1342 playParameters->toXml
1288 (out, indent + " ", 1343 (out, indent + " ",
1289 QString("model=\"%1\"") 1344 QString("model=\"%1\"")
1290 .arg(XmlExportable::getObjectExportId(m_mainModel))); 1345 .arg(m_mainModel->getExportId()));
1291 } 1346 }
1347 } else {
1348 #ifdef DEBUG_DOCUMENT
1349 SVDEBUG << "Document::toXml: have no main model to write" << endl;
1350 #endif
1292 } 1351 }
1293 1352
1294 // Models that are not used in a layer that is in a view should 1353 // Models that are not used in a layer that is in a view should
1295 // not be written. Get our list of required models first. 1354 // not be written. Get our list of required models first.
1296 1355
1324 // models first and we might as well stick with that. 1383 // models first and we might as well stick with that.
1325 1384
1326 for (std::set<Model *>::iterator i = m_aggregateModels.begin(); 1385 for (std::set<Model *>::iterator i = m_aggregateModels.begin();
1327 i != m_aggregateModels.end(); ++i) { 1386 i != m_aggregateModels.end(); ++i) {
1328 1387
1329 SVDEBUG << "checking aggregate model " << *i << endl; 1388 #ifdef DEBUG_DOCUMENT
1389 SVDEBUG << "Document::toXml: checking aggregate model " << *i << endl;
1390 #endif
1330 1391
1331 AggregateWaveModel *aggregate = qobject_cast<AggregateWaveModel *>(*i); 1392 AggregateWaveModel *aggregate = qobject_cast<AggregateWaveModel *>(*i);
1332 if (!aggregate) continue; 1393 if (!aggregate) continue;
1333 if (used.find(aggregate) == used.end()) { 1394 if (used.find(aggregate) == used.end()) {
1395 #ifdef DEBUG_DOCUMENT
1334 SVDEBUG << "(unused, skipping)" << endl; 1396 SVDEBUG << "(unused, skipping)" << endl;
1397 #endif
1335 continue; 1398 continue;
1336 } 1399 }
1337 1400
1401 #ifdef DEBUG_DOCUMENT
1338 SVDEBUG << "(used, writing)" << endl; 1402 SVDEBUG << "(used, writing)" << endl;
1403 #endif
1339 1404
1340 aggregate->toXml(out, indent + " "); 1405 aggregate->toXml(out, indent + " ");
1341 } 1406 }
1342 1407
1343 std::set<Model *> written; 1408 std::set<Model *> written;
1350 // have derivations. 1415 // have derivations.
1351 1416
1352 const int nonDerivedPass = 0, derivedPass = 1; 1417 const int nonDerivedPass = 0, derivedPass = 1;
1353 for (int pass = nonDerivedPass; pass <= derivedPass; ++pass) { 1418 for (int pass = nonDerivedPass; pass <= derivedPass; ++pass) {
1354 1419
1355 for (ModelMap::const_iterator i = m_models.begin(); 1420 for (const ModelRecord &rec: m_models) {
1356 i != m_models.end(); ++i) { 1421
1357 1422 Model *model = rec.model;
1358 Model *model = i->first;
1359 const ModelRecord &rec = i->second;
1360 1423
1361 if (used.find(model) == used.end()) continue; 1424 if (used.find(model) == used.end()) continue;
1362 1425
1426 #ifdef DEBUG_DOCUMENT
1427 SVDEBUG << "Document::toXml: looking at model " << model
1428 << " (" << model->getTypeName() << ", \""
1429 << model->objectName() << "\") [pass = "
1430 << pass << "]" << endl;
1431 #endif
1432
1363 // We need an intelligent way to determine which models 1433 // We need an intelligent way to determine which models
1364 // need to be streamed (i.e. have been edited, or are 1434 // need to be streamed (i.e. have been edited, or are
1365 // small) and which should not be (i.e. remain as 1435 // small) and which should not be (i.e. remain as
1366 // generated by a transform, and are large). 1436 // generated by a transform, and are large).
1367 // 1437 //
1416 PlayParameterRepository::getInstance()->getPlayParameters(model); 1486 PlayParameterRepository::getInstance()->getPlayParameters(model);
1417 if (playParameters) { 1487 if (playParameters) {
1418 playParameters->toXml 1488 playParameters->toXml
1419 (out, indent + " ", 1489 (out, indent + " ",
1420 QString("model=\"%1\"") 1490 QString("model=\"%1\"")
1421 .arg(XmlExportable::getObjectExportId(model))); 1491 .arg(model->getExportId()));
1422 } 1492 }
1423 } 1493 }
1424 } 1494 }
1425 1495
1426 // We should write out the alignment models here. AlignmentModel 1496 // We should write out the alignment models here. AlignmentModel
1437 if (!alignment) continue; 1507 if (!alignment) continue;
1438 1508
1439 alignment->toXml(out, indent + " "); 1509 alignment->toXml(out, indent + " ");
1440 } 1510 }
1441 1511
1442 for (LayerSet::const_iterator i = m_layers.begin(); 1512 for (auto i = m_layers.begin(); i != m_layers.end(); ++i) {
1443 i != m_layers.end(); ++i) {
1444
1445 (*i)->toXml(out, indent + " "); 1513 (*i)->toXml(out, indent + " ");
1446 } 1514 }
1447 1515
1448 out << indent + "</data>\n"; 1516 out << indent + "</data>\n";
1449 } 1517 }
1451 void 1519 void
1452 Document::writePlaceholderMainModel(QTextStream &out, QString indent) const 1520 Document::writePlaceholderMainModel(QTextStream &out, QString indent) const
1453 { 1521 {
1454 out << indent; 1522 out << indent;
1455 out << QString("<model id=\"%1\" name=\"placeholder\" sampleRate=\"%2\" type=\"wavefile\" file=\":samples/silent.wav\" mainModel=\"true\"/>\n") 1523 out << QString("<model id=\"%1\" name=\"placeholder\" sampleRate=\"%2\" type=\"wavefile\" file=\":samples/silent.wav\" mainModel=\"true\"/>\n")
1456 .arg(getObjectExportId(m_mainModel)) 1524 .arg(m_mainModel->getExportId())
1457 .arg(m_mainModel->getSampleRate()); 1525 .arg(m_mainModel->getSampleRate());
1458 } 1526 }
1459 1527
1460 void 1528 void
1461 Document::writeBackwardCompatibleDerivation(QTextStream &out, QString indent, 1529 Document::writeBackwardCompatibleDerivation(QTextStream &out, QString indent,
1490 // have to be backward compatible: 1558 // have to be backward compatible:
1491 // 1559 //
1492 // out << indent 1560 // out << indent
1493 // << QString("<derivation type=\"transform\" source=\"%1\" " 1561 // << QString("<derivation type=\"transform\" source=\"%1\" "
1494 // "model=\"%2\" channel=\"%3\">\n") 1562 // "model=\"%2\" channel=\"%3\">\n")
1495 // .arg(XmlExportable::getObjectExportId(rec.source)) 1563 // .arg(rec.source->getExportId())
1496 // .arg(XmlExportable::getObjectExportId(targetModel)) 1564 // .arg(targetModel->getExportId())
1497 // .arg(rec.channel); 1565 // .arg(rec.channel);
1498 // 1566 //
1499 // transform.toXml(out, indent + " "); 1567 // transform.toXml(out, indent + " ");
1500 // 1568 //
1501 // out << indent << "</derivation>\n"; 1569 // out << indent << "</derivation>\n";
1515 out << indent; 1583 out << indent;
1516 out << QString("<derivation type=\"transform\" source=\"%1\" " 1584 out << QString("<derivation type=\"transform\" source=\"%1\" "
1517 "model=\"%2\" channel=\"%3\" domain=\"%4\" " 1585 "model=\"%2\" channel=\"%3\" domain=\"%4\" "
1518 "stepSize=\"%5\" blockSize=\"%6\" %7windowType=\"%8\" " 1586 "stepSize=\"%5\" blockSize=\"%6\" %7windowType=\"%8\" "
1519 "transform=\"%9\">\n") 1587 "transform=\"%9\">\n")
1520 .arg(XmlExportable::getObjectExportId(rec.source)) 1588 .arg(rec.source->getExportId())
1521 .arg(XmlExportable::getObjectExportId(targetModel)) 1589 .arg(targetModel->getExportId())
1522 .arg(rec.channel) 1590 .arg(rec.channel)
1523 .arg(TransformFactory::getInstance()->getTransformInputDomain 1591 .arg(TransformFactory::getInstance()->getTransformInputDomain
1524 (transform.getIdentifier())) 1592 (transform.getIdentifier()))
1525 .arg(transform.getStepSize()) 1593 .arg(transform.getStepSize())
1526 .arg(transform.getBlockSize()) 1594 .arg(transform.getBlockSize())