Mercurial > hg > svcore
diff 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 |
line wrap: on
line diff
--- a/data/model/AggregateWaveModel.cpp Mon Dec 12 15:18:52 2016 +0000 +++ b/data/model/AggregateWaveModel.cpp Mon Sep 17 13:51:14 2018 +0100 @@ -25,10 +25,15 @@ AggregateWaveModel::m_zoomConstraint; AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) : - m_components(channelSpecs) + m_components(channelSpecs), + m_invalidated(false) { for (ChannelSpecList::const_iterator i = channelSpecs.begin(); i != channelSpecs.end(); ++i) { + + connect(i->model, SIGNAL(aboutToBeDeleted()), + this, SLOT(componentModelAboutToBeDeleted())); + if (i->model->getSampleRate() != channelSpecs.begin()->model->getSampleRate()) { SVDEBUG << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << endl; @@ -41,12 +46,27 @@ { } +void +AggregateWaveModel::componentModelAboutToBeDeleted() +{ + SVDEBUG << "AggregateWaveModel::componentModelAboutToBeDeleted: invalidating" + << endl; + m_components.clear(); + m_invalidated = true; + emit modelInvalidated(); +} + bool AggregateWaveModel::isOK() const { + if (m_invalidated) { + return false; + } for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { - if (!i->model->isOK()) return false; + if (!i->model->isOK()) { + return false; + } } return true; } @@ -55,6 +75,7 @@ AggregateWaveModel::isReady(int *completion) const { if (completion) *completion = 100; + bool ready = true; for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { @@ -71,13 +92,12 @@ AggregateWaveModel::getFrameCount() const { sv_frame_t count = 0; - for (ChannelSpecList::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { - sv_frame_t thisCount = i->model->getEndFrame() - i->model->getStartFrame(); + sv_frame_t thisCount = + i->model->getEndFrame() - i->model->getStartFrame(); if (thisCount > count) count = thisCount; } - return count; } @@ -94,7 +114,7 @@ return m_components.begin()->model->getSampleRate(); } -vector<float> +floatvec_t AggregateWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const { int ch0 = channel, ch1 = channel; @@ -103,8 +123,7 @@ ch1 = getChannelCount()-1; } - vector<float> result(count, 0.f); - + floatvec_t result(count, 0.f); sv_frame_t longest = 0; for (int c = ch0; c <= ch1; ++c) { @@ -123,13 +142,13 @@ return result; } -vector<vector<float>> +vector<floatvec_t> AggregateWaveModel::getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const { sv_frame_t min = count; - vector<vector<float>> result; + vector<floatvec_t> result; for (int c = fromchannel; c <= tochannel; ++c) { auto here = getData(c, start, count); @@ -198,10 +217,17 @@ } void -AggregateWaveModel::toXml(QTextStream &, - QString , - QString ) const +AggregateWaveModel::toXml(QTextStream &out, + QString indent, + QString extraAttributes) const { - //!!! complete + QStringList componentStrings; + for (const auto &c: m_components) { + componentStrings.push_back(QString("%1").arg(getObjectExportId(c.model))); + } + Model::toXml(out, indent, + QString("type=\"aggregatewave\" components=\"%1\" %2") + .arg(componentStrings.join(",")) + .arg(extraAttributes)); }