topical media & game development

talk show tell print

lib-of-vs-addons-ofxOsc-src-ofxOscSender.cpp / cpp



  /*
  
   Copyright 2007, 2008 Damian Stewart damian@frey.co.nz
   Distributed under the terms of the GNU Lesser General Public License v3
  
   This file is part of the ofxOsc openFrameworks OSC addon.
  
   ofxOsc 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 3 of the License, or
   (at your option) any later version.
  
   ofxOsc 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 General Public License for more details.
  
   You should have received a copy of the GNU Lesser General Public License
   along with ofxOsc.  If not, see <http://www.gnu.org/licenses/>.
   */
  
  include <ofxOscSender.h>
  
  include <UdpSocket.h>
  
  include <assert.h>
  
  ofxOscSender::ofxOscSender()
  {
  }
  
  ofxOscSender::~ofxOscSender()
  {
  }
  
  void ofxOscSender::setup( std::string hostname, int port )
  {
          socket = new UdpTransmitSocket( IpEndpointName( hostname.c_str(), port ) );
  }
  
  void ofxOscSender::sendBundle( ofxOscBundle& bundle )
  {
          static const int OUTPUT_BUFFER_SIZE = 32768;
          char buffer[OUTPUT_BUFFER_SIZE];
          osc::OutboundPacketStream p(buffer, OUTPUT_BUFFER_SIZE );
  
          // serialise the bundle
          appendBundle( bundle, p );
  
          socket->Send( p.Data(), p.Size() );
  }
  
  void ofxOscSender::sendMessage( ofxOscMessage& message )
  {
          static const int OUTPUT_BUFFER_SIZE = 16384;
          char buffer[OUTPUT_BUFFER_SIZE];
      osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE );
  
          // serialise the message
          p << osc::BeginBundleImmediate;
          appendMessage( message, p );
          p << osc::EndBundle;
  
          socket->Send( p.Data(), p.Size() );
  }
  
  void ofxOscSender::appendBundle( ofxOscBundle& bundle, osc::OutboundPacketStream& p )
  {
          // recursively serialise the bundle
          p << osc::BeginBundleImmediate;
          for ( int i=0; i<bundle.getBundleCount(); i++ )
          {
                  appendBundle( bundle.getBundleAt( i ), p );
          }
          for ( int i=0; i<bundle.getMessageCount(); i++ )
          {
                  appendMessage( bundle.getMessageAt( i ), p );
          }
          p << osc::EndBundle;
  }
  
  void ofxOscSender::appendMessage( ofxOscMessage& message, osc::OutboundPacketStream& p )
  {
      p << osc::BeginMessage( message.getAddress().c_str() );
          for ( int i=0; i< message.getNumArgs(); ++i )
          {
                  if ( message.getArgType(i) == OFXOSC_TYPE_INT32 )
                          p << message.getArgAsInt32( i );
                  else if ( message.getArgType( i ) == OFXOSC_TYPE_FLOAT )
                          p << message.getArgAsFloat( i );
                  else if ( message.getArgType( i ) == OFXOSC_TYPE_STRING )
                          p << message.getArgAsString( i ).c_str();
                  else
                  {
                          assert( false && "bad argument type" );
                  }
          }
          p << osc::EndMessage;
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.