Next: Command-line options, Previous: Writing data to text files, Up: Example programs
Putting together a network of MarSystems is all well and good, but you probably want to do something with that data. In this example we simply print it to the screen, but the important thing to note is that we have the data at the level of C programming.
#include "MarSystemManager.h"
using namespace std;
using namespace Marsyas;
void recognize(string sfName)
{
MarSystemManager mng;
MarSystem* pnet = mng.create("Series", "pnet");
// standard network
pnet->addMarSystem(mng.create("SoundFileSource", "src"));
pnet->updctrl("SoundFileSource/src/mrs_string/filename", sfName);
pnet->addMarSystem(mng.create("Spectrum","spk"));
pnet->addMarSystem(mng.create("Gain", "g2"));
while ( pnet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>() )
{
pnet->tick();
// gets data from the Spectrum for read only!
const realvec& processedData =
pnet->getctrl("Spectrum/spk/mrs_realvec/processedData")->to<mrs_realvec>();
cout << "Original Spectrum = " << processedData << endl;
// if we need to get the Spectrum and modify it, here is the way
// to do it. Notice that we must open a new scope using curly
// brackets so that MarControlAccessor is automatically destroyed
// when we are finished modifing the realvec control.
{
MarControlAccessor
acc(pnet->getctrl("Spectrum/spk/mrs_realvec/processedData"));
realvec&
processedData2 = acc.to<mrs_realvec>();
// we can now write to processedData without worries of
// breaking encapsulation
processedData2 *= 2.0;
cout << "Modified Spectrum = " << processedData2 << endl;
}
}
delete pnet;
}
int main(int argc, const char **argv)
{
string fileName;
if (argc<2)
{
cout<<"Please enter filename."<<endl;
exit(1);
}
else
{
fileName = argv[1];
}
cout << "Processing file " << fileName << endl;
recognize(fileName);
exit(0);
}