annotate data/model/Model.cpp @ 1520:954d0cf29ca7 import-audio-data

Switch the normalisation option in WritableWaveFileModel from normalising on read to normalising on write, so that the saved file is already normalised and therefore can be read again without having to remember to normalise it
author Chris Cannam
date Wed, 12 Sep 2018 13:56:56 +0100
parents 9d37c8cf9686
children d3814e07b8aa
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@319 97 m_sourceModel = 0;
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@371 127 return 0;
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@690 164 // SVDEBUG << "Model::getAlignmentCompletion" << endl;
Chris@333 165 if (!m_alignment) {
Chris@333 166 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
Chris@333 167 else return 100;
Chris@333 168 }
Chris@319 169 int completion = 0;
Chris@319 170 (void)m_alignment->isReady(&completion);
Chris@843 171 // cerr << " -> " << completion << endl;
Chris@319 172 return completion;
Chris@319 173 }
Chris@319 174
Chris@333 175 QString
Chris@333 176 Model::getTitle() const
Chris@333 177 {
Chris@333 178 if (m_sourceModel) return m_sourceModel->getTitle();
Chris@345 179 else return "";
Chris@333 180 }
Chris@333 181
Chris@333 182 QString
Chris@333 183 Model::getMaker() const
Chris@333 184 {
Chris@333 185 if (m_sourceModel) return m_sourceModel->getMaker();
Chris@345 186 else return "";
Chris@345 187 }
Chris@345 188
Chris@345 189 QString
Chris@345 190 Model::getLocation() const
Chris@345 191 {
Chris@345 192 if (m_sourceModel) return m_sourceModel->getLocation();
Chris@345 193 else return "";
Chris@333 194 }
Chris@333 195
Chris@319 196 void
Chris@150 197 Model::toXml(QTextStream &stream, QString indent,
Chris@150 198 QString extraAttributes) const
Chris@150 199 {
Chris@150 200 stream << indent;
Chris@150 201 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
Chris@1429 202 .arg(getObjectExportId(this))
Chris@1429 203 .arg(encodeEntities(objectName()))
Chris@1429 204 .arg(getSampleRate())
Chris@1429 205 .arg(getStartFrame())
Chris@1429 206 .arg(getEndFrame())
Chris@1429 207 .arg(extraAttributes);
Chris@150 208 }
Chris@150 209
Chris@150 210