00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "AggregateWaveModel.h"
00017
00018 #include <iostream>
00019
00020 #include <QTextStream>
00021
00022 PowerOfSqrtTwoZoomConstraint
00023 AggregateWaveModel::m_zoomConstraint;
00024
00025 AggregateWaveModel::AggregateWaveModel(ChannelSpecList channelSpecs) :
00026 m_components(channelSpecs)
00027 {
00028 for (ChannelSpecList::const_iterator i = channelSpecs.begin();
00029 i != channelSpecs.end(); ++i) {
00030 if (i->model->getSampleRate() !=
00031 channelSpecs.begin()->model->getSampleRate()) {
00032 std::cerr << "AggregateWaveModel::AggregateWaveModel: WARNING: Component models do not all have the same sample rate" << std::endl;
00033 break;
00034 }
00035 }
00036 }
00037
00038 AggregateWaveModel::~AggregateWaveModel()
00039 {
00040 }
00041
00042 bool
00043 AggregateWaveModel::isOK() const
00044 {
00045 for (ChannelSpecList::const_iterator i = m_components.begin();
00046 i != m_components.end(); ++i) {
00047 if (!i->model->isOK()) return false;
00048 }
00049 return true;
00050 }
00051
00052 bool
00053 AggregateWaveModel::isReady(int *completion) const
00054 {
00055 if (completion) *completion = 100;
00056 bool ready = true;
00057 for (ChannelSpecList::const_iterator i = m_components.begin();
00058 i != m_components.end(); ++i) {
00059 int completionHere = 100;
00060 if (!i->model->isReady(&completionHere)) ready = false;
00061 if (completion && completionHere < *completion) {
00062 *completion = completionHere;
00063 }
00064 }
00065 return ready;
00066 }
00067
00068 size_t
00069 AggregateWaveModel::getFrameCount() const
00070 {
00071 size_t count = 0;
00072
00073 for (ChannelSpecList::const_iterator i = m_components.begin();
00074 i != m_components.end(); ++i) {
00075 size_t thisCount = i->model->getEndFrame() - i->model->getStartFrame();
00076 if (thisCount > count) count = thisCount;
00077 }
00078
00079 return count;
00080 }
00081
00082 size_t
00083 AggregateWaveModel::getChannelCount() const
00084 {
00085 return m_components.size();
00086 }
00087
00088 size_t
00089 AggregateWaveModel::getSampleRate() const
00090 {
00091 if (m_components.empty()) return 0;
00092 return m_components.begin()->model->getSampleRate();
00093 }
00094
00095 Model *
00096 AggregateWaveModel::clone() const
00097 {
00098 return new AggregateWaveModel(m_components);
00099 }
00100
00101 size_t
00102 AggregateWaveModel::getData(int channel, size_t start, size_t count,
00103 float *buffer) const
00104 {
00105 int ch0 = channel, ch1 = channel;
00106 bool mixing = false;
00107 if (channel == -1) {
00108 ch0 = 0;
00109 ch1 = getChannelCount()-1;
00110 mixing = true;
00111 }
00112
00113 float *readbuf = buffer;
00114 if (mixing) {
00115 readbuf = new float[count];
00116 for (size_t i = 0; i < count; ++i) {
00117 buffer[i] = 0.f;
00118 }
00119 }
00120
00121 size_t sz = count;
00122
00123 for (int c = ch0; c <= ch1; ++c) {
00124 size_t szHere =
00125 m_components[c].model->getData(m_components[c].channel,
00126 start, count,
00127 readbuf);
00128 if (szHere < sz) sz = szHere;
00129 if (mixing) {
00130 for (size_t i = 0; i < count; ++i) {
00131 buffer[i] += readbuf[i];
00132 }
00133 }
00134 }
00135
00136 if (mixing) delete[] readbuf;
00137 return sz;
00138 }
00139
00140 size_t
00141 AggregateWaveModel::getData(int channel, size_t start, size_t count,
00142 double *buffer) const
00143 {
00144 int ch0 = channel, ch1 = channel;
00145 bool mixing = false;
00146 if (channel == -1) {
00147 ch0 = 0;
00148 ch1 = getChannelCount()-1;
00149 mixing = true;
00150 }
00151
00152 double *readbuf = buffer;
00153 if (mixing) {
00154 readbuf = new double[count];
00155 for (size_t i = 0; i < count; ++i) {
00156 buffer[i] = 0.0;
00157 }
00158 }
00159
00160 size_t sz = count;
00161
00162 for (int c = ch0; c <= ch1; ++c) {
00163 size_t szHere =
00164 m_components[c].model->getData(m_components[c].channel,
00165 start, count,
00166 readbuf);
00167 if (szHere < sz) sz = szHere;
00168 if (mixing) {
00169 for (size_t i = 0; i < count; ++i) {
00170 buffer[i] += readbuf[i];
00171 }
00172 }
00173 }
00174
00175 if (mixing) delete[] readbuf;
00176 return sz;
00177 }
00178
00179 size_t
00180 AggregateWaveModel::getData(size_t fromchannel, size_t tochannel,
00181 size_t start, size_t count,
00182 float **buffer) const
00183 {
00184 size_t min = count;
00185
00186 for (size_t c = fromchannel; c <= tochannel; ++c) {
00187 size_t here = getData(c, start, count, buffer[c - fromchannel]);
00188 if (here < min) min = here;
00189 }
00190
00191 return min;
00192 }
00193
00194 size_t
00195 AggregateWaveModel::getSummaryBlockSize(size_t desired) const
00196 {
00198 return desired;
00199 }
00200
00201 void
00202 AggregateWaveModel::getSummaries(size_t channel, size_t start, size_t count,
00203 RangeBlock &ranges, size_t &blockSize) const
00204 {
00206 }
00207
00208 AggregateWaveModel::Range
00209 AggregateWaveModel::getSummary(size_t channel, size_t start, size_t count) const
00210 {
00212 return Range();
00213 }
00214
00215 size_t
00216 AggregateWaveModel::getComponentCount() const
00217 {
00218 return m_components.size();
00219 }
00220
00221 AggregateWaveModel::ModelChannelSpec
00222 AggregateWaveModel::getComponent(size_t c) const
00223 {
00224 return m_components[c];
00225 }
00226
00227 void
00228 AggregateWaveModel::componentModelChanged()
00229 {
00230 emit modelChanged();
00231 }
00232
00233 void
00234 AggregateWaveModel::componentModelChanged(size_t start, size_t end)
00235 {
00236 emit modelChanged(start, end);
00237 }
00238
00239 void
00240 AggregateWaveModel::componentModelCompletionChanged()
00241 {
00242 emit completionChanged();
00243 }
00244
00245 void
00246 AggregateWaveModel::toXml(QTextStream &out,
00247 QString indent,
00248 QString extraAttributes) const
00249 {
00251 }
00252