svcore  1.9
Model.cpp
Go to the documentation of this file.
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