Mercurial > hg > svapp
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()) |