00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Memory.h"
00020
00021 using std::cout;
00022 using std::endl;
00023
00024 using std::ostringstream;
00025 using namespace Marsyas;
00026
00027
00028 Memory::Memory(mrs_string name):MarSystem("Memory",name)
00029 {
00030 end_ = 0;
00031 counter_since_reset_ = 0;
00032 addControls();
00033 }
00034
00035 Memory::~Memory()
00036 {
00037 }
00038
00039 Memory::Memory(const Memory& a):MarSystem(a)
00040 {
00041 end_ = 0;
00042 counter_since_reset_ = 0 ;
00043 ctrl_reset_ = getctrl("mrs_bool/reset");
00044 ctrl_memSize_ = getctrl("mrs_natural/memSize");
00045 }
00046
00047 MarSystem*
00048 Memory::clone() const
00049 {
00050 return new Memory(*this);
00051 }
00052
00053 void
00054 Memory::addControls()
00055 {
00056 addctrl("mrs_natural/memSize", 40, ctrl_memSize_);
00057 setctrlState("mrs_natural/memSize", true);
00058 addctrl("mrs_bool/reset", false, ctrl_reset_);
00059 setctrlState("mrs_bool/reset", true);
00060 }
00061
00062 void
00063 Memory::myUpdate(MarControlPtr sender)
00064 {
00065 (void) sender;
00066 MRSDIAG("Memory.cpp - Memory:myUpdate");
00067
00068
00069 mrs_natural memSize = ctrl_memSize_->to<mrs_natural>();
00070
00071 if (memSize != 0)
00072 {
00073 ctrl_onSamples_->setValue(ctrl_inSamples_->to<mrs_natural>() * memSize,
00074 NOUPDATE);
00075 ctrl_onObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00076 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00077 }
00078 else
00079 {
00080 ctrl_onSamples_->setValue(ctrl_inSamples_->to<mrs_natural>(), NOUPDATE);
00081 ctrl_onObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00082 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00083
00084 }
00085
00086 inObservations_ = ctrl_inObservations_->to<mrs_natural>();
00087 onObservations_ = ctrl_onObservations_->to<mrs_natural>();
00088 onSamples_ = ctrl_onSamples_->to<mrs_natural>();
00089 cir_out_.stretch(onObservations_, onSamples_);
00090 ostringstream oss;
00091 mrs_string inObsNames = ctrl_inObsNames_->to<mrs_string>();
00092 for (int i = 0; i < inObservations_; ++i)
00093 {
00094 mrs_string inObsName;
00095 mrs_string temp;
00096 inObsName = inObsNames.substr(0, inObsNames.find(","));
00097 temp = inObsNames.substr(inObsNames.find(",")+1, inObsNames.length());
00098 inObsNames = temp;
00099 oss << "Mem" << memSize << "_" << inObsName << ",";
00100 }
00101 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00102
00103 }
00104
00105 void
00106 Memory::myProcess(realvec& in, realvec& out)
00107 {
00108 mrs_natural t,o,j;
00109 mrs_natural memSize = ctrl_memSize_->to<mrs_natural>();
00110
00111 if (ctrl_reset_->to<mrs_bool>())
00112 {
00113 cir_out_.setval(0.0);
00114 end_ = 0;
00115 counter_since_reset_ = 0;
00116
00117
00118 for (j=0; j < onSamples_; j++)
00119 {
00120 for (o=0; o < inObservations_; o++)
00121 {
00122 cir_out_(o, end_) = in(o,0);
00123 }
00124 end_ = (end_ + 1) % onSamples_;
00125 }
00126
00127 }
00128
00129 if (memSize != 0)
00130 {
00131 for (t=0; t < inSamples_; t++)
00132 {
00133 for (o=0; o < inObservations_; o++)
00134 {
00135 cir_out_(o, end_) = in(o,t);
00136 }
00137 end_ = (end_ + 1) % onSamples_;
00138 }
00139 counter_since_reset_++;
00140 }
00141 else
00142 {
00143 for (t = 0; t < inSamples_; t++)
00144 {
00145 for (o=0; o < inObservations_; o++)
00146 {
00147 cir_out_(o,t) = in(o,t);
00148 }
00149 }
00150 }
00151
00152 for (t = 0; t < onSamples_; t++)
00153 {
00154 for (o=0; o < inObservations_; o++)
00155 {
00156 out(o,t) = cir_out_(o,t);
00157 }
00158 }
00159
00160
00161
00162
00163 }