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 #include "base/PlayParameterRepository.h"
00019 
00020 #include <QTextStream>
00021 
00022 #include <iostream>
00023 
00024 const int Model::COMPLETION_UNKNOWN = -1;
00025 
00026 Model::~Model()
00027 {
00028     std::cerr << "Model::~Model(" << this << ")" << std::endl;
00029 
00030     if (!m_aboutToDelete) {
00031         std::cerr << "NOTE: Model::~Model(" << this << ", \""
00032                   << objectName().toStdString() << "\"): Model deleted "
00033                   << "with no aboutToDelete notification" << std::endl;
00034     }
00035 
00036     if (m_alignment) {
00037         m_alignment->aboutToDelete();
00038         delete m_alignment;
00039     }
00040 
00041     // Subclasses have to handle adding themselves to the repository,
00042     // if they want to be played.  We can't do it from here because
00043     // the repository would be unable to tell whether we were playable
00044     // or not (because dynamic_cast won't work from the base class ctor)
00045     PlayParameterRepository::getInstance()->removeModel(this);
00046 }
00047 
00048 void
00049 Model::setSourceModel(Model *model)
00050 {
00051     if (m_sourceModel) {
00052         disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
00053                    this, SLOT(sourceModelAboutToBeDeleted()));
00054     }
00055 
00056     m_sourceModel = model;
00057 
00058     if (m_sourceModel) {
00059         connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()),
00060                 this, SIGNAL(alignmentCompletionChanged()));
00061         connect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
00062                 this, SLOT(sourceModelAboutToBeDeleted()));
00063     }
00064 }
00065 
00066 void
00067 Model::aboutToDelete()
00068 {
00069     std::cerr << "Model(" << this << ")::aboutToDelete()" << std::endl;
00070 
00071     if (m_aboutToDelete) {
00072         std::cerr << "WARNING: Model(" << this << ", \""
00073                   << objectName().toStdString() << "\")::aboutToDelete: "
00074                   << "aboutToDelete called more than once for the same model"
00075                   << std::endl;
00076     }
00077 
00078     emit aboutToBeDeleted();
00079     m_aboutToDelete = true;
00080 }
00081 
00082 void
00083 Model::sourceModelAboutToBeDeleted()
00084 {
00085     m_sourceModel = 0;
00086 }
00087 
00088 void
00089 Model::setAlignment(AlignmentModel *alignment)
00090 {
00091     if (m_alignment) {
00092         m_alignment->aboutToDelete();
00093         delete m_alignment;
00094     }
00095     m_alignment = alignment;
00096     connect(m_alignment, SIGNAL(completionChanged()),
00097             this, SIGNAL(alignmentCompletionChanged()));
00098 }
00099 
00100 const Model *
00101 Model::getAlignmentReference() const
00102 {
00103     if (!m_alignment) {
00104         if (m_sourceModel) return m_sourceModel->getAlignmentReference();
00105         return 0;
00106     }
00107     return m_alignment->getReferenceModel();
00108 }
00109 
00110 size_t
00111 Model::alignToReference(size_t frame) const
00112 {
00113     if (!m_alignment) {
00114         if (m_sourceModel) return m_sourceModel->alignToReference(frame);
00115         else return frame;
00116     }
00117     size_t refFrame = m_alignment->toReference(frame);
00118     const Model *m = m_alignment->getReferenceModel();
00119     if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
00120     return refFrame;
00121 }
00122 
00123 size_t
00124 Model::alignFromReference(size_t refFrame) const
00125 {
00126     if (!m_alignment) {
00127         if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame);
00128         else return refFrame;
00129     }
00130     size_t frame = m_alignment->fromReference(refFrame);
00131     if (frame > getEndFrame()) frame = getEndFrame();
00132     return frame;
00133 }
00134 
00135 int
00136 Model::getAlignmentCompletion() const
00137 {
00138 //    std::cerr << "Model::getAlignmentCompletion" << std::endl;
00139     if (!m_alignment) {
00140         if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
00141         else return 100;
00142     }
00143     int completion = 0;
00144     (void)m_alignment->isReady(&completion);
00145 //    std::cerr << " -> " << completion << std::endl;
00146     return completion;
00147 }
00148 
00149 QString
00150 Model::getTitle() const
00151 {
00152     if (m_sourceModel) return m_sourceModel->getTitle();
00153     else return "";
00154 }
00155 
00156 QString
00157 Model::getMaker() const
00158 {
00159     if (m_sourceModel) return m_sourceModel->getMaker();
00160     else return "";
00161 }
00162 
00163 QString
00164 Model::getLocation() const
00165 {
00166     if (m_sourceModel) return m_sourceModel->getLocation();
00167     else return "";
00168 }
00169 
00170 void
00171 Model::toXml(QTextStream &stream, QString indent,
00172              QString extraAttributes) const
00173 {
00174     stream << indent;
00175     stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
00176         .arg(getObjectExportId(this))
00177         .arg(encodeEntities(objectName()))
00178         .arg(getSampleRate())
00179         .arg(getStartFrame())
00180         .arg(getEndFrame())
00181         .arg(extraAttributes);
00182 }
00183 
00184 

Generated on Wed Feb 20 15:45:26 2008 for SonicVisualiser by  doxygen 1.5.1