00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "FlowThru.h"
00020
00021 using std::ostringstream;
00022 using namespace Marsyas;
00023 using std::cout;
00024 using std::endl;
00025
00026
00027 FlowThru::FlowThru(mrs_string name):MarSystem("FlowThru",name)
00028 {
00029 isComposite_ = true;
00030 addControls();
00031 }
00032
00033 FlowThru::FlowThru(const FlowThru& a):MarSystem(a)
00034 {
00035 ctrl_innerOut_ = getctrl("mrs_realvec/innerOut");
00036 }
00037
00038 FlowThru::~FlowThru()
00039 {
00040
00041 }
00042
00043 MarSystem*
00044 FlowThru::clone() const
00045 {
00046 return new FlowThru(*this);
00047 }
00048
00049 void
00050 FlowThru::addControls()
00051 {
00052 addctrl("mrs_realvec/innerOut", realvec(), ctrl_innerOut_);
00053 }
00054
00055
00056 void
00057 FlowThru::myUpdate(MarControlPtr sender)
00058 {
00059
00060
00061 MarSystem::myUpdate(sender);
00062
00063 if (marsystemsSize_ != 0)
00064 {
00065
00066 marsystems_[0]->setctrl("mrs_natural/inObservations", inObservations_);
00067 marsystems_[0]->setctrl("mrs_natural/inSamples", inSamples_);
00068 marsystems_[0]->setctrl("mrs_real/israte", israte_);
00069 marsystems_[0]->setctrl("mrs_string/inObsNames", inObsNames_);
00070 marsystems_[0]->update();
00071
00072
00073 for(mrs_natural i=1; i < marsystemsSize_; ++i){
00074 marsystems_[i]->setctrl(marsystems_[i]->ctrl_inObsNames_,
00075 marsystems_[i-1]->ctrl_onObsNames_);
00076 marsystems_[i]->setctrl(marsystems_[i]->ctrl_inObservations_,
00077 marsystems_[i-1]->ctrl_onObservations_);
00078 marsystems_[i]->setctrl(marsystems_[i]->ctrl_inSamples_,
00079 marsystems_[i-1]->ctrl_onSamples_);
00080 marsystems_[i]->setctrl(marsystems_[i]->ctrl_israte_,
00081 marsystems_[i-1]->ctrl_osrate_);
00082 marsystems_[i]->update();
00083 }
00084
00085
00086
00087
00088 ctrl_innerOut_->linkTo(marsystems_[marsystemsSize_-1]->ctrl_processedData_);
00089
00090
00091
00092 for(mrs_natural i=0; i< marsystemsSize_; ++i)
00093 {
00094 MarControlAccessor acc(marsystems_[i]->ctrl_processedData_, NOUPDATE);
00095 realvec& processedData = acc.to<mrs_realvec>();
00096
00097 if (processedData.getRows() != marsystems_[i]->ctrl_onObservations_->to<mrs_natural>() ||
00098 processedData.getCols() != marsystems_[i]->ctrl_onSamples_->to<mrs_natural>())
00099 {
00100
00101 processedData.create(marsystems_[i]->ctrl_onObservations_->to<mrs_natural>(),
00102 marsystems_[i]->ctrl_onSamples_->to<mrs_natural>());
00103 }
00104
00105 if(i==marsystemsSize_-1)
00106 {
00107 MarControlAccessor acc(ctrl_innerOut_, NOUPDATE);
00108 realvec& innerOut = acc.to<mrs_realvec>();
00109 innerOut.create(marsystems_[i]->ctrl_onObservations_->to<mrs_natural>(),marsystems_[i]->ctrl_onSamples_->to<mrs_natural>());
00110 }
00111 }
00112 }
00113 }
00114
00115 void
00116 FlowThru::myProcess(realvec& in, realvec& out)
00117 {
00118
00119
00120
00121 out = in;
00122
00123 if(marsystemsSize_ >= 1)
00124 {
00125 for (mrs_natural i = 0; i < marsystemsSize_; ++i)
00126 {
00127 if (i==0)
00128 {
00129 MarControlAccessor acc(marsystems_[i]->ctrl_processedData_);
00130 realvec& slice = acc.to<mrs_realvec>();
00131 marsystems_[i]->process(in, slice);
00132 }
00133 else if (i == marsystemsSize_-1)
00134 {
00135 MarControlAccessor accSlice(marsystems_[i-1]->ctrl_processedData_, true, true);
00136 realvec& slice = accSlice.to<mrs_realvec>();
00137 MarControlAccessor accInnerOut(ctrl_innerOut_);
00138 realvec& innerOut = accInnerOut.to<mrs_realvec>();
00139
00140
00141 marsystems_[i]->process(slice, innerOut);
00142 }
00143 else
00144 {
00145 MarControlAccessor acc1(marsystems_[i-1]->ctrl_processedData_, true, true);
00146 realvec& slice1 = acc1.to<mrs_realvec>();
00147 MarControlAccessor acc2(marsystems_[i]->ctrl_processedData_);
00148 realvec& slice2 = acc2.to<mrs_realvec>();
00149 marsystems_[i]->process(slice1, slice2);
00150 }
00151 }
00152 }
00153 else if(marsystemsSize_ == 0)
00154 {
00155 MRSWARN("FlowThru::process: composite has no children MarSystems - passing input to output without changes.");
00156 }
00157 }