annotate data/model/Model.cpp @ 1669:f9b6e99e0520 single-point

Remove COMPLETION_UNKNOWN, which is never used (and never handled)
author Chris Cannam
date Wed, 27 Mar 2019 11:26:06 +0000
parents 70e172e6cc59
children dfcd05e8bd2f
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 Model::~Model()
Chris@150 24 {
Chris@690 25 // SVDEBUG << "Model::~Model(" << this << ")" << endl;
Chris@150 26
Chris@319 27 if (!m_aboutToDelete) {
Chris@1384 28 SVDEBUG << "NOTE: Model(" << this << ", \""
Chris@1384 29 << objectName() << "\", type uri <"
Chris@1384 30 << m_typeUri << ">)::~Model(): Model deleted "
Chris@1384 31 << "with no aboutToDelete notification"
Chris@1384 32 << 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@1500 41 int
Chris@1500 42 Model::getNextId()
Chris@1500 43 {
Chris@1500 44 static int nextId = 0;
Chris@1500 45 static QMutex mutex;
Chris@1500 46 QMutexLocker locker(&mutex);
Chris@1500 47 int i = nextId;
Chris@1500 48 if (nextId == INT_MAX) {
Chris@1500 49 nextId = INT_MIN;
Chris@1500 50 }
Chris@1500 51 ++nextId;
Chris@1500 52 return i;
Chris@1500 53 }
Chris@1500 54
Chris@150 55 void
Chris@319 56 Model::setSourceModel(Model *model)
Chris@319 57 {
Chris@319 58 if (m_sourceModel) {
Chris@319 59 disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
Chris@319 60 this, SLOT(sourceModelAboutToBeDeleted()));
Chris@319 61 }
Chris@319 62
Chris@319 63 m_sourceModel = model;
Chris@319 64
Chris@319 65 if (m_sourceModel) {
Chris@333 66 connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()),
Chris@333 67 this, SIGNAL(alignmentCompletionChanged()));
Chris@319 68 connect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
Chris@319 69 this, SLOT(sourceModelAboutToBeDeleted()));
Chris@319 70 }
Chris@319 71 }
Chris@319 72
Chris@319 73 void
Chris@319 74 Model::aboutToDelete()
Chris@319 75 {
Chris@1384 76 // SVDEBUG << "Model(" << this << ", \""
Chris@1384 77 // << objectName() << "\", type uri <"
Chris@1384 78 // << m_typeUri << ">)::aboutToDelete()" << endl;
Chris@360 79
Chris@319 80 if (m_aboutToDelete) {
Chris@1384 81 SVDEBUG << "WARNING: Model(" << this << ", \""
Chris@1384 82 << objectName() << "\", type uri <"
Chris@1384 83 << m_typeUri << ">)::aboutToDelete: "
Chris@1384 84 << "aboutToDelete called more than once for the same model"
Chris@1384 85 << endl;
Chris@319 86 }
Chris@319 87
Chris@319 88 emit aboutToBeDeleted();
Chris@319 89 m_aboutToDelete = true;
Chris@319 90 }
Chris@319 91
Chris@319 92 void
Chris@319 93 Model::sourceModelAboutToBeDeleted()
Chris@319 94 {
Chris@1582 95 m_sourceModel = nullptr;
Chris@319 96 }
Chris@319 97
Chris@319 98 void
Chris@319 99 Model::setAlignment(AlignmentModel *alignment)
Chris@319 100 {
Chris@319 101 if (m_alignment) {
Chris@319 102 m_alignment->aboutToDelete();
Chris@319 103 delete m_alignment;
Chris@319 104 }
Chris@1018 105
Chris@319 106 m_alignment = alignment;
Chris@1018 107
Chris@1018 108 if (m_alignment) {
Chris@1018 109 connect(m_alignment, SIGNAL(completionChanged()),
Chris@1018 110 this, SIGNAL(alignmentCompletionChanged()));
Chris@1018 111 }
Chris@319 112 }
Chris@319 113
Chris@407 114 const AlignmentModel *
Chris@407 115 Model::getAlignment() const
Chris@407 116 {
Chris@407 117 return m_alignment;
Chris@407 118 }
Chris@407 119
Chris@319 120 const Model *
Chris@319 121 Model::getAlignmentReference() const
Chris@319 122 {
Chris@333 123 if (!m_alignment) {
Chris@333 124 if (m_sourceModel) return m_sourceModel->getAlignmentReference();
Chris@1582 125 return nullptr;
Chris@333 126 }
Chris@319 127 return m_alignment->getReferenceModel();
Chris@319 128 }
Chris@319 129
Chris@1038 130 sv_frame_t
Chris@1038 131 Model::alignToReference(sv_frame_t frame) const
Chris@319 132 {
Chris@951 133 // cerr << "Model(" << this << ")::alignToReference(" << frame << ")" << endl;
Chris@333 134 if (!m_alignment) {
Chris@333 135 if (m_sourceModel) return m_sourceModel->alignToReference(frame);
Chris@333 136 else return frame;
Chris@333 137 }
Chris@1038 138 sv_frame_t refFrame = m_alignment->toReference(frame);
Chris@340 139 const Model *m = m_alignment->getReferenceModel();
Chris@340 140 if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
Chris@951 141 // cerr << "have alignment, aligned is " << refFrame << endl;
Chris@333 142 return refFrame;
Chris@319 143 }
Chris@319 144
Chris@1038 145 sv_frame_t
Chris@1038 146 Model::alignFromReference(sv_frame_t refFrame) const
Chris@319 147 {
Chris@951 148 // cerr << "Model(" << this << ")::alignFromReference(" << refFrame << ")" << endl;
Chris@333 149 if (!m_alignment) {
Chris@333 150 if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame);
Chris@333 151 else return refFrame;
Chris@333 152 }
Chris@1038 153 sv_frame_t frame = m_alignment->fromReference(refFrame);
Chris@340 154 if (frame > getEndFrame()) frame = getEndFrame();
Chris@951 155 // cerr << "have alignment, aligned is " << frame << endl;
Chris@333 156 return frame;
Chris@319 157 }
Chris@319 158
Chris@319 159 int
Chris@319 160 Model::getAlignmentCompletion() const
Chris@319 161 {
Chris@1561 162 // SVDEBUG << "Model::getAlignmentCompletion: m_alignment = "
Chris@1561 163 // << m_alignment << endl;
Chris@333 164 if (!m_alignment) {
Chris@333 165 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
Chris@333 166 else return 100;
Chris@333 167 }
Chris@319 168 int completion = 0;
Chris@319 169 (void)m_alignment->isReady(&completion);
Chris@1561 170 // SVDEBUG << " -> " << completion << endl;
Chris@319 171 return completion;
Chris@319 172 }
Chris@319 173
Chris@333 174 QString
Chris@333 175 Model::getTitle() const
Chris@333 176 {
Chris@333 177 if (m_sourceModel) return m_sourceModel->getTitle();
Chris@345 178 else return "";
Chris@333 179 }
Chris@333 180
Chris@333 181 QString
Chris@333 182 Model::getMaker() const
Chris@333 183 {
Chris@333 184 if (m_sourceModel) return m_sourceModel->getMaker();
Chris@345 185 else return "";
Chris@345 186 }
Chris@345 187
Chris@345 188 QString
Chris@345 189 Model::getLocation() const
Chris@345 190 {
Chris@345 191 if (m_sourceModel) return m_sourceModel->getLocation();
Chris@345 192 else return "";
Chris@333 193 }
Chris@333 194
Chris@319 195 void
Chris@150 196 Model::toXml(QTextStream &stream, QString indent,
Chris@150 197 QString extraAttributes) const
Chris@150 198 {
Chris@150 199 stream << indent;
Chris@150 200 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
Chris@1429 201 .arg(getObjectExportId(this))
Chris@1429 202 .arg(encodeEntities(objectName()))
Chris@1429 203 .arg(getSampleRate())
Chris@1429 204 .arg(getStartFrame())
Chris@1429 205 .arg(getEndFrame())
Chris@1429 206 .arg(extraAttributes);
Chris@150 207 }
Chris@150 208
Chris@150 209