Rename interpretor to interpreter.
[Faustine.git] / interpreter / preprocessor / faust-0.9.47mr3 / architecture / osclib / faust / src / OSCControler.cpp
diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/OSCControler.cpp b/interpreter/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/OSCControler.cpp
new file mode 100644 (file)
index 0000000..0f35673
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+
+  Faust Project
+
+  Copyright (C) 2011 Grame
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+  Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France
+  research@grame.fr
+
+*/
+
+#include <stdlib.h>
+#include <iostream>
+
+#include "OSCControler.h"
+#include "FaustFactory.h"
+#include "OSCSetup.h"
+#include "OSCFError.h"
+#include "RootNode.h"
+#include "OSCIO.h"
+
+using namespace std;
+
+namespace oscfaust
+{
+
+#define kVersion        0.91f
+#define kVersionStr    "0.91"
+
+static const char* kUDPPortOpt = "-port";
+static const char* kUDPOutOpt  = "-outport";
+static const char* kUDPErrOpt  = "-errport";
+static const char* kUDPDestOpt = "-dest";
+
+//--------------------------------------------------------------------------
+// utilities for command line arguments 
+//--------------------------------------------------------------------------
+static int getPortOption (int argc, char *argv[], const std::string& option, int defaultValue)
+{
+       for (int i=0; i < argc-1; i++) {
+               if (option == argv[i]) {
+                       int val = strtol( argv[i+1], 0, 10);
+                       if (val) return val;
+               }
+       }
+       return defaultValue;
+}
+
+static const char* getDestOption (int argc, char *argv[], const std::string& option, const char* defaultValue)
+{
+       for (int i=0; i < argc-1; i++) {
+               if (option == argv[i])
+                       return argv[i+1];
+       }
+       return defaultValue;
+}
+
+
+//--------------------------------------------------------------------------
+OSCControler::OSCControler (int argc, char *argv[], OSCIO* io)
+       : fUDPPort(kUDPBasePort), fUDPOut(kUDPBasePort+1), fUPDErr(kUDPBasePort+2), fIO(io)
+{
+       fUDPPort = getPortOption (argc, argv, kUDPPortOpt, fUDPPort);
+       fUDPOut  = getPortOption (argc, argv, kUDPOutOpt, fUDPOut);
+       fUPDErr  = getPortOption (argc, argv, kUDPErrOpt, fUPDErr);
+       fDestAddress = getDestOption (argc, argv, kUDPDestOpt, "localhost");
+
+       fFactory = new FaustFactory(io);
+       fOsc = new OSCSetup();
+}
+
+OSCControler::~OSCControler ()
+{ 
+       quit(); 
+       delete fFactory;
+       delete fOsc;
+}
+
+//--------------------------------------------------------------------------
+float OSCControler::version()                          { return kVersion; }
+const char* OSCControler::versionstr()         { return kVersionStr; }
+
+//--------------------------------------------------------------------------
+// Add a node in the current group (top of the group stack)
+void OSCControler::addnode (const char* label, float* zone, float init, float min, float max)
+{
+       fFactory->addnode (label, zone, init, min, max);
+}
+
+//--------------------------------------------------------------------------
+// Add a node using its fullpath from the root instead of the current group
+// This method is used for alias messages. The arguments imin and imax allow
+// to map incomming values from the alias input range to the actual range 
+void OSCControler::addfullpathnode (const string& fullpath, float* zone, float imin, float imax, float init, float min, float max)
+{
+       fFactory->addfullpathnode (fullpath, zone, imin, imax, init, min, max);
+}
+
+
+//--------------------------------------------------------------------------
+void OSCControler::opengroup (const char* label)
+{
+       fFactory->opengroup (label);
+}
+
+//--------------------------------------------------------------------------
+void OSCControler::closegroup ()
+{
+       fFactory->closegroup ();
+}
+
+//--------------------------------------------------------------------------
+static std::string quote (const char* str)     { 
+       std::string outstr ( str );
+       outstr.insert (0, 1, '\'');
+       outstr += '\''; 
+       return outstr;
+}
+
+//--------------------------------------------------------------------------
+// start the network services
+void OSCControler::run ()
+{
+       SMessageDriven root = fFactory->root();         // first get the root node
+       if (root) {
+               // and cast it to a RootNode
+               RootNode * rootnode = dynamic_cast<RootNode*> ((MessageDriven*)root);
+               // informs the root node of the udp ports numbers (required to handle the 'hello' message
+               if (rootnode) rootnode->setPorts (&fUDPPort, &fUDPOut, &fUPDErr);
+               // starts the network services
+               fOsc->start (root, fUDPPort, fUDPOut, fUPDErr, getDesAddress());
+
+               // and outputs a message on the osc output port
+               oscout << OSCStart("Faust OSC version") << versionstr() << "-"
+                               << quote(root->getName()).c_str() << "is running on UDP ports "
+                               <<  fUDPPort << fUDPOut << fUPDErr;
+               if (fIO) oscout << " using OSC IO - in chans: " << fIO->numInputs() << " out chans: " << fIO->numOutputs();
+               oscout << OSCEnd();
+
+               // that should not occur unless a derivative changes the root node type
+               if (!rootnode) OSCFErr << root->getName() << ": is not a root node, 'hello' message won't be supported" << OSCFEndl;
+       }
+}
+
+//--------------------------------------------------------------------------
+const char*    OSCControler::getRootName()     { return fFactory->root()->getName(); }
+
+//--------------------------------------------------------------------------
+void OSCControler::quit ()
+{
+       fOsc->stop();
+}
+
+}