svcore
1.9
|
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 00002 00003 /* 00004 Sonic Visualiser 00005 An audio file viewer and annotation editor. 00006 Centre for Digital Music, Queen Mary, University of London. 00007 This file copyright 2006 Chris Cannam. 00008 00009 This program is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU General Public License as 00011 published by the Free Software Foundation; either version 2 of the 00012 License, or (at your option) any later version. See the file 00013 COPYING included with this distribution for more information. 00014 */ 00015 00016 #include "Model.h" 00017 #include "AlignmentModel.h" 00018 00019 #include <QTextStream> 00020 00021 #include <iostream> 00022 00023 const int Model::COMPLETION_UNKNOWN = -1; 00024 00025 Model::~Model() 00026 { 00027 // SVDEBUG << "Model::~Model(" << this << ")" << endl; 00028 00029 if (!m_aboutToDelete) { 00030 SVDEBUG << "NOTE: Model::~Model(" << this << ", \"" 00031 << objectName() << "\"): Model deleted " 00032 << "with no aboutToDelete notification" << endl; 00033 } 00034 00035 if (m_alignment) { 00036 m_alignment->aboutToDelete(); 00037 delete m_alignment; 00038 } 00039 } 00040 00041 void 00042 Model::setSourceModel(Model *model) 00043 { 00044 if (m_sourceModel) { 00045 disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()), 00046 this, SLOT(sourceModelAboutToBeDeleted())); 00047 } 00048 00049 m_sourceModel = model; 00050 00051 if (m_sourceModel) { 00052 connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()), 00053 this, SIGNAL(alignmentCompletionChanged())); 00054 connect(m_sourceModel, SIGNAL(aboutToBeDeleted()), 00055 this, SLOT(sourceModelAboutToBeDeleted())); 00056 } 00057 } 00058 00059 void 00060 Model::aboutToDelete() 00061 { 00062 // cerr << "Model(" << this << ")::aboutToDelete()" << endl; 00063 00064 if (m_aboutToDelete) { 00065 cerr << "WARNING: Model(" << this << ", \"" 00066 << objectName() << "\")::aboutToDelete: " 00067 << "aboutToDelete called more than once for the same model" 00068 << endl; 00069 } 00070 00071 emit aboutToBeDeleted(); 00072 m_aboutToDelete = true; 00073 } 00074 00075 void 00076 Model::sourceModelAboutToBeDeleted() 00077 { 00078 m_sourceModel = 0; 00079 } 00080 00081 void 00082 Model::setAlignment(AlignmentModel *alignment) 00083 { 00084 if (m_alignment) { 00085 m_alignment->aboutToDelete(); 00086 delete m_alignment; 00087 } 00088 m_alignment = alignment; 00089 connect(m_alignment, SIGNAL(completionChanged()), 00090 this, SIGNAL(alignmentCompletionChanged())); 00091 } 00092 00093 const AlignmentModel * 00094 Model::getAlignment() const 00095 { 00096 return m_alignment; 00097 } 00098 00099 const Model * 00100 Model::getAlignmentReference() const 00101 { 00102 if (!m_alignment) { 00103 if (m_sourceModel) return m_sourceModel->getAlignmentReference(); 00104 return 0; 00105 } 00106 return m_alignment->getReferenceModel(); 00107 } 00108 00109 int 00110 Model::alignToReference(int frame) const 00111 { 00112 // cerr << "Model(" << this << ")::alignToReference(" << frame << ")" << endl; 00113 if (!m_alignment) { 00114 if (m_sourceModel) return m_sourceModel->alignToReference(frame); 00115 else return frame; 00116 } 00117 int refFrame = m_alignment->toReference(frame); 00118 const Model *m = m_alignment->getReferenceModel(); 00119 if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame(); 00120 // cerr << "have alignment, aligned is " << refFrame << endl; 00121 return refFrame; 00122 } 00123 00124 int 00125 Model::alignFromReference(int refFrame) const 00126 { 00127 // cerr << "Model(" << this << ")::alignFromReference(" << refFrame << ")" << endl; 00128 if (!m_alignment) { 00129 if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame); 00130 else return refFrame; 00131 } 00132 int frame = m_alignment->fromReference(refFrame); 00133 if (frame > getEndFrame()) frame = getEndFrame(); 00134 // cerr << "have alignment, aligned is " << frame << endl; 00135 return frame; 00136 } 00137 00138 int 00139 Model::getAlignmentCompletion() const 00140 { 00141 // SVDEBUG << "Model::getAlignmentCompletion" << endl; 00142 if (!m_alignment) { 00143 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion(); 00144 else return 100; 00145 } 00146 int completion = 0; 00147 (void)m_alignment->isReady(&completion); 00148 // cerr << " -> " << completion << endl; 00149 return completion; 00150 } 00151 00152 QString 00153 Model::getTitle() const 00154 { 00155 if (m_sourceModel) return m_sourceModel->getTitle(); 00156 else return ""; 00157 } 00158 00159 QString 00160 Model::getMaker() const 00161 { 00162 if (m_sourceModel) return m_sourceModel->getMaker(); 00163 else return ""; 00164 } 00165 00166 QString 00167 Model::getLocation() const 00168 { 00169 if (m_sourceModel) return m_sourceModel->getLocation(); 00170 else return ""; 00171 } 00172 00173 void 00174 Model::toXml(QTextStream &stream, QString indent, 00175 QString extraAttributes) const 00176 { 00177 stream << indent; 00178 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n") 00179 .arg(getObjectExportId(this)) 00180 .arg(encodeEntities(objectName())) 00181 .arg(getSampleRate()) 00182 .arg(getStartFrame()) 00183 .arg(getEndFrame()) 00184 .arg(extraAttributes); 00185 } 00186 00187