New directory tree, with preprocessor/ inside interpretor/.
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / architecture / osclib / faust / src / osc / OSCStream.cpp
diff --git a/interpretor/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/osc/OSCStream.cpp b/interpretor/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/osc/OSCStream.cpp
new file mode 100644 (file)
index 0000000..afe09c5
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+  Copyright (c) Grame 2009
+
+  This library is free software; you can redistribute it and modify it under
+  the terms of the GNU Library General Public License as published by the
+  Free Software Foundation version 2 of the License, or 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 Library General Public License
+  for more details.
+
+  You should have received a copy of the GNU Library 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 <iostream>
+#include "OSCStream.h"
+
+using namespace std;
+
+namespace oscfaust
+{
+
+OSCStream* _oscout = 0;                                // OSC standard output stream
+OSCStream* _oscerr = 0;                                // OSC standard input stream
+
+static UdpSocket* _socket = 0;         // a shared transmit socket
+
+
+//--------------------------------------------------------------------------
+OSCStream::OSCStream ()
+       : fState(kIdle), fPort(1024), fAddress(kLocalhost), fOutStream(fBuffer, kOutBufferSize), fSocket(_socket)
+{
+       if (!fSocket) cerr << "warning: incorrect OSCStream, _socket not initialized" << endl;
+}
+
+//--------------------------------------------------------------------------
+bool OSCStream::start ()
+{
+       _socket = new UdpSocket;
+       _oscout = new OSCStream(_socket);
+       _oscerr = new OSCStream(_socket);
+       return (_socket && _oscout && _oscerr);
+}
+
+//--------------------------------------------------------------------------
+void OSCStream::stop ()
+{
+       delete _socket;
+       delete _oscout;
+       delete _oscerr;
+       _oscout = _oscerr = 0;
+       _socket = 0;
+}
+
+//--------------------------------------------------------------------------
+void OSCStream::setAddress (const string& address)
+{
+       IpEndpointName dst (address.c_str());
+       setAddress (dst.address);
+}
+
+//--------------------------------------------------------------------------
+OSCStream& OSCStream::start(const char * address)
+{ 
+       stream().Clear();
+       if (!stream().IsReady()) cerr << "OSCStream OutboundPacketStream not ready" << endl;
+       stream() << osc::BeginMessage( address ) ; 
+       fState = kInProgress;
+       return *this;
+}
+
+//--------------------------------------------------------------------------
+OSCStream& OSCStream::end()
+{
+       if (state() == kInProgress) {
+               stream() << osc::EndMessage;
+               if (fSocket) 
+                       fSocket->SendTo (IpEndpointName (fAddress, fPort), stream().Data(), stream().Size() );
+               fState = kIdle;
+       }
+       return *this;
+}
+
+//--------------------------------------------------------------------------
+OSCStream& operator <<(OSCStream& s, const string& val)        
+{ 
+       s.stream() << val.c_str();
+       return s; 
+}
+
+//--------------------------------------------------------------------------
+OSCStream& operator <<(OSCStream& s, const OSCErr& val)                { return s.start(val.fAddress); }
+OSCStream& operator <<(OSCStream& s, const OSCWarn& val)       { return s.start(val.fAddress); }
+OSCStream& operator <<(OSCStream& s, const OSCStart& val)      { return s.start(val.fAddress); }
+OSCStream& operator <<(OSCStream& s, const OSCEnd val)         { return s.end(); }
+
+} // end namespace
+