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 Model::~Model()
|
Chris@150
|
24 {
|
Chris@690
|
25 // SVDEBUG << "Model::~Model(" << this << ")" << endl;
|
Chris@150
|
26
|
Chris@319
|
27 if (!m_aboutToDelete) {
|
Chris@1384
|
28 SVDEBUG << "NOTE: Model(" << this << ", \""
|
Chris@1384
|
29 << objectName() << "\", type uri <"
|
Chris@1384
|
30 << m_typeUri << ">)::~Model(): Model deleted "
|
Chris@1384
|
31 << "with no aboutToDelete notification"
|
Chris@1384
|
32 << 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@1500
|
41 int
|
Chris@1500
|
42 Model::getNextId()
|
Chris@1500
|
43 {
|
Chris@1500
|
44 static int nextId = 0;
|
Chris@1500
|
45 static QMutex mutex;
|
Chris@1500
|
46 QMutexLocker locker(&mutex);
|
Chris@1500
|
47 int i = nextId;
|
Chris@1500
|
48 if (nextId == INT_MAX) {
|
Chris@1500
|
49 nextId = INT_MIN;
|
Chris@1500
|
50 }
|
Chris@1500
|
51 ++nextId;
|
Chris@1500
|
52 return i;
|
Chris@1500
|
53 }
|
Chris@1500
|
54
|
Chris@150
|
55 void
|
Chris@319
|
56 Model::setSourceModel(Model *model)
|
Chris@319
|
57 {
|
Chris@319
|
58 if (m_sourceModel) {
|
Chris@319
|
59 disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
|
Chris@319
|
60 this, SLOT(sourceModelAboutToBeDeleted()));
|
Chris@319
|
61 }
|
Chris@319
|
62
|
Chris@319
|
63 m_sourceModel = model;
|
Chris@319
|
64
|
Chris@319
|
65 if (m_sourceModel) {
|
Chris@333
|
66 connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()),
|
Chris@333
|
67 this, SIGNAL(alignmentCompletionChanged()));
|
Chris@319
|
68 connect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
|
Chris@319
|
69 this, SLOT(sourceModelAboutToBeDeleted()));
|
Chris@319
|
70 }
|
Chris@319
|
71 }
|
Chris@319
|
72
|
Chris@319
|
73 void
|
Chris@319
|
74 Model::aboutToDelete()
|
Chris@319
|
75 {
|
Chris@1384
|
76 // SVDEBUG << "Model(" << this << ", \""
|
Chris@1384
|
77 // << objectName() << "\", type uri <"
|
Chris@1384
|
78 // << m_typeUri << ">)::aboutToDelete()" << endl;
|
Chris@360
|
79
|
Chris@319
|
80 if (m_aboutToDelete) {
|
Chris@1384
|
81 SVDEBUG << "WARNING: Model(" << this << ", \""
|
Chris@1384
|
82 << objectName() << "\", type uri <"
|
Chris@1384
|
83 << m_typeUri << ">)::aboutToDelete: "
|
Chris@1384
|
84 << "aboutToDelete called more than once for the same model"
|
Chris@1384
|
85 << endl;
|
Chris@319
|
86 }
|
Chris@319
|
87
|
Chris@319
|
88 emit aboutToBeDeleted();
|
Chris@319
|
89 m_aboutToDelete = true;
|
Chris@319
|
90 }
|
Chris@319
|
91
|
Chris@319
|
92 void
|
Chris@319
|
93 Model::sourceModelAboutToBeDeleted()
|
Chris@319
|
94 {
|
Chris@1582
|
95 m_sourceModel = nullptr;
|
Chris@319
|
96 }
|
Chris@319
|
97
|
Chris@319
|
98 void
|
Chris@319
|
99 Model::setAlignment(AlignmentModel *alignment)
|
Chris@319
|
100 {
|
Chris@319
|
101 if (m_alignment) {
|
Chris@319
|
102 m_alignment->aboutToDelete();
|
Chris@319
|
103 delete m_alignment;
|
Chris@319
|
104 }
|
Chris@1018
|
105
|
Chris@319
|
106 m_alignment = alignment;
|
Chris@1018
|
107
|
Chris@1018
|
108 if (m_alignment) {
|
Chris@1018
|
109 connect(m_alignment, SIGNAL(completionChanged()),
|
Chris@1018
|
110 this, SIGNAL(alignmentCompletionChanged()));
|
Chris@1018
|
111 }
|
Chris@319
|
112 }
|
Chris@319
|
113
|
Chris@407
|
114 const AlignmentModel *
|
Chris@407
|
115 Model::getAlignment() const
|
Chris@407
|
116 {
|
Chris@407
|
117 return m_alignment;
|
Chris@407
|
118 }
|
Chris@407
|
119
|
Chris@319
|
120 const Model *
|
Chris@319
|
121 Model::getAlignmentReference() const
|
Chris@319
|
122 {
|
Chris@333
|
123 if (!m_alignment) {
|
Chris@333
|
124 if (m_sourceModel) return m_sourceModel->getAlignmentReference();
|
Chris@1582
|
125 return nullptr;
|
Chris@333
|
126 }
|
Chris@319
|
127 return m_alignment->getReferenceModel();
|
Chris@319
|
128 }
|
Chris@319
|
129
|
Chris@1038
|
130 sv_frame_t
|
Chris@1038
|
131 Model::alignToReference(sv_frame_t frame) const
|
Chris@319
|
132 {
|
Chris@951
|
133 // cerr << "Model(" << this << ")::alignToReference(" << frame << ")" << endl;
|
Chris@333
|
134 if (!m_alignment) {
|
Chris@333
|
135 if (m_sourceModel) return m_sourceModel->alignToReference(frame);
|
Chris@333
|
136 else return frame;
|
Chris@333
|
137 }
|
Chris@1038
|
138 sv_frame_t refFrame = m_alignment->toReference(frame);
|
Chris@340
|
139 const Model *m = m_alignment->getReferenceModel();
|
Chris@340
|
140 if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
|
Chris@951
|
141 // cerr << "have alignment, aligned is " << refFrame << endl;
|
Chris@333
|
142 return refFrame;
|
Chris@319
|
143 }
|
Chris@319
|
144
|
Chris@1038
|
145 sv_frame_t
|
Chris@1038
|
146 Model::alignFromReference(sv_frame_t refFrame) const
|
Chris@319
|
147 {
|
Chris@951
|
148 // cerr << "Model(" << this << ")::alignFromReference(" << refFrame << ")" << endl;
|
Chris@333
|
149 if (!m_alignment) {
|
Chris@333
|
150 if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame);
|
Chris@333
|
151 else return refFrame;
|
Chris@333
|
152 }
|
Chris@1038
|
153 sv_frame_t frame = m_alignment->fromReference(refFrame);
|
Chris@340
|
154 if (frame > getEndFrame()) frame = getEndFrame();
|
Chris@951
|
155 // cerr << "have alignment, aligned is " << frame << endl;
|
Chris@333
|
156 return frame;
|
Chris@319
|
157 }
|
Chris@319
|
158
|
Chris@319
|
159 int
|
Chris@319
|
160 Model::getAlignmentCompletion() const
|
Chris@319
|
161 {
|
Chris@1561
|
162 // SVDEBUG << "Model::getAlignmentCompletion: m_alignment = "
|
Chris@1561
|
163 // << m_alignment << endl;
|
Chris@333
|
164 if (!m_alignment) {
|
Chris@333
|
165 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
|
Chris@333
|
166 else return 100;
|
Chris@333
|
167 }
|
Chris@319
|
168 int completion = 0;
|
Chris@319
|
169 (void)m_alignment->isReady(&completion);
|
Chris@1561
|
170 // SVDEBUG << " -> " << completion << endl;
|
Chris@319
|
171 return completion;
|
Chris@319
|
172 }
|
Chris@319
|
173
|
Chris@333
|
174 QString
|
Chris@333
|
175 Model::getTitle() const
|
Chris@333
|
176 {
|
Chris@333
|
177 if (m_sourceModel) return m_sourceModel->getTitle();
|
Chris@345
|
178 else return "";
|
Chris@333
|
179 }
|
Chris@333
|
180
|
Chris@333
|
181 QString
|
Chris@333
|
182 Model::getMaker() const
|
Chris@333
|
183 {
|
Chris@333
|
184 if (m_sourceModel) return m_sourceModel->getMaker();
|
Chris@345
|
185 else return "";
|
Chris@345
|
186 }
|
Chris@345
|
187
|
Chris@345
|
188 QString
|
Chris@345
|
189 Model::getLocation() const
|
Chris@345
|
190 {
|
Chris@345
|
191 if (m_sourceModel) return m_sourceModel->getLocation();
|
Chris@345
|
192 else return "";
|
Chris@333
|
193 }
|
Chris@333
|
194
|
Chris@319
|
195 void
|
Chris@150
|
196 Model::toXml(QTextStream &stream, QString indent,
|
Chris@150
|
197 QString extraAttributes) const
|
Chris@150
|
198 {
|
Chris@150
|
199 stream << indent;
|
Chris@150
|
200 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
|
Chris@1429
|
201 .arg(getObjectExportId(this))
|
Chris@1429
|
202 .arg(encodeEntities(objectName()))
|
Chris@1429
|
203 .arg(getSampleRate())
|
Chris@1429
|
204 .arg(getStartFrame())
|
Chris@1429
|
205 .arg(getEndFrame())
|
Chris@1429
|
206 .arg(extraAttributes);
|
Chris@150
|
207 }
|
Chris@150
|
208
|
Chris@150
|
209
|