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@16
|
19
|
lbajardsilogic@16
|
20
|
lbajardsilogic@16
|
21 TimeInterval::TimeInterval(long start, long end, float value):
|
lbajardsilogic@16
|
22 m_start(start), m_end(end), m_value(value)
|
lbajardsilogic@16
|
23 {
|
lbajardsilogic@16
|
24 }
|
lbajardsilogic@16
|
25
|
lbajardsilogic@16
|
26 TimeInterval::TimeInterval(long start, long end, const QString& label, float value):
|
lbajardsilogic@16
|
27 m_start(start), m_end(end), m_label(label), m_value(value)
|
lbajardsilogic@16
|
28 {
|
lbajardsilogic@16
|
29 }
|
lbajardsilogic@16
|
30
|
lbajardsilogic@16
|
31 TimeInterval::~TimeInterval()
|
lbajardsilogic@16
|
32 {
|
lbajardsilogic@16
|
33 }
|
lbajardsilogic@16
|
34
|
lbajardsilogic@16
|
35 QString
|
lbajardsilogic@16
|
36 TimeInterval::toXmlString(QString indent , QString extraAttributes ) const
|
lbajardsilogic@16
|
37 {
|
lbajardsilogic@16
|
38 return QString("%1<interval start=\"%2\" end=\"%3\" label=\"%4\" value=\"%5\" %6/>\n")
|
lbajardsilogic@16
|
39 .arg(indent).arg(m_start).arg(m_end).arg(m_label)
|
lbajardsilogic@16
|
40 .arg(m_value).arg(extraAttributes);
|
lbajardsilogic@16
|
41 }
|
lbajardsilogic@16
|
42
|
lbajardsilogic@16
|
43 QString
|
lbajardsilogic@16
|
44 TimeInterval::toDelimitedDataString(const QString& delimiter, size_t sampleRate) const
|
lbajardsilogic@16
|
45 {
|
lbajardsilogic@16
|
46 QStringList list;
|
lbajardsilogic@16
|
47 list << RealTime::frame2RealTime(m_start, sampleRate).toString().c_str();
|
lbajardsilogic@16
|
48 list << RealTime::frame2RealTime(m_end, sampleRate).toString().c_str();
|
lbajardsilogic@16
|
49 list << QString("%1").arg(m_value);
|
lbajardsilogic@16
|
50 list << m_label;
|
lbajardsilogic@16
|
51
|
lbajardsilogic@16
|
52 return list.join(delimiter);
|
lbajardsilogic@16
|
53 }
|
lbajardsilogic@16
|
54
|
lbajardsilogic@16
|
55 /**
|
lbajardsilogic@16
|
56 * IntervalModel
|
lbajardsilogic@16
|
57 */
|
lbajardsilogic@16
|
58
|
lbajardsilogic@16
|
59 IntervalModel::IntervalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd) :
|
lbajardsilogic@16
|
60 m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd)
|
lbajardsilogic@16
|
61 {
|
lbajardsilogic@16
|
62
|
lbajardsilogic@16
|
63
|
lbajardsilogic@16
|
64 }
|
lbajardsilogic@16
|
65
|
lbajardsilogic@16
|
66 IntervalModel::~IntervalModel()
|
lbajardsilogic@16
|
67 {
|
lbajardsilogic@16
|
68
|
lbajardsilogic@16
|
69 }
|
lbajardsilogic@16
|
70
|
lbajardsilogic@16
|
71 QString
|
lbajardsilogic@16
|
72 IntervalModel::toDelimitedDataString(QString delimiter) const
|
lbajardsilogic@16
|
73 {
|
lbajardsilogic@16
|
74 QString s;
|
lbajardsilogic@16
|
75 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
76 {
|
lbajardsilogic@16
|
77 s += (*i)->toDelimitedDataString(delimiter, m_sampleRate) + "\n";
|
lbajardsilogic@16
|
78 }
|
lbajardsilogic@16
|
79
|
lbajardsilogic@16
|
80 return s;
|
lbajardsilogic@16
|
81 }
|
lbajardsilogic@16
|
82
|
lbajardsilogic@16
|
83 QString
|
lbajardsilogic@16
|
84 IntervalModel::toXmlString(QString indent, QString extraAttributes) const
|
lbajardsilogic@16
|
85 {
|
lbajardsilogic@16
|
86 QString s;
|
lbajardsilogic@16
|
87
|
lbajardsilogic@16
|
88 s += Model::toXmlString
|
lbajardsilogic@16
|
89 (indent, QString("type=\"interval\" dimensions=\"3\" resolution=\"%1\" notifyOnAdd=\"%2\" dataset=\"%3\" %4")
|
lbajardsilogic@16
|
90 .arg(m_resolution)
|
lbajardsilogic@16
|
91 .arg(m_notifyOnAdd ? "true" : "false")
|
lbajardsilogic@16
|
92 .arg(getObjectExportId(&m_intervals))
|
lbajardsilogic@16
|
93 .arg(extraAttributes));
|
lbajardsilogic@16
|
94
|
lbajardsilogic@16
|
95 s += indent;
|
lbajardsilogic@16
|
96 s += QString("<dataset id=\"%1\" dimensions=\"3\"\">\n")
|
lbajardsilogic@16
|
97 .arg(getObjectExportId(&m_intervals));
|
lbajardsilogic@16
|
98
|
lbajardsilogic@16
|
99 for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
100 {
|
lbajardsilogic@16
|
101 s += (*i)->toXmlString(indent + " ");
|
lbajardsilogic@16
|
102 }
|
lbajardsilogic@16
|
103
|
lbajardsilogic@16
|
104 s += indent + "</dataset>\n";
|
lbajardsilogic@16
|
105
|
lbajardsilogic@16
|
106 return s;
|
lbajardsilogic@16
|
107 }
|
lbajardsilogic@16
|
108
|
lbajardsilogic@16
|
109 size_t
|
lbajardsilogic@16
|
110 IntervalModel::getStartFrame() const
|
lbajardsilogic@16
|
111 {
|
lbajardsilogic@16
|
112 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
113
|
lbajardsilogic@16
|
114 size_t start= 0;
|
lbajardsilogic@16
|
115
|
lbajardsilogic@16
|
116 if (m_intervals.size() > 0)
|
lbajardsilogic@16
|
117 start = (*m_intervals.begin())->start();
|
lbajardsilogic@16
|
118
|
lbajardsilogic@16
|
119 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
120 {
|
lbajardsilogic@16
|
121 if (start > ((size_t) ((*i)->start())))
|
lbajardsilogic@16
|
122 start = (size_t) ((*i)->start());
|
lbajardsilogic@16
|
123 }
|
lbajardsilogic@16
|
124
|
lbajardsilogic@16
|
125 return start;
|
lbajardsilogic@16
|
126 }
|
lbajardsilogic@16
|
127
|
lbajardsilogic@16
|
128 size_t
|
lbajardsilogic@16
|
129 IntervalModel::getEndFrame() const
|
lbajardsilogic@16
|
130 {
|
lbajardsilogic@16
|
131 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
132
|
lbajardsilogic@16
|
133 size_t end = 0;
|
lbajardsilogic@16
|
134
|
lbajardsilogic@16
|
135 for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i)
|
lbajardsilogic@16
|
136 {
|
lbajardsilogic@16
|
137 if (end < ((size_t) ((*i)->end())))
|
lbajardsilogic@16
|
138 end = (size_t) ((*i)->end());
|
lbajardsilogic@16
|
139 }
|
lbajardsilogic@16
|
140
|
lbajardsilogic@16
|
141 return end;
|
lbajardsilogic@16
|
142 }
|
lbajardsilogic@16
|
143
|
lbajardsilogic@16
|
144 Model*
|
lbajardsilogic@16
|
145 IntervalModel::clone() const
|
lbajardsilogic@16
|
146 {
|
lbajardsilogic@16
|
147 IntervalModel* model = new IntervalModel(m_sampleRate, m_resolution, m_notifyOnAdd);
|
lbajardsilogic@16
|
148 model->m_intervals = m_intervals;
|
lbajardsilogic@16
|
149
|
lbajardsilogic@16
|
150 return model;
|
lbajardsilogic@16
|
151 }
|
lbajardsilogic@16
|
152
|
lbajardsilogic@16
|
153 void
|
lbajardsilogic@16
|
154 IntervalModel::addInterval(long start, long end, const QString& label, float value)
|
lbajardsilogic@16
|
155 {
|
lbajardsilogic@16
|
156 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
157
|
lbajardsilogic@16
|
158 m_intervals.push_back(new TimeInterval(start, end, label, value));
|
lbajardsilogic@16
|
159 }
|
lbajardsilogic@16
|
160
|
lbajardsilogic@16
|
161 void IntervalModel::addInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
162 {
|
lbajardsilogic@16
|
163 {
|
lbajardsilogic@16
|
164 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
165
|
lbajardsilogic@16
|
166 m_intervals.push_back(ti);
|
lbajardsilogic@16
|
167 }
|
lbajardsilogic@16
|
168
|
lbajardsilogic@16
|
169 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
170 }
|
lbajardsilogic@16
|
171
|
lbajardsilogic@16
|
172 void IntervalModel::removeInterval(TimeIntervalPtr ti)
|
lbajardsilogic@16
|
173 {
|
lbajardsilogic@16
|
174 {
|
lbajardsilogic@16
|
175 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
176
|
lbajardsilogic@16
|
177 m_intervals.remove(ti);
|
lbajardsilogic@16
|
178 }
|
lbajardsilogic@16
|
179
|
lbajardsilogic@16
|
180 emit modelChanged(ti->start(), ti->end());
|
lbajardsilogic@16
|
181 }
|
lbajardsilogic@16
|
182
|
lbajardsilogic@16
|
183 void
|
lbajardsilogic@16
|
184 IntervalModel::changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label)
|
lbajardsilogic@16
|
185 {
|
lbajardsilogic@16
|
186
|
lbajardsilogic@16
|
187 long startMin = min(start, ti->start());
|
lbajardsilogic@16
|
188 long endMax = max(end, ti->end());
|
lbajardsilogic@16
|
189
|
lbajardsilogic@16
|
190 {
|
lbajardsilogic@16
|
191 QMutexLocker locker(&m_mutex);
|
lbajardsilogic@16
|
192
|
lbajardsilogic@16
|
193 if (label != ti->label())
|
lbajardsilogic@16
|
194 ti->label(label);
|
lbajardsilogic@16
|
195 ti->start(start);
|
lbajardsilogic@16
|
196 ti->end(end);
|
lbajardsilogic@16
|
197 ti->value(value);
|
lbajardsilogic@16
|
198 }
|
lbajardsilogic@16
|
199
|
lbajardsilogic@16
|
200 emit modelChanged(startMin, endMax);
|
lbajardsilogic@16
|
201 }
|
lbajardsilogic@16
|
202
|
lbajardsilogic@16
|
203
|