annotate data/model/Model.cpp @ 1018:4a2c150ecd67

Avoid crash when setting alignment to 0
author Chris Cannam
date Thu, 20 Nov 2014 16:18:31 +0000
parents 4b9fc70a37d5
children cc27f35aa75c
rev   line source
Chris@150 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@150 2
Chris@150 3 /*
Chris@150 4 Sonic Visualiser
Chris@150 5 An audio file viewer and annotation editor.
Chris@150 6 Centre for Digital Music, Queen Mary, University of London.
Chris@150 7 This file copyright 2006 Chris Cannam.
Chris@150 8
Chris@150 9 This program is free software; you can redistribute it and/or
Chris@150 10 modify it under the terms of the GNU General Public License as
Chris@150 11 published by the Free Software Foundation; either version 2 of the
Chris@150 12 License, or (at your option) any later version. See the file
Chris@150 13 COPYING included with this distribution for more information.
Chris@150 14 */
Chris@150 15
Chris@150 16 #include "Model.h"
Chris@319 17 #include "AlignmentModel.h"
Chris@150 18
Chris@150 19 #include <QTextStream>
Chris@150 20
Chris@150 21 #include <iostream>
Chris@150 22
Chris@150 23 const int Model::COMPLETION_UNKNOWN = -1;
Chris@150 24
Chris@150 25 Model::~Model()
Chris@150 26 {
Chris@690 27 // SVDEBUG << "Model::~Model(" << this << ")" << endl;
Chris@150 28
Chris@319 29 if (!m_aboutToDelete) {
Chris@690 30 SVDEBUG << "NOTE: Model::~Model(" << this << ", \""
Chris@686 31 << objectName() << "\"): Model deleted "
Chris@687 32 << "with no aboutToDelete notification" << endl;
Chris@319 33 }
Chris@319 34
Chris@319 35 if (m_alignment) {
Chris@319 36 m_alignment->aboutToDelete();
Chris@319 37 delete m_alignment;
Chris@319 38 }
Chris@150 39 }
Chris@150 40
Chris@150 41 void
Chris@319 42 Model::setSourceModel(Model *model)
Chris@319 43 {
Chris@319 44 if (m_sourceModel) {
Chris@319 45 disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
Chris@319 46 this, SLOT(sourceModelAboutToBeDeleted()));
Chris@319 47 }
Chris@319 48
Chris@319 49 m_sourceModel = model;
Chris@319 50
Chris@319 51 if (m_sourceModel) {
Chris@333 52 connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()),
Chris@333 53 this, SIGNAL(alignmentCompletionChanged()));
Chris@319 54 connect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
Chris@319 55 this, SLOT(sourceModelAboutToBeDeleted()));
Chris@319 56 }
Chris@319 57 }
Chris@319 58
Chris@319 59 void
Chris@319 60 Model::aboutToDelete()
Chris@319 61 {
Chris@843 62 // cerr << "Model(" << this << ")::aboutToDelete()" << endl;
Chris@360 63
Chris@319 64 if (m_aboutToDelete) {
Chris@843 65 cerr << "WARNING: Model(" << this << ", \""
Chris@686 66 << objectName() << "\")::aboutToDelete: "
Chris@319 67 << "aboutToDelete called more than once for the same model"
Chris@843 68 << endl;
Chris@319 69 }
Chris@319 70
Chris@319 71 emit aboutToBeDeleted();
Chris@319 72 m_aboutToDelete = true;
Chris@319 73 }
Chris@319 74
Chris@319 75 void
Chris@319 76 Model::sourceModelAboutToBeDeleted()
Chris@319 77 {
Chris@319 78 m_sourceModel = 0;
Chris@319 79 }
Chris@319 80
Chris@319 81 void
Chris@319 82 Model::setAlignment(AlignmentModel *alignment)
Chris@319 83 {
Chris@319 84 if (m_alignment) {
Chris@319 85 m_alignment->aboutToDelete();
Chris@319 86 delete m_alignment;
Chris@319 87 }
Chris@1018 88
Chris@319 89 m_alignment = alignment;
Chris@1018 90
Chris@1018 91 if (m_alignment) {
Chris@1018 92 connect(m_alignment, SIGNAL(completionChanged()),
Chris@1018 93 this, SIGNAL(alignmentCompletionChanged()));
Chris@1018 94 }
Chris@319 95 }
Chris@319 96
Chris@407 97 const AlignmentModel *
Chris@407 98 Model::getAlignment() const
Chris@407 99 {
Chris@407 100 return m_alignment;
Chris@407 101 }
Chris@407 102
Chris@319 103 const Model *
Chris@319 104 Model::getAlignmentReference() const
Chris@319 105 {
Chris@333 106 if (!m_alignment) {
Chris@333 107 if (m_sourceModel) return m_sourceModel->getAlignmentReference();
Chris@371 108 return 0;
Chris@333 109 }
Chris@319 110 return m_alignment->getReferenceModel();
Chris@319 111 }
Chris@319 112
Chris@929 113 int
Chris@929 114 Model::alignToReference(int frame) const
Chris@319 115 {
Chris@951 116 // cerr << "Model(" << this << ")::alignToReference(" << frame << ")" << endl;
Chris@333 117 if (!m_alignment) {
Chris@333 118 if (m_sourceModel) return m_sourceModel->alignToReference(frame);
Chris@333 119 else return frame;
Chris@333 120 }
Chris@929 121 int refFrame = m_alignment->toReference(frame);
Chris@340 122 const Model *m = m_alignment->getReferenceModel();
Chris@340 123 if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
Chris@951 124 // cerr << "have alignment, aligned is " << refFrame << endl;
Chris@333 125 return refFrame;
Chris@319 126 }
Chris@319 127
Chris@929 128 int
Chris@929 129 Model::alignFromReference(int refFrame) const
Chris@319 130 {
Chris@951 131 // cerr << "Model(" << this << ")::alignFromReference(" << refFrame << ")" << endl;
Chris@333 132 if (!m_alignment) {
Chris@333 133 if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame);
Chris@333 134 else return refFrame;
Chris@333 135 }
Chris@929 136 int frame = m_alignment->fromReference(refFrame);
Chris@340 137 if (frame > getEndFrame()) frame = getEndFrame();
Chris@951 138 // cerr << "have alignment, aligned is " << frame << endl;
Chris@333 139 return frame;
Chris@319 140 }
Chris@319 141
Chris@319 142 int
Chris@319 143 Model::getAlignmentCompletion() const
Chris@319 144 {
Chris@690 145 // SVDEBUG << "Model::getAlignmentCompletion" << endl;
Chris@333 146 if (!m_alignment) {
Chris@333 147 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
Chris@333 148 else return 100;
Chris@333 149 }
Chris@319 150 int completion = 0;
Chris@319 151 (void)m_alignment->isReady(&completion);
Chris@843 152 // cerr << " -> " << completion << endl;
Chris@319 153 return completion;
Chris@319 154 }
Chris@319 155
Chris@333 156 QString
Chris@333 157 Model::getTitle() const
Chris@333 158 {
Chris@333 159 if (m_sourceModel) return m_sourceModel->getTitle();
Chris@345 160 else return "";
Chris@333 161 }
Chris@333 162
Chris@333 163 QString
Chris@333 164 Model::getMaker() const
Chris@333 165 {
Chris@333 166 if (m_sourceModel) return m_sourceModel->getMaker();
Chris@345 167 else return "";
Chris@345 168 }
Chris@345 169
Chris@345 170 QString
Chris@345 171 Model::getLocation() const
Chris@345 172 {
Chris@345 173 if (m_sourceModel) return m_sourceModel->getLocation();
Chris@345 174 else return "";
Chris@333 175 }
Chris@333 176
Chris@319 177 void
Chris@150 178 Model::toXml(QTextStream &stream, QString indent,
Chris@150 179 QString extraAttributes) const
Chris@150 180 {
Chris@150 181 stream << indent;
Chris@150 182 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
Chris@150 183 .arg(getObjectExportId(this))
Chris@150 184 .arg(encodeEntities(objectName()))
Chris@150 185 .arg(getSampleRate())
Chris@150 186 .arg(getStartFrame())
Chris@150 187 .arg(getEndFrame())
Chris@150 188 .arg(extraAttributes);
Chris@150 189 }
Chris@150 190
Chris@150 191