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