annotate data/model/Model.cpp @ 1698:dbd13eb7dad1

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