00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "SoundFileSourceHopper.h"
00020 #include "SoundFileSource.h"
00021 #include "MixToMono.h"
00022 #include "ShiftInput.h"
00023
00024 using namespace std;
00025 using namespace Marsyas;
00026
00027 SoundFileSourceHopper::SoundFileSourceHopper(mrs_string name) : MarSystem("SoundFileSourceHopper", name)
00028 {
00029
00031 addControls();
00032
00033
00034 isComposite_ = true;
00035 addMarSystem(new SoundFileSource("src"));
00036 addMarSystem(new MixToMono("mix2mono"));
00037 addMarSystem(new ShiftInput("hopper"));
00038
00039
00040 this->linkControl("mrs_string/filename", "SoundFileSource/src/mrs_string/filename");
00041 this->linkControl("mrs_bool/hasData", "SoundFileSource/src/mrs_bool/hasData");
00042
00043 }
00044
00045 SoundFileSourceHopper::SoundFileSourceHopper(const SoundFileSourceHopper& a) : MarSystem(a)
00046 {
00047 isComposite_ = true;
00048
00049
00050 ctrl_windowSize_ = getControl("mrs_natural/windowSize");
00051 ctrl_hopSize_ = getControl("mrs_natural/hopSize");
00052 ctrl_mixToMono_ = getControl("mrs_bool/mixToMono");
00053
00054
00055 isComposite_ = true;
00056 addMarSystem(new SoundFileSource("src"));
00057 addMarSystem(new MixToMono("mix2mono"));
00058 addMarSystem(new ShiftInput("hopper"));
00059
00060
00061 this->linkControl("mrs_string/filename", "SoundFileSource/src/mrs_string/filename");
00062 this->linkControl("mrs_bool/hasData", "SoundFileSource/src/mrs_bool/hasData");
00063
00064 }
00065
00066
00067 SoundFileSourceHopper::~SoundFileSourceHopper()
00068 {
00069 }
00070
00071 MarSystem*
00072 SoundFileSourceHopper::clone() const
00073 {
00074 return new SoundFileSourceHopper(*this);
00075 }
00076
00077 void
00078 SoundFileSourceHopper::addControls()
00079 {
00081 addControl("mrs_natural/windowSize", (mrs_natural)MRS_DEFAULT_SLICE_NSAMPLES, ctrl_windowSize_);
00082 setControlState("mrs_natural/windowSize", true);
00083
00084 addControl("mrs_natural/hopSize", (mrs_natural)(MRS_DEFAULT_SLICE_NSAMPLES/2), ctrl_hopSize_);
00085 setControlState("mrs_natural/hopSize", true);
00086
00087 addControl("mrs_bool/mixToMono", false, ctrl_mixToMono_);
00088 setControlState("mrs_bool/mixToMono", true);
00089
00090 }
00091
00098 void
00099 SoundFileSourceHopper::myUpdate(MarControlPtr sender)
00100 {
00101
00102
00103
00104
00105 if (marsystems_.size() >= 1) {
00106 marsystems_[0]->setControl("mrs_natural/inSamples", ctrl_hopSize_);
00107 marsystems_[0]->update();
00108 }
00109
00110
00111
00112 if (marsystems_.size() >= 3) {
00113 marsystems_[2]->setControl("mrs_natural/winSize", ctrl_windowSize_);
00114 marsystems_[2]->update();
00115 }
00116
00117
00118
00119
00120
00121 mrs_natural i_src = 0;
00122 mrs_natural i_tgt = ctrl_mixToMono_->to<mrs_bool>() ? 1 : 2;
00123 for ( ; i_tgt < (mrs_natural)marsystems_.size(); i_src = i_tgt, i_tgt++) {
00124
00125 MarSystem* m_src = marsystems_[i_src];
00126 MarSystem* m_tgt = marsystems_[i_tgt];
00127
00128 m_tgt->setctrl(m_tgt->ctrl_inObsNames_, m_src->ctrl_onObsNames_);
00129 m_tgt->setctrl(m_tgt->ctrl_inObservations_, m_src->ctrl_onObservations_);
00130 m_tgt->setctrl(m_tgt->ctrl_inSamples_, m_src->ctrl_onSamples_);
00131 m_tgt->setctrl(m_tgt->ctrl_israte_, m_src->ctrl_osrate_);
00132
00133 m_tgt->update();
00134 }
00135
00136
00137 MarSystem* m_last = marsystems_[marsystems_.size() - 1];
00138 updControl(ctrl_onObsNames_, m_last->ctrl_onObsNames_, NOUPDATE);
00139 updControl(ctrl_onSamples_, m_last->ctrl_onSamples_, NOUPDATE);
00140 updControl(ctrl_onObservations_, m_last->ctrl_onObservations_, NOUPDATE);
00141 updControl(ctrl_osrate_, m_last->ctrl_osrate_, NOUPDATE);
00142
00143
00144 for (size_t i=0; i < marsystems_.size() - 1; ++i)
00145 {
00146 MarSystem* m = marsystems_[i];
00147 MarControlAccessor acc(m->ctrl_processedData_, NOUPDATE);
00148 realvec& processedData = acc.to<mrs_realvec>();
00149 mrs_natural rows = m->ctrl_onObservations_->to<mrs_natural>();
00150 mrs_natural cols = m->ctrl_onSamples_->to<mrs_natural>();
00151 if (processedData.getRows() != rows || processedData.getCols() != cols )
00152 {
00153 processedData.create(rows, cols);
00154 }
00155 }
00156
00157 }
00158
00159 void
00160 SoundFileSourceHopper::myProcess(realvec& in, realvec& out)
00161 {
00162
00163
00164 MarControlAccessor acc(marsystems_[0]->ctrl_processedData_);
00165 realvec& slice_out = acc.to<mrs_realvec>();
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 marsystems_[0]->process(slice_out, slice_out);
00178
00179
00180
00181 mrs_natural i_prev = 0;
00182 mrs_natural i_curr = ctrl_mixToMono_->to<mrs_bool>() ? 1 : 2;
00183 for ( ; i_curr < (mrs_natural) marsystemsSize_; i_prev = i_curr, i_curr++) {
00184 MarSystem* m_prev = marsystems_[i_prev];
00185 MarSystem* m_curr = marsystems_[i_curr];
00186
00187
00188 MarControlAccessor acc_prev(m_prev->ctrl_processedData_, true, true);
00189 realvec& data_prev = acc_prev.to<mrs_realvec>();
00190
00191 if (i_curr < (mrs_natural) marsystemsSize_ - 1)
00192 {
00193 MarControlAccessor acc_curr(m_curr->ctrl_processedData_);
00194 realvec& data_curr = acc_curr.to<mrs_realvec>();
00195 m_curr->process(data_prev, data_curr);
00196 }
00197 else
00198 {
00199 m_curr->process(data_prev, out);
00200 }
00201
00202 }
00203
00204 }