Mercurial > hg > svcore
comparison data/model/AggregateWaveModel.cpp @ 1527:710e6250a401 zoom
Merge from default branch
author | Chris Cannam |
---|---|
date | Mon, 17 Sep 2018 13:51:14 +0100 |
parents | 2c0e04062a99 |
children | 7b4d56b01440 |
comparison
equal
deleted
inserted
replaced
1324:d4a28d1479a8 | 1527:710e6250a401 |
---|---|
23 | 23 |
24 PowerOfSqrtTwoZoomConstraint | 24 PowerOfSqrtTwoZoomConstraint |
25 AggregateWaveModel::m_zoomConstraint; | 25 AggregateWaveModel::m_zoomConstraint; |
26 | 26 |
27 AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : | 27 AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : |
28 m_components(channelSpecs) | 28 m_components(channelSpecs), |
29 m_invalidated(false) | |
29 { | 30 { |
30 for (ChannelSpecList::const_iterator i = channelSpecs.begin(); | 31 for (ChannelSpecList::const_iterator i = channelSpecs.begin(); |
31 i != channelSpecs.end(); ++i) { | 32 i != channelSpecs.end(); ++i) { |
33 | |
34 connect(i->model, SIGNAL(aboutToBeDeleted()), | |
35 this, SLOT(componentModelAboutToBeDeleted())); | |
36 | |
32 if (i->model->getSampleRate() != | 37 if (i->model->getSampleRate() != |
33 channelSpecs.begin()->model->getSampleRate()) { | 38 channelSpecs.begin()->model->getSampleRate()) { |
34 SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; | 39 SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; |
35 break; | 40 break; |
36 } | 41 } |
39 | 44 |
40 AggregateWaveModel::~AggregateWaveModel() | 45 AggregateWaveModel::~AggregateWaveModel() |
41 { | 46 { |
42 } | 47 } |
43 | 48 |
49 void | |
50 AggregateWaveModel::componentModelAboutToBeDeleted() | |
51 { | |
52 SVDEBUG << "AggregateWaveModel::componentModelAboutToBeDeleted: invalidating" | |
53 << endl; | |
54 m_components.clear(); | |
55 m_invalidated = true; | |
56 emit modelInvalidated(); | |
57 } | |
58 | |
44 bool | 59 bool |
45 AggregateWaveModel::isOK() const | 60 AggregateWaveModel::isOK() const |
46 { | 61 { |
62 if (m_invalidated) { | |
63 return false; | |
64 } | |
47 for (ChannelSpecList::const_iterator i = m_components.begin(); | 65 for (ChannelSpecList::const_iterator i = m_components.begin(); |
48 i != m_components.end(); ++i) { | 66 i != m_components.end(); ++i) { |
49 if (!i->model->isOK()) return false; | 67 if (!i->model->isOK()) { |
68 return false; | |
69 } | |
50 } | 70 } |
51 return true; | 71 return true; |
52 } | 72 } |
53 | 73 |
54 bool | 74 bool |
55 AggregateWaveModel::isReady(int *completion) const | 75 AggregateWaveModel::isReady(int *completion) const |
56 { | 76 { |
57 if (completion) *completion = 100; | 77 if (completion) *completion = 100; |
78 | |
58 bool ready = true; | 79 bool ready = true; |
59 for (ChannelSpecList::const_iterator i = m_components.begin(); | 80 for (ChannelSpecList::const_iterator i = m_components.begin(); |
60 i != m_components.end(); ++i) { | 81 i != m_components.end(); ++i) { |
61 int completionHere = 100; | 82 int completionHere = 100; |
62 if (!i->model->isReady(&completionHere)) ready = false; | 83 if (!i->model->isReady(&completionHere)) ready = false; |
69 | 90 |
70 sv_frame_t | 91 sv_frame_t |
71 AggregateWaveModel::getFrameCount() const | 92 AggregateWaveModel::getFrameCount() const |
72 { | 93 { |
73 sv_frame_t count = 0; | 94 sv_frame_t count = 0; |
74 | |
75 for (ChannelSpecList::const_iterator i = m_components.begin(); | 95 for (ChannelSpecList::const_iterator i = m_components.begin(); |
76 i != m_components.end(); ++i) { | 96 i != m_components.end(); ++i) { |
77 sv_frame_t thisCount = i->model->getEndFrame() - i->model->getStartFrame(); | 97 sv_frame_t thisCount = |
98 i->model->getEndFrame() - i->model->getStartFrame(); | |
78 if (thisCount > count) count = thisCount; | 99 if (thisCount > count) count = thisCount; |
79 } | 100 } |
80 | |
81 return count; | 101 return count; |
82 } | 102 } |
83 | 103 |
84 int | 104 int |
85 AggregateWaveModel::getChannelCount() const | 105 AggregateWaveModel::getChannelCount() const |
92 { | 112 { |
93 if (m_components.empty()) return 0; | 113 if (m_components.empty()) return 0; |
94 return m_components.begin()->model->getSampleRate(); | 114 return m_components.begin()->model->getSampleRate(); |
95 } | 115 } |
96 | 116 |
97 vector<float> | 117 floatvec_t |
98 AggregateWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const | 118 AggregateWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const |
99 { | 119 { |
100 int ch0 = channel, ch1 = channel; | 120 int ch0 = channel, ch1 = channel; |
101 if (channel == -1) { | 121 if (channel == -1) { |
102 ch0 = 0; | 122 ch0 = 0; |
103 ch1 = getChannelCount()-1; | 123 ch1 = getChannelCount()-1; |
104 } | 124 } |
105 | 125 |
106 vector<float> result(count, 0.f); | 126 floatvec_t result(count, 0.f); |
107 | |
108 sv_frame_t longest = 0; | 127 sv_frame_t longest = 0; |
109 | 128 |
110 for (int c = ch0; c <= ch1; ++c) { | 129 for (int c = ch0; c <= ch1; ++c) { |
111 | 130 |
112 auto here = m_components[c].model->getData(m_components[c].channel, | 131 auto here = m_components[c].model->getData(m_components[c].channel, |
121 | 140 |
122 result.resize(longest); | 141 result.resize(longest); |
123 return result; | 142 return result; |
124 } | 143 } |
125 | 144 |
126 vector<vector<float>> | 145 vector<floatvec_t> |
127 AggregateWaveModel::getMultiChannelData(int fromchannel, int tochannel, | 146 AggregateWaveModel::getMultiChannelData(int fromchannel, int tochannel, |
128 sv_frame_t start, sv_frame_t count) const | 147 sv_frame_t start, sv_frame_t count) const |
129 { | 148 { |
130 sv_frame_t min = count; | 149 sv_frame_t min = count; |
131 | 150 |
132 vector<vector<float>> result; | 151 vector<floatvec_t> result; |
133 | 152 |
134 for (int c = fromchannel; c <= tochannel; ++c) { | 153 for (int c = fromchannel; c <= tochannel; ++c) { |
135 auto here = getData(c, start, count); | 154 auto here = getData(c, start, count); |
136 if (sv_frame_t(here.size()) < min) { | 155 if (sv_frame_t(here.size()) < min) { |
137 min = sv_frame_t(here.size()); | 156 min = sv_frame_t(here.size()); |
196 { | 215 { |
197 emit completionChanged(); | 216 emit completionChanged(); |
198 } | 217 } |
199 | 218 |
200 void | 219 void |
201 AggregateWaveModel::toXml(QTextStream &, | 220 AggregateWaveModel::toXml(QTextStream &out, |
202 QString , | 221 QString indent, |
203 QString ) const | 222 QString extraAttributes) const |
204 { | 223 { |
205 //!!! complete | 224 QStringList componentStrings; |
206 } | 225 for (const auto &c: m_components) { |
207 | 226 componentStrings.push_back(QString("%1").arg(getObjectExportId(c.model))); |
227 } | |
228 Model::toXml(out, indent, | |
229 QString("type=\"aggregatewave\" components=\"%1\" %2") | |
230 .arg(componentStrings.join(",")) | |
231 .arg(extraAttributes)); | |
232 } | |
233 |