00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "common.h"
00020
00021 #ifdef MARSYAS_MAD
00022 #include "MP3FileSource.h"
00023 #endif
00024
00025 #ifdef MARSYAS_VORBIS
00026 #include "OggFileSource.h"
00027 #endif
00028
00029 #ifdef MARSYAS_GSTREAMER
00030 #include "GStreamerSource.h"
00031 #endif
00032
00033
00034 #include "SoundFileSource.h"
00035 #include <string>
00036 #include <cctype>
00037 #include <algorithm>
00038
00039
00040
00041
00042
00043 using namespace std;
00044 using namespace Marsyas;
00045
00046 SoundFileSource::SoundFileSource(mrs_string name):MarSystem("SoundFileSource",name)
00047 {
00048 src_ = NULL;
00049 updateCurrDuration = false;
00050 addControls();
00051 }
00052
00053 SoundFileSource::~SoundFileSource()
00054 {
00055 delete src_;
00056 }
00057
00058 MarSystem*
00059 SoundFileSource::clone() const
00060 {
00061 return new SoundFileSource(*this);
00062 }
00063
00064 SoundFileSource::SoundFileSource(const SoundFileSource& a):MarSystem(a)
00065 {
00066 updateCurrDuration = false;
00067 src_ = NULL;
00068
00069 ctrl_pos_ = getctrl("mrs_natural/pos");
00070 ctrl_loop_ = getctrl("mrs_natural/loopPos");
00071 ctrl_hasData_ = getctrl("mrs_bool/hasData");
00072 ctrl_lastTickWithData_ = getctrl("mrs_bool/lastTickWithData");
00073 ctrl_mute_ = getctrl("mrs_bool/mute");
00074 ctrl_advance_ = getctrl("mrs_natural/advance");
00075 ctrl_filename_ = getctrl("mrs_string/filename");
00076 ctrl_currentlyPlaying_ = getctrl("mrs_string/currentlyPlaying");
00077 ctrl_previouslyPlaying_ = getctrl("mrs_string/previouslyPlaying");
00078 ctrl_regression_ = getctrl("mrs_bool/regression");
00079 ctrl_currentLabel_ = getctrl("mrs_real/currentLabel");
00080 ctrl_previousLabel_ = getctrl("mrs_real/previousLabel");
00081 ctrl_labelNames_ = getctrl("mrs_string/labelNames");
00082 ctrl_nLabels_ = getctrl("mrs_natural/nLabels");
00083 ctrl_currentHasData_ = getctrl("mrs_bool/currentHasData");
00084 ctrl_currentLastTickWithData_ = getctrl("mrs_bool/currentLastTickWithData");
00085 ctrl_currentCollectionNewFile_ = getctrl("mrs_bool/currentCollectionNewFile");
00086 ctrl_startStable_ = getctrl("mrs_bool/startStable");
00087
00088
00089 }
00090
00091 void
00092 SoundFileSource::addControls()
00093 {
00094 addctrl("mrs_bool/hasData", true, ctrl_hasData_);
00095
00096 addctrl("mrs_bool/lastTickWithData", false, ctrl_lastTickWithData_);
00097
00098 addctrl("mrs_natural/pos", 0, ctrl_pos_);
00099 setctrlState("mrs_natural/pos", true);
00100
00101 addctrl("mrs_natural/loopPos", 0, ctrl_loop_);
00102 setctrlState("mrs_natural/loopPos", true);
00103
00104 addctrl("mrs_string/filename", SOUNDFILESOURCE_UNDEFINEDFILENAME, ctrl_filename_);
00105 setctrlState("mrs_string/filename", true);
00106
00107 addctrl("mrs_string/allfilenames", ",");
00108 setctrlState("mrs_string/allfilenames",true);
00109
00110 addctrl("mrs_natural/numFiles", 0);
00111
00112 addctrl("mrs_natural/size", 0);
00113
00114 addctrl("mrs_real/frequency", (mrs_real)0.0);
00115 setctrlState("mrs_real/frequency",true);
00116
00117 addctrl("mrs_bool/noteon", false);
00118 setctrlState("mrs_bool/noteon", true);
00119
00120 addctrl("mrs_real/repetitions", 1.0);
00121 setctrlState("mrs_real/repetitions", true);
00122
00123 addctrl("mrs_real/duration", -1.0);
00124 setctrlState("mrs_real/duration", true);
00125
00126 addctrl("mrs_natural/advance", 0, ctrl_advance_);
00127 setctrlState("mrs_natural/advance", true);
00128
00129 addctrl("mrs_bool/shuffle", false);
00130 setctrlState("mrs_bool/shuffle", true);
00131
00132 addctrl("mrs_natural/cindex", 0);
00133 setctrlState("mrs_natural/cindex", true);
00134
00135 addctrl("mrs_string/currentlyPlaying", "daufile", ctrl_currentlyPlaying_);
00136 addctrl("mrs_string/previouslyPlaying", "daufile", ctrl_previouslyPlaying_);
00137 addctrl("mrs_bool/regression", false, ctrl_regression_);
00138 addctrl("mrs_real/currentLabel", 0.0, ctrl_currentLabel_);
00139 addctrl("mrs_real/previousLabel", 0.0, ctrl_previousLabel_);
00140 addctrl("mrs_natural/nLabels", 0, ctrl_nLabels_);
00141 addctrl("mrs_string/labelNames", ",", ctrl_labelNames_);
00142 ctrl_mute_ = getctrl("mrs_bool/mute");
00143
00144 addctrl("mrs_real/fullDuration", 0.);
00145 setctrlState("mrs_real/fullDuration", true);
00146
00147 addctrl("mrs_natural/moveToSamplePos", 0);
00148 setctrlState("mrs_natural/moveToSamplePos", true);
00149
00150 addctrl("mrs_bool/currentHasData", true, ctrl_currentHasData_);
00151 addctrl("mrs_bool/currentLastTickWithData", false, ctrl_currentLastTickWithData_);
00152 addctrl("mrs_bool/currentCollectionNewFile", true, ctrl_currentCollectionNewFile_);
00153
00154
00155 addctrl("mrs_bool/startStable", true, ctrl_startStable_);
00156 setctrlState("mrs_bool/startStable", true);
00157 }
00158
00159 void
00160 SoundFileSource::myUpdate(MarControlPtr sender)
00161 {
00162 MRSDIAG("SoundFileSource::myUpdate");
00163 ctrl_inObsNames_->setValue("audio,", NOUPDATE);
00164
00165 if (filename_ != ctrl_filename_->to<mrs_string>())
00166 {
00167 if (checkType() == true)
00168 {
00169 getHeader();
00170 filename_ = ctrl_filename_->to<mrs_string>();
00171 ctrl_currentlyPlaying_->setValue(src_->getctrl("mrs_string/currentlyPlaying"));
00172 ctrl_previouslyPlaying_->setValue(src_->getctrl("mrs_string/previouslyPlaying"));
00173 ctrl_currentLabel_->setValue(src_->getctrl("mrs_real/currentLabel"));
00174 ctrl_previousLabel_->setValue(src_->getctrl("mrs_real/previousLabel"));
00175
00176 ctrl_labelNames_->setValue(src_->getctrl("mrs_string/labelNames"));
00177 ctrl_nLabels_->setValue(src_->getctrl("mrs_natural/nLabels"));
00178 ctrl_onObservations_->setValue(src_->ctrl_onObservations_, NOUPDATE);
00179
00180 ostringstream oss;
00181 for (int ch = 0; ch < ctrl_onObservations_->to<mrs_natural>(); ch++)
00182 {
00183 oss << "AudioCh" << ch << ",";
00184 }
00185 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00186
00187 ctrl_israte_->setValue(src_->ctrl_israte_, NOUPDATE);
00188 ctrl_osrate_->setValue(src_->ctrl_osrate_, NOUPDATE);
00189
00190
00191 if (src_->getctrl("mrs_natural/size")->to<mrs_natural>() != 0)
00192 {
00193 ctrl_hasData_->setValue(true, NOUPDATE);
00194 src_->hasData_ = true;
00195
00196 ctrl_lastTickWithData_->setValue(false, NOUPDATE);
00197 src_->lastTickWithData_ =false;
00198 }
00199 }
00200
00201 else
00202 {
00203 ctrl_onObservations_->setValue(1, NOUPDATE);
00204 ctrl_israte_->setValue(22050.0, NOUPDATE);
00205 ctrl_hasData_->setValue(false, NOUPDATE);
00206 ctrl_lastTickWithData_->setValue(true, NOUPDATE);
00207 src_ = NULL;
00208 }
00209
00210 } else if(!sender.isInvalid()) {
00211
00212
00213
00214
00215 mrs_string name = sender->getName();
00216 if(!name.compare("mrs_natural/moveToSamplePos")){
00217
00218 mrs_natural newPos = sender->to<mrs_natural>();
00219
00220
00221
00222
00223 getHeader();
00224
00225 ctrl_pos_->setValue(newPos, NOUPDATE);
00226
00227
00228
00229
00230
00231 src_->setctrl("mrs_natural/pos", getctrl("mrs_natural/pos"));
00232 src_->update();
00233 setctrl("mrs_bool/hasData", src_->hasData_);
00234 setctrl("mrs_bool/lastTickWithData", src_->lastTickWithData_);
00235 return;
00236 }
00237 }
00238
00239
00240
00241
00242 if (src_ != NULL)
00243 {
00244
00245
00246 src_->ctrl_inSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00247 src_->ctrl_inObservations_->setValue(ctrl_inObservations_, NOUPDATE);
00248 src_->ctrl_regression_->setValue(ctrl_regression_, NOUPDATE);
00249 src_->setctrl("mrs_real/repetitions", getctrl("mrs_real/repetitions"));
00250 src_->setctrl("mrs_real/duration", getctrl("mrs_real/duration"));
00251 src_->setctrl("mrs_natural/advance", getctrl("mrs_natural/advance"));
00252
00253 src_->setctrl("mrs_bool/shuffle", getctrl("mrs_bool/shuffle"));
00254 src_->setctrl("mrs_bool/hasData", getctrl("mrs_bool/hasData"));
00255 src_->setctrl("mrs_bool/lastTickWithData", getctrl("mrs_bool/lastTickWithData"));
00256 src_->setctrl("mrs_natural/pos", getctrl("mrs_natural/pos"));
00257 src_->pos_ = getctrl("mrs_natural/pos")->to<mrs_natural>();
00258 src_->setctrl("mrs_natural/loopPos", getctrl("mrs_natural/loopPos"));
00259 src_->rewindpos_ = getctrl("mrs_natural/loopPos")->to<mrs_natural>();
00260 src_->update();
00261
00262
00263 ctrl_onSamples_->setValue(src_->ctrl_onSamples_, NOUPDATE);
00264 ctrl_onObservations_->setValue(src_->ctrl_onObservations_, NOUPDATE);
00265 ctrl_osrate_->setValue(src_->ctrl_osrate_, NOUPDATE);
00266
00267 setctrl("mrs_natural/pos", src_->pos_);
00268 setctrl("mrs_natural/loopPos", src_->rewindpos_);
00269 setctrl("mrs_bool/hasData", src_->hasData_);
00270 setctrl("mrs_bool/lastTickWithData", src_->lastTickWithData_);
00271 setctrl("mrs_natural/size", src_->getctrl("mrs_natural/size"));
00272 setctrl("mrs_real/repetitions", src_->getctrl("mrs_real/repetitions"));
00273 setctrl("mrs_real/duration", src_->getctrl("mrs_real/duration"));
00274
00275 advance_ = ctrl_advance_->to<mrs_natural>();
00276 setctrl("mrs_natural/advance", src_->getctrl("mrs_natural/advance"));
00277
00278 setctrl("mrs_bool/shuffle", src_->getctrl("mrs_bool/shuffle"));
00279 setctrl("mrs_natural/cindex", src_->getctrl("mrs_natural/cindex"));
00280 setctrl("mrs_string/currentlyPlaying", src_->getctrl("mrs_string/currentlyPlaying"));
00281 setctrl("mrs_string/previouslyPlaying", src_->getctrl("mrs_string/previouslyPlaying"));
00282 setctrl("mrs_real/currentLabel", src_->getctrl("mrs_real/currentLabel"));
00283 setctrl("mrs_real/previousLabel", src_->getctrl("mrs_real/previousLabel"));
00284 setctrl("mrs_natural/nLabels", src_->getctrl("mrs_natural/nLabels"));
00285 setctrl("mrs_string/labelNames", src_->getctrl("mrs_string/labelNames"));
00286 setctrl("mrs_string/allfilenames", src_->getctrl("mrs_string/allfilenames"));
00287 setctrl("mrs_natural/numFiles", src_->getctrl("mrs_natural/numFiles"));
00288
00289 if (src_->getctrl("mrs_string/filetype")->to<mrs_string>() == "raw")
00290 {
00291 setctrl("mrs_real/frequency", src_->getctrl("mrs_real/frequency"));
00292 setctrl("mrs_bool/noteon", src_->getctrl("mrs_bool/noteon"));
00293 }
00294 else if (src_->getctrl("mrs_string/filetype")->to<mrs_string>() == "mp3")
00295 {
00296 updateCurrDuration = true;
00297
00298
00299
00300 }
00301
00302 }
00303 }
00304
00305 bool
00306 SoundFileSource::checkType()
00307 {
00308 mrs_string filename = getctrl("mrs_string/filename")->to<mrs_string>();
00309
00310
00311 if (filename != SOUNDFILESOURCE_UNDEFINEDFILENAME)
00312 {
00313 FILE * sfp = fopen(filename.c_str(), "r");
00314 if (sfp == NULL)
00315 {
00316 mrs_string wrn = "SoundFileSource::Problem opening file ";
00317 wrn += filename;
00318 MRSWARN(wrn);
00319 filename_ = SOUNDFILESOURCE_UNDEFINEDFILENAME;
00320 setctrl("mrs_string/filename", SOUNDFILESOURCE_UNDEFINEDFILENAME);
00321 return false;
00322 }
00323 fclose(sfp);
00324 }
00325 else {
00326 filename_ = SOUNDFILESOURCE_UNDEFINEDFILENAME;
00327 }
00328
00329
00330 mrs_string::size_type pos = filename.rfind(".", filename.length());
00331 mrs_string ext;
00332 if (pos != mrs_string::npos)
00333 {
00334 ext = filename.substr(pos, filename.length());
00335
00336 std::transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int))tolower);
00337 }
00338
00339 if (prev_ext_ != ext)
00340 {
00341 delete src_;
00342 src_ = NULL;
00343 }
00344
00345
00346 if (ext == ".au")
00347 {
00348 if (src_ == NULL)
00349 src_ = new AuFileSource(getName());
00350 }
00351 else if (ext == ".wav")
00352 {
00353 if (src_ == NULL)
00354 src_ = new WavFileSource(getName());
00355 }
00356 else if (ext == ".raw")
00357 {
00358 if (src_ == NULL)
00359 src_ = new RawFileSource(getName());
00360 }
00361 else if (ext == ".txt")
00362 {
00363 if (src_ == NULL)
00364 src_ = new CollectionFileSource(getName());
00365 }
00366 else if (ext == ".mf")
00367 {
00368 if (src_ == NULL)
00369 src_ = new CollectionFileSource(getName());
00370 }
00371 #ifdef MARSYAS_MAD
00372 else if (ext == ".mp3")
00373 {
00374 if (src_ == NULL)
00375 src_ = new MP3FileSource(getName());
00376 }
00377 #endif
00378 #ifdef MARSYAS_VORBIS
00379 else if (ext == ".ogg")
00380 {
00381 if (src_ == NULL)
00382 src_ = new OggFileSource(getName());
00383 }
00384 #endif
00385 else
00386 #ifdef MARSYAS_GSTREAMER
00387
00388 {
00389 if (filename != SOUNDFILESOURCE_UNDEFINEDFILENAME)
00390 {
00391
00392 MRSDIAG("SoundFileSource is falling back to GStreamerSource\n");
00393 if (src_ == NULL)
00394 src_ = new GStreamerSource(getName());
00395 }
00396 else {
00397 return false;
00398 }
00399 }
00400 #else
00401 {
00402 if (filename != SOUNDFILESOURCE_UNDEFINEDFILENAME)
00403 {
00404 mrs_string wrn = "Unsupported format for file ";
00405 wrn += filename;
00406 MRSWARN(wrn);
00407 filename_ = SOUNDFILESOURCE_UNDEFINEDFILENAME;
00408 setctrl("mrs_string/filename", SOUNDFILESOURCE_UNDEFINEDFILENAME);
00409 }
00410
00411 return false;
00412 }
00413 #endif
00414 prev_ext_ = ext;
00415
00416 return true;
00417 }
00418
00419 void
00420 SoundFileSource::getHeader()
00421 {
00422 mrs_string filename = ctrl_filename_->to<mrs_string>();
00423 src_->getHeader(filename);
00424 ctrl_pos_->setValue(0, NOUPDATE);
00425 ctrl_loop_->setValue(0, NOUPDATE);
00426 }
00427
00428 void
00429 SoundFileSource::myProcess(realvec& in, realvec &out)
00430 {
00431 if (src_ != NULL)
00432 {
00433 src_->process(in,out);
00434
00435
00436
00437 #ifdef MARSYAS_MATLAB
00438 #ifdef MTLB_DBG_LOG
00439 MATLAB_PUT(out, "out");
00440 MATLAB_EVAL("figure(41),subplot(212),plot(out'),axis('tight'),grid on, title('out')");
00441 #endif
00442 #endif
00443
00444
00445
00446
00447
00448
00449 ctrl_pos_->setValue(src_->getctrl("mrs_natural/pos")->to<mrs_natural>(), NOUPDATE);
00450 ctrl_loop_->setValue(src_->rewindpos_, NOUPDATE);
00451 ctrl_hasData_->setValue(src_->hasData_, NOUPDATE);
00452 ctrl_lastTickWithData_->setValue(src_->lastTickWithData_, NOUPDATE);
00453 ctrl_currentlyPlaying_->setValue(src_->getctrl("mrs_string/currentlyPlaying"));
00454 ctrl_previouslyPlaying_->setValue(src_->getctrl("mrs_string/previouslyPlaying"));
00455
00456 ctrl_currentLabel_->setValue(src_->getctrl("mrs_real/currentLabel"));
00457 ctrl_previousLabel_->setValue(src_->getctrl("mrs_real/previousLabel"));
00458 ctrl_labelNames_->setValue(src_->getctrl("mrs_string/labelNames"));
00459 ctrl_nLabels_->setValue(src_->getctrl("mrs_natural/nLabels"));
00460
00461 if (updateCurrDuration)
00462 {
00463 setctrl("mrs_real/fullDuration", src_->durFull_);
00464 }
00465
00466
00467 if (src_->getType() == "CollectionFileSource") {
00468 CollectionFileSource *coll = (CollectionFileSource*)src_;
00469 ctrl_currentHasData_->setValue(coll->iHasData_,
00470 NOUPDATE);
00471
00472 ctrl_currentLastTickWithData_->setValue(coll->iLastTickWithData_, NOUPDATE);
00473 ctrl_currentCollectionNewFile_->setValue(coll->iNewFile_,
00474 NOUPDATE);
00475 if ( !(coll->iHasData_) ||
00476 (coll->iNewFile_)) {
00477 ctrl_startStable_->setValue((mrs_bool)true,
00478 NOUPDATE);
00479 } else {
00480 ctrl_startStable_->setValue((mrs_bool)false,
00481 NOUPDATE);
00482 }
00483 } else {
00484 ctrl_currentHasData_->setValue(src_->hasData_);
00485 ctrl_currentLastTickWithData_->setValue(src_->lastTickWithData_);
00486 }
00487
00488
00489
00490 }
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500 }