annotate data/model/Model.cpp @ 1196:c7b9c902642f spectrogram-minor-refactor

Fix threshold in spectrogram -- it wasn't working in the last release. There is a new protocol for this. Formerly the threshold parameter had a range from -50dB to 0 with the default at -50, and -50 treated internally as "no threshold". However, there was a hardcoded, hidden internal threshold for spectrogram colour mapping at -80dB with anything below this being rounded to zero. Now the threshold parameter has range -81 to -1 with the default at -80, -81 is treated internally as "no threshold", and there is no hidden internal threshold. So the default behaviour is the same as before, an effective -80dB threshold, but it is now possible to change this in both directions. Sessions reloaded from prior versions may look slightly different because, if the session says there should be no threshold, there will now actually be no threshold instead of having the hidden internal one. Still need to do something in the UI to make it apparent that the -81dB setting removes the threshold entirely. This is at least no worse than the previous, also obscured, magic -50dB setting.
author Chris Cannam
date Mon, 01 Aug 2016 16:21:01 +0100
parents cc27f35aa75c
children 368449629a30
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@1038 113 sv_frame_t
Chris@1038 114 Model::alignToReference(sv_frame_t 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@1038 121 sv_frame_t 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@1038 128 sv_frame_t
Chris@1038 129 Model::alignFromReference(sv_frame_t 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@1038 136 sv_frame_t 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