lbajardsilogic@16
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@16
|
2
|
lbajardsilogic@16
|
3 /*
|
lbajardsilogic@16
|
4 Sound Access
|
lbajardsilogic@16
|
5 EASAIER client application.
|
lbajardsilogic@16
|
6 Silogic 2007. Luc Barthélémy.
|
lbajardsilogic@16
|
7
|
lbajardsilogic@16
|
8 This program is free software; you can redistribute it and/or
|
lbajardsilogic@16
|
9 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@16
|
10 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@16
|
11 License, or (at your option) any later version. See the file
|
lbajardsilogic@16
|
12 COPYING included with this distribution for more information.
|
lbajardsilogic@16
|
13 */
|
lbajardsilogic@16
|
14
|
lbajardsilogic@16
|
15
|
lbajardsilogic@16
|
16 #include "system/System.h"
|
lbajardsilogic@16
|
17 #include "model/IntervalModel.h"
|
lbajardsilogic@16
|
18
|
lbajardsilogic@48
|
19 #include <QTextStream>
|
lbajardsilogic@16
|
20
|
lbajardsilogic@16
|
21
|
lbajardsilogic@16
|
22 TimeInterval::TimeInterval(long start, long end, float value):
|
lbajardsilogic@16
|
23 m_start(start), m_end(end), m_value(value)
|
lbajardsilogic@16
|
24 {
|
lbajardsilogic@16
|
25 }
|
lbajardsilogic@16
|
26
|
lbajardsilogic@16
|
27 TimeInterval::TimeInterval(long start, long end, const QString& label, float value):
|
lbajardsilogic@16
|
28 m_start(start), m_end(end), m_label(label), m_value(value)
|
lbajardsilogic@16
|
29 {
|
lbajardsilogic@16
|
30 }
|
lbajardsilogic@16
|
31
|
lbajardsilogic@16
|
32 TimeInterval::~TimeInterval()
|
lbajardsilogic@16
|
33 {
|
lbajardsilogic@16
|
34 }
|
lbajardsilogic@16
|
35
|
lbajardsilogic@16
|
36 QString
|
lbajardsilogic@16
|
37 TimeInterval::toXmlString(QString indent , QString extraAttributes ) const
|
lbajardsilogic@16
|
38 {
|
lbajardsilogic@16
|
39 return QString("%1<interval start=\"%2\" end=\"%3\" label=\"%4\" value=\"%5\" %6/>\n")
|
lbajardsilogic@16
|
40 .arg(indent).arg(m_start).arg(m_end).arg(m_label)
|
lbajardsilogic@16
|
41 .arg(m_value).arg(extraAttributes);
|
lbajardsilogic@16
|
42 }
|
lbajardsilogic@16
|
43
|
lbajardsilogic@16
|
44 QString
|
lbajardsilogic@16
|
45 TimeInterval::toDelimitedDataString(const QString& delimiter, size_t sampleRate) const
|
lbajardsilogic@16
|
46 {
|
lbajardsilogic@16
|
47 QStringList list;
|
lbajardsilogic@16
|
48 list << RealTime::frame2RealTime(m_start, sampleRate).toString().c_str();
|
lbajardsilogic@16
|
49 list << RealTime::frame2RealTime(m_end, sampleRate).toString().c_str();
|
lbajardsilogic@16
|
50 list << QString("%1").arg(m_value);
|
lbajardsilogic@16
|
51 list << m_label;
|
lbajardsilogic@16
|
52
|
lbajardsilogic@16
|
53 return list.join(delimiter);
|
lbajardsilogic@16
|
54 }
|
lbajardsilogic@16
|
55
|
lbajardsilogic@16
|
56 /**
|
lbajardsilogic@16
|
57 * IntervalModel
|
lbajardsilogic@16
|
58 */
|
lbajardsilogic@16
|
59
|
lbajardsilogic@16
|
60 IntervalModel::IntervalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd) :
|
lbajardsilogic@261
|
61 m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd),
|
lbajardsilogic@261
|
62 m_meanValue(0.2)
|
lbajardsilogic@16
|
63 {
|
lbajardsilogic@16
|
64
|
lbajardsilogic@16
|
65
|
lbajardsilogic@16
|
66 }
|
lbajardsilogic@16
|
67
|
lbajardsilogic@16
|
68 IntervalModel::~IntervalModel()
|
lbajardsilogic@16
|
69 {
|
lbajardsilogic@16
|
70
|
lbajardsilogic@16
|
71 }
|
lbajardsilogic@16
|
72
|
lbajardsilogic@16
|
73 QString
|
lbajardsilogic@16
|
74 IntervalModel::toDelimitedDataString(QString delimiter) const
|
lbajardsilogic@16
|
75 {
|
lbajardsilogic@16
|
76 QString s;
|
lbajardsilogic@16
|
77 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
78 {
|
lbajardsilogic@16
|
79 s += (*i)->toDelimitedDataString(delimiter, m_sampleRate) + "\n";
|
lbajardsilogic@16
|
80 }
|
lbajardsilogic@16
|
81
|
lbajardsilogic@16
|
82 return s;
|
lbajardsilogic@16
|
83 }
|
lbajardsilogic@16
|
84
|
lbajardsilogic@48
|
85 void
|
lbajardsilogic@48
|
86 IntervalModel::toXml(QTextStream &out,
|
lbajardsilogic@48
|
87 QString indent,
|
lbajardsilogic@48
|
88 QString extraAttributes) const
|
lbajardsilogic@16
|
89 {
|
lbajardsilogic@48
|
90 out << Model::toXmlString
|
lbajardsilogic@16
|
91 (indent, QString("type=\"interval\" dimensions=\"3\" resolution=\"%1\" notifyOnAdd=\"%2\" dataset=\"%3\" %4")
|
lbajardsilogic@16
|
92 .arg(m_resolution)
|
lbajardsilogic@16
|
93 .arg(m_notifyOnAdd ? "true" : "false")
|
lbajardsilogic@16
|
94 .arg(getObjectExportId(&m_intervals))
|
lbajardsilogic@16
|
95 .arg(extraAttributes));
|
lbajardsilogic@16
|
96
|
lbajardsilogic@48
|
97 out << indent;
|
lbajardsilogic@48
|
98 out << QString("<dataset id=\"%1\" dimensions=\"3\">\n")
|
lbajardsilogic@16
|
99 .arg(getObjectExportId(&m_intervals));
|
lbajardsilogic@16
|
100
|
lbajardsilogic@16
|
101 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
102 {
|
lbajardsilogic@48
|
103 out << (*i)->toXmlString(indent + " ");
|
lbajardsilogic@16
|
104 }
|
lbajardsilogic@16
|
105
|
lbajardsilogic@48
|
106 out << indent + "</dataset>\n";
|
lbajardsilogic@48
|
107 }
|
lbajardsilogic@48
|
108
|
lbajardsilogic@48
|
109 QString
|
lbajardsilogic@48
|
110 IntervalModel::toXmlString(QString indent,
|
lbajardsilogic@48
|
111 QString extraAttributes) const
|
lbajardsilogic@48
|
112 {
|
lbajardsilogic@48
|
113 QString s;
|
lbajardsilogic@48
|
114
|
lbajardsilogic@48
|
115 {
|
lbajardsilogic@48
|
116 QTextStream out(&s);
|
lbajardsilogic@48
|
117 toXml(out, indent, extraAttributes);
|
lbajardsilogic@48
|
118 }
|
lbajardsilogic@16
|
119
|
lbajardsilogic@16
|
120 return s;
|
lbajardsilogic@16
|
121 }
|
lbajardsilogic@16
|
122
|
lbajardsilogic@16
|
123 size_t
|
lbajardsilogic@16
|
124 IntervalModel::getStartFrame() const
|
lbajardsilogic@16
|
125 {
|
lbajardsilogic@16
|
126 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
127
|
lbajardsilogic@16
|
128 size_t start= 0;
|
lbajardsilogic@16
|
129
|
lbajardsilogic@16
|
130 if (m_intervals.size() > 0)
|
lbajardsilogic@16
|
131 start = (*m_intervals.begin())->start();
|
lbajardsilogic@16
|
132
|
lbajardsilogic@16
|
133 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
134 {
|
lbajardsilogic@16
|
135 if (start > ((size_t) ((*i)->start())))
|
lbajardsilogic@16
|
136 start = (size_t) ((*i)->start());
|
lbajardsilogic@16
|
137 }
|
lbajardsilogic@16
|
138
|
lbajardsilogic@16
|
139 return start;
|
lbajardsilogic@16
|
140 }
|
lbajardsilogic@16
|
141
|
lbajardsilogic@16
|
142 size_t
|
lbajardsilogic@16
|
143 IntervalModel::getEndFrame() const
|
lbajardsilogic@16
|
144 {
|
lbajardsilogic@16
|
145 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
146
|
lbajardsilogic@16
|
147 size_t end = 0;
|
lbajardsilogic@16
|
148
|
lbajardsilogic@16
|
149 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
150 {
|
lbajardsilogic@16
|
151 if (end < ((size_t) ((*i)->end())))
|
lbajardsilogic@16
|
152 end = (size_t) ((*i)->end());
|
lbajardsilogic@16
|
153 }
|
lbajardsilogic@16
|
154
|
lbajardsilogic@16
|
155 return end;
|
lbajardsilogic@16
|
156 }
|
lbajardsilogic@16
|
157
|
lbajardsilogic@16
|
158 Model*
|
lbajardsilogic@16
|
159 IntervalModel::clone() const
|
lbajardsilogic@16
|
160 {
|
lbajardsilogic@16
|
161 IntervalModel* model = new IntervalModel(m_sampleRate, m_resolution, m_notifyOnAdd);
|
lbajardsilogic@16
|
162 model->m_intervals = m_intervals;
|
lbajardsilogic@16
|
163
|
lbajardsilogic@16
|
164 return model;
|
lbajardsilogic@16
|
165 }
|
lbajardsilogic@16
|
166
|
lbajardsilogic@16
|
167 void
|
lbajardsilogic@16
|
168 IntervalModel::addInterval(long start, long end, const QString& label, float value)
|
lbajardsilogic@16
|
169 {
|
lbajardsilogic@16
|
170 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
171
|
lbajardsilogic@16
|
172 m_intervals.push_back(new TimeInterval(start, end, label, value));
|
lbajardsilogic@16
|
173 }
|
lbajardsilogic@16
|
174
|
lbajardsilogic@16
|
175 void IntervalModel::addInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
176 {
|
lbajardsilogic@16
|
177 {
|
lbajardsilogic@16
|
178 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
179
|
lbajardsilogic@16
|
180 m_intervals.push_back(ti);
|
lbajardsilogic@16
|
181 }
|
lbajardsilogic@16
|
182
|
lbajardsilogic@16
|
183 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
184 }
|
lbajardsilogic@16
|
185
|
lbajardsilogic@16
|
186 void IntervalModel::removeInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
187 {
|
lbajardsilogic@16
|
188 {
|
lbajardsilogic@16
|
189 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
190
|
lbajardsilogic@16
|
191 m_intervals.remove(ti);
|
lbajardsilogic@16
|
192 }
|
lbajardsilogic@16
|
193
|
lbajardsilogic@16
|
194 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
195 }
|
lbajardsilogic@16
|
196
|
lbajardsilogic@16
|
197 void
|
lbajardsilogic@16
|
198 IntervalModel::changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label)
|
lbajardsilogic@16
|
199 {
|
lbajardsilogic@16
|
200
|
lbajardsilogic@190
|
201 long startMin = MIN(start, ti->start());
|
lbajardsilogic@190
|
202 long endMax = MAX(end, ti->end());
|
lbajardsilogic@16
|
203
|
lbajardsilogic@16
|
204 {
|
lbajardsilogic@16
|
205 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
206
|
lbajardsilogic@16
|
207 if (label != ti->label())
|
lbajardsilogic@16
|
208 ti->label(label);
|
lbajardsilogic@16
|
209 ti->start(start);
|
lbajardsilogic@16
|
210 ti->end(end);
|
lbajardsilogic@16
|
211 ti->value(value);
|
lbajardsilogic@16
|
212 }
|
lbajardsilogic@16
|
213
|
lbajardsilogic@16
|
214 emit modelChanged(startMin, endMax);
|
lbajardsilogic@16
|
215 }
|
lbajardsilogic@16
|
216
|
lbajardsilogic@16
|
217
|