00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Fanout.h"
00020
00021
00022 using std::ostringstream;
00023 using std::vector;
00024
00025 using namespace Marsyas;
00026
00027 Fanout::Fanout(mrs_string name):MarSystem("Fanout", name)
00028 {
00029 isComposite_ = true;
00030 addControls();
00031 }
00032
00033 Fanout::Fanout(const Fanout& a): MarSystem(a)
00034 {
00035 ctrl_enabled_ = getctrl("mrs_realvec/enabled");
00036 ctrl_muted_ = getctrl("mrs_realvec/muted");
00037 }
00038
00039 Fanout::~Fanout()
00040 {
00041 deleteSlices();
00042 }
00043
00044 void
00045 Fanout::deleteSlices()
00046 {
00047 vector<realvec *>::const_iterator iter;
00048 for (iter= slices_.begin(); iter != slices_.end(); iter++)
00049 {
00050 delete *(iter);
00051 }
00052 slices_.clear();
00053 }
00054
00055 MarSystem*
00056 Fanout::clone() const
00057 {
00058 return new Fanout(*this);
00059 }
00060
00061 void
00062 Fanout::addControls()
00063 {
00064 addctrl("mrs_natural/disable", -1);
00065 setctrlState("mrs_natural/disable", true);
00066 addctrl("mrs_natural/enable", -1);
00067 setctrlState("mrs_natural/enable", true);
00068
00069 addctrl("mrs_string/enableChild", ",");
00070 setctrlState("mrs_string/enableChild", true);
00071 addctrl("mrs_string/disableChild", ",");
00072 setctrlState("mrs_string/disableChild", true);
00073
00074 addctrl("mrs_realvec/enabled", realvec(), ctrl_enabled_);
00075 addctrl("mrs_realvec/muted", realvec(), ctrl_muted_);
00076 }
00077
00078 void
00079 Fanout::myUpdate(MarControlPtr sender)
00080 {
00081 MarControlAccessor acc(ctrl_enabled_);
00082 mrs_realvec& enabled = acc.to<mrs_realvec>();
00083 if (enabled.getSize() < marsystemsSize_)
00084 {
00085 enabled.create(marsystemsSize_);
00086 enabled.setval(1.0);
00087 }
00088
00089 MarControlAccessor accMuted(ctrl_muted_);
00090 mrs_realvec& muted = accMuted.to<mrs_realvec>();
00091 if (muted.getSize() < marsystemsSize_)
00092 {
00093 muted.create(marsystemsSize_);
00094 muted.setval(0.0);
00095 }
00096
00097 if (marsystemsSize_ != 0)
00098 {
00099 localIndices_.create(marsystemsSize_);
00100 }
00101
00102
00103 disableChild_ = getctrl("mrs_string/disableChild")->to<mrs_string>();
00104 disableChildIndex_ = -1;
00105 for (size_t i=0; i < marsystems_.size(); ++i)
00106 {
00107 mrs_string s;
00108 s = marsystems_[i]->getType() + "/" + marsystems_[i]->getName();
00109 if (disableChild_ == s)
00110 {
00111 disableChildIndex_ = i;
00112 MRSDIAG("Fanout::myUpdate(): DISABLING child: " + marsystems_[i]->getAbsPath());
00113 }
00114 }
00115 if (disableChildIndex_ != -1)
00116 {
00117 enabled(disableChildIndex_) = 0.0;
00118 localIndices_(disableChildIndex_) = 0.0;
00119 setctrl("mrs_string/disableChild", ",");
00120 }
00121 if (disableChild_ == "all")
00122 {
00123 for (size_t i=0; i < marsystems_.size(); ++i)
00124 {
00125 enabled(i) = 0.0;
00126 localIndices_(i) = 0.0;
00127 setctrl("mrs_string/disableChild", ",");
00128 MRSDIAG("Fanout::myUpdate(): DISABLING child: " + marsystems_[i]->getAbsPath());
00129 }
00130 }
00131
00132 disable_ = getctrl("mrs_natural/disable")->to<mrs_natural>();
00133 if (disable_ != -1 && disable_ < (mrs_natural)marsystemsSize_)
00134 {
00135 enabled(disable_) = 0.0;
00136 localIndices_(disable_) = 0.0;
00137 setctrl("mrs_natural/disable", -1);
00138 MRSDIAG("Fanout::myUpdate(): DISABLING child: " + marsystems_[disable_]->getAbsPath());
00139 }
00140 else
00141 setctrl("mrs_natural/disable", -1);
00142
00143
00144 enableChild_ = getctrl("mrs_string/enableChild")->to<mrs_string>();
00145 enableChildIndex_ = -1;
00146 for (size_t i=0; i < marsystems_.size(); ++i)
00147 {
00148 mrs_string s;
00149 s = marsystems_[i]->getType() + "/" + marsystems_[i]->getName();
00150 if (enableChild_ == s)
00151 {
00152 enableChildIndex_ = i;
00153 MRSDIAG("Fanout::myUpdate(): ENABLING child: " + marsystems_[i]->getAbsPath());
00154 }
00155 }
00156 if (enableChildIndex_ != -1)
00157 {
00158 enabled(enableChildIndex_) = 1.0;
00159 localIndices_(enableChildIndex_) = 1.0;
00160 setctrl("mrs_string/enableChild", ",");
00161 }
00162
00163 enable_ = getctrl("mrs_natural/enable")->to<mrs_natural>();
00164 if (enable_ != -1 && enable_ < (mrs_natural)marsystemsSize_)
00165 {
00166 enabled(enable_) = 1.0;
00167 localIndices_(enable_) = 1.0;
00168 setctrl("mrs_natural/enable", -1);
00169 }
00170 else
00171 setctrl("mrs_natural/enable", -1);
00172
00173
00174 if (marsystemsSize_ != 0)
00175 {
00176 mrs_natural highestStabilizingDelay = ctrl_inStabilizingDelay_->to<mrs_natural>();
00177
00178 marsystems_[0]->setctrl("mrs_natural/inObservations", inObservations_);
00179 marsystems_[0]->setctrl("mrs_natural/inSamples", inSamples_);
00180 marsystems_[0]->setctrl("mrs_real/israte", israte_);
00181 marsystems_[0]->setctrl("mrs_string/inObsNames", inObsNames_);
00182 marsystems_[0]->setctrl("mrs_natural/inStabilizingDelay", inStabilizingDelay_);
00183 marsystems_[0]->update();
00184
00185
00186 ostringstream oss;
00187 mrs_natural onObservations = 0;
00188 if (enabled(0))
00189 {
00190 onObservations += marsystems_[0]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00191 localIndices_(0) = marsystems_[0]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00192 oss << marsystems_[0]->getctrl("mrs_string/onObsNames");
00193 mrs_natural localStabilizingDelay = marsystems_[0]->getctrl("mrs_natural/onStabilizingDelay")->to<mrs_natural>();
00194 if (highestStabilizingDelay < localStabilizingDelay)
00195 highestStabilizingDelay = localStabilizingDelay;
00196
00197 }
00198 for (mrs_natural i=1; i < marsystemsSize_; ++i)
00199 {
00200 marsystems_[i]->setctrl("mrs_natural/inSamples", marsystems_[i-1]->getctrl("mrs_natural/inSamples"));
00201 marsystems_[i]->setctrl("mrs_natural/inObservations", marsystems_[i-1]->getctrl("mrs_natural/inObservations"));
00202 marsystems_[i]->setctrl("mrs_real/israte", marsystems_[i-1]->getctrl("mrs_real/israte"));
00203 marsystems_[i]->setctrl("mrs_string/inObsNames", marsystems_[0]->getctrl("mrs_string/inObsNames"));
00204 marsystems_[i]->setctrl("mrs_natural/inStabilizingDelay", inStabilizingDelay_);
00205 marsystems_[i]->update(sender);
00206 if (enabled(i))
00207 {
00208 onObservations += (marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>());
00209 localIndices_(i) = marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00210
00211 oss << marsystems_[i]->getctrl("mrs_string/onObsNames");
00212 mrs_natural localStabilizingDelay = marsystems_[i]->getctrl("mrs_natural/onStabilizingDelay")->to<mrs_natural>();
00213 if (highestStabilizingDelay < localStabilizingDelay)
00214 highestStabilizingDelay = localStabilizingDelay;
00215 }
00216 }
00217
00218
00219 setctrl(ctrl_onSamples_, marsystems_[0]->getctrl("mrs_natural/onSamples")->to<mrs_natural>());
00220 setctrl(ctrl_onObservations_, onObservations);
00221 setctrl(ctrl_osrate_, marsystems_[0]->getctrl("mrs_real/osrate")->to<mrs_real>());
00222 setctrl(ctrl_onObsNames_, oss.str());
00223 setctrl(ctrl_onStabilizingDelay_, highestStabilizingDelay);
00224
00225
00226 if ((mrs_natural)slices_.size() < marsystemsSize_)
00227 slices_.resize(marsystemsSize_, NULL);
00228 for (mrs_natural i=0; i< marsystemsSize_; ++i)
00229 {
00230 if (slices_[i] != NULL)
00231 {
00232 if ((slices_[i])->getRows() != marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>() ||
00233 (slices_[i])->getCols() != marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>())
00234 {
00235 delete slices_[i];
00236 slices_[i] = new realvec(marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>(),
00237 marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>());
00238 }
00239 }
00240 else
00241 {
00242 slices_[i] = new realvec(marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>(),
00243 marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>());
00244 }
00245 (slices_[i])->setval(0.0);
00246 }
00247 }
00248 else
00249 MarSystem::myUpdate(sender);
00250 }
00251
00252 void
00253 Fanout::myProcess(realvec& in, realvec& out)
00254 {
00255 mrs_natural o,t;
00256 if (marsystemsSize_>0)
00257 {
00258 mrs_natural outIndex = 0;
00259
00260
00261
00262
00263 MarControlAccessor accMuted(ctrl_muted_);
00264 mrs_realvec& muted = accMuted.to<mrs_realvec>();
00265
00266 for (mrs_natural i = 0; i < marsystemsSize_; ++i)
00267 {
00268 if (localIndices_(i))
00269 {
00270
00271 if(!muted(i))
00272 {
00273 marsystems_[i]->process(in, *(slices_[i]));
00274
00275 for (o=0; o < localIndices_(i); o++)
00276 for (t=0; t < onSamples_; t++)
00277 out(outIndex + o,t) = (*(slices_[i]))(o,t);
00278 }
00279 outIndex += (mrs_natural)localIndices_(i);
00280 }
00281 }
00282 }
00283 else
00284 {
00285 MRSWARN("FanOut::process: composite has no children MarSystems - passing input to output without changes.");
00286 out = in;
00287 }
00288 }