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@16
|
61 m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd)
|
lbajardsilogic@16
|
62 {
|
lbajardsilogic@16
|
63
|
lbajardsilogic@16
|
64
|
lbajardsilogic@16
|
65 }
|
lbajardsilogic@16
|
66
|
lbajardsilogic@16
|
67 IntervalModel::~IntervalModel()
|
lbajardsilogic@16
|
68 {
|
lbajardsilogic@16
|
69
|
lbajardsilogic@16
|
70 }
|
lbajardsilogic@16
|
71
|
lbajardsilogic@16
|
72 QString
|
lbajardsilogic@16
|
73 IntervalModel::toDelimitedDataString(QString delimiter) const
|
lbajardsilogic@16
|
74 {
|
lbajardsilogic@16
|
75 QString s;
|
lbajardsilogic@16
|
76 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
77 {
|
lbajardsilogic@16
|
78 s += (*i)->toDelimitedDataString(delimiter, m_sampleRate) + "\n";
|
lbajardsilogic@16
|
79 }
|
lbajardsilogic@16
|
80
|
lbajardsilogic@16
|
81 return s;
|
lbajardsilogic@16
|
82 }
|
lbajardsilogic@16
|
83
|
lbajardsilogic@48
|
84 void
|
lbajardsilogic@48
|
85 IntervalModel::toXml(QTextStream &out,
|
lbajardsilogic@48
|
86 QString indent,
|
lbajardsilogic@48
|
87 QString extraAttributes) const
|
lbajardsilogic@16
|
88 {
|
lbajardsilogic@48
|
89 out << Model::toXmlString
|
lbajardsilogic@16
|
90 (indent, QString("type=\"interval\" dimensions=\"3\" resolution=\"%1\" notifyOnAdd=\"%2\" dataset=\"%3\" %4")
|
lbajardsilogic@16
|
91 .arg(m_resolution)
|
lbajardsilogic@16
|
92 .arg(m_notifyOnAdd ? "true" : "false")
|
lbajardsilogic@16
|
93 .arg(getObjectExportId(&m_intervals))
|
lbajardsilogic@16
|
94 .arg(extraAttributes));
|
lbajardsilogic@16
|
95
|
lbajardsilogic@48
|
96 out << indent;
|
lbajardsilogic@48
|
97 out << QString("<dataset id=\"%1\" dimensions=\"3\">\n")
|
lbajardsilogic@16
|
98 .arg(getObjectExportId(&m_intervals));
|
lbajardsilogic@16
|
99
|
lbajardsilogic@16
|
100 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
101 {
|
lbajardsilogic@48
|
102 out << (*i)->toXmlString(indent + " ");
|
lbajardsilogic@16
|
103 }
|
lbajardsilogic@16
|
104
|
lbajardsilogic@48
|
105 out << indent + "</dataset>\n";
|
lbajardsilogic@48
|
106 }
|
lbajardsilogic@48
|
107
|
lbajardsilogic@48
|
108 QString
|
lbajardsilogic@48
|
109 IntervalModel::toXmlString(QString indent,
|
lbajardsilogic@48
|
110 QString extraAttributes) const
|
lbajardsilogic@48
|
111 {
|
lbajardsilogic@48
|
112 QString s;
|
lbajardsilogic@48
|
113
|
lbajardsilogic@48
|
114 {
|
lbajardsilogic@48
|
115 QTextStream out(&s);
|
lbajardsilogic@48
|
116 toXml(out, indent, extraAttributes);
|
lbajardsilogic@48
|
117 }
|
lbajardsilogic@16
|
118
|
lbajardsilogic@16
|
119 return s;
|
lbajardsilogic@16
|
120 }
|
lbajardsilogic@16
|
121
|
lbajardsilogic@16
|
122 size_t
|
lbajardsilogic@16
|
123 IntervalModel::getStartFrame() const
|
lbajardsilogic@16
|
124 {
|
lbajardsilogic@16
|
125 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
126
|
lbajardsilogic@16
|
127 size_t start= 0;
|
lbajardsilogic@16
|
128
|
lbajardsilogic@16
|
129 if (m_intervals.size() > 0)
|
lbajardsilogic@16
|
130 start = (*m_intervals.begin())->start();
|
lbajardsilogic@16
|
131
|
lbajardsilogic@16
|
132 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
133 {
|
lbajardsilogic@16
|
134 if (start > ((size_t) ((*i)->start())))
|
lbajardsilogic@16
|
135 start = (size_t) ((*i)->start());
|
lbajardsilogic@16
|
136 }
|
lbajardsilogic@16
|
137
|
lbajardsilogic@16
|
138 return start;
|
lbajardsilogic@16
|
139 }
|
lbajardsilogic@16
|
140
|
lbajardsilogic@16
|
141 size_t
|
lbajardsilogic@16
|
142 IntervalModel::getEndFrame() const
|
lbajardsilogic@16
|
143 {
|
lbajardsilogic@16
|
144 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
145
|
lbajardsilogic@16
|
146 size_t end = 0;
|
lbajardsilogic@16
|
147
|
lbajardsilogic@16
|
148 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
149 {
|
lbajardsilogic@16
|
150 if (end < ((size_t) ((*i)->end())))
|
lbajardsilogic@16
|
151 end = (size_t) ((*i)->end());
|
lbajardsilogic@16
|
152 }
|
lbajardsilogic@16
|
153
|
lbajardsilogic@16
|
154 return end;
|
lbajardsilogic@16
|
155 }
|
lbajardsilogic@16
|
156
|
lbajardsilogic@16
|
157 Model*
|
lbajardsilogic@16
|
158 IntervalModel::clone() const
|
lbajardsilogic@16
|
159 {
|
lbajardsilogic@16
|
160 IntervalModel* model = new IntervalModel(m_sampleRate, m_resolution, m_notifyOnAdd);
|
lbajardsilogic@16
|
161 model->m_intervals = m_intervals;
|
lbajardsilogic@16
|
162
|
lbajardsilogic@16
|
163 return model;
|
lbajardsilogic@16
|
164 }
|
lbajardsilogic@16
|
165
|
lbajardsilogic@16
|
166 void
|
lbajardsilogic@16
|
167 IntervalModel::addInterval(long start, long end, const QString& label, float value)
|
lbajardsilogic@16
|
168 {
|
lbajardsilogic@16
|
169 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
170
|
lbajardsilogic@16
|
171 m_intervals.push_back(new TimeInterval(start, end, label, value));
|
lbajardsilogic@16
|
172 }
|
lbajardsilogic@16
|
173
|
lbajardsilogic@16
|
174 void IntervalModel::addInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
175 {
|
lbajardsilogic@16
|
176 {
|
lbajardsilogic@16
|
177 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
178
|
lbajardsilogic@16
|
179 m_intervals.push_back(ti);
|
lbajardsilogic@16
|
180 }
|
lbajardsilogic@16
|
181
|
lbajardsilogic@16
|
182 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
183 }
|
lbajardsilogic@16
|
184
|
lbajardsilogic@16
|
185 void IntervalModel::removeInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
186 {
|
lbajardsilogic@16
|
187 {
|
lbajardsilogic@16
|
188 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
189
|
lbajardsilogic@16
|
190 m_intervals.remove(ti);
|
lbajardsilogic@16
|
191 }
|
lbajardsilogic@16
|
192
|
lbajardsilogic@16
|
193 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
194 }
|
lbajardsilogic@16
|
195
|
lbajardsilogic@16
|
196 void
|
lbajardsilogic@16
|
197 IntervalModel::changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label)
|
lbajardsilogic@16
|
198 {
|
lbajardsilogic@16
|
199
|
lbajardsilogic@16
|
200 long startMin = min(start, ti->start());
|
lbajardsilogic@16
|
201 long endMax = max(end, ti->end());
|
lbajardsilogic@16
|
202
|
lbajardsilogic@16
|
203 {
|
lbajardsilogic@16
|
204 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
205
|
lbajardsilogic@16
|
206 if (label != ti->label())
|
lbajardsilogic@16
|
207 ti->label(label);
|
lbajardsilogic@16
|
208 ti->start(start);
|
lbajardsilogic@16
|
209 ti->end(end);
|
lbajardsilogic@16
|
210 ti->value(value);
|
lbajardsilogic@16
|
211 }
|
lbajardsilogic@16
|
212
|
lbajardsilogic@16
|
213 emit modelChanged(startMin, endMax);
|
lbajardsilogic@16
|
214 }
|
lbajardsilogic@16
|
215
|
lbajardsilogic@16
|
216
|