From b86dfa8f6f99713ee4605c30ebb1a58309aaeb8a Mon Sep 17 00:00:00 2001 From: mick grierson Date: Mon, 29 Jun 2015 15:57:31 +0100 Subject: Updating post-hackday --- .../ofxOsc/src/ofxOscSender.cpp | 192 +++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100755 ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/ofxOsc/src/ofxOscSender.cpp (limited to 'ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/ofxOsc/src/ofxOscSender.cpp') diff --git a/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/ofxOsc/src/ofxOscSender.cpp b/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/ofxOsc/src/ofxOscSender.cpp new file mode 100755 index 0000000..e19e6a4 --- /dev/null +++ b/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/ofxOsc/src/ofxOscSender.cpp @@ -0,0 +1,192 @@ +/* + + Copyright (c) 2007-2009, Damian Stewart + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the developer nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY DAMIAN STEWART ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL DAMIAN STEWART BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include "ofxOscSender.h" +#include "ofUtils.h" +#include "ofParameterGroup.h" + + +#include "UdpSocket.h" + +#include + +ofxOscSender::ofxOscSender() +{ + socket = NULL; +} + +ofxOscSender::~ofxOscSender() +{ + if ( socket ) + shutdown(); +} + +void ofxOscSender::setup( std::string hostname, int port ) +{ + if ( socket ) + shutdown(); + + socket = new UdpTransmitSocket( IpEndpointName( hostname.c_str(), port ) ); +} + +void ofxOscSender::shutdown() +{ + if ( socket ) + delete socket; + socket = NULL; +} + +void ofxOscSender::sendBundle( ofxOscBundle& bundle ) +{ + //setting this much larger as it gets trimmed down to the size its using before being sent. + //TODO: much better if we could make this dynamic? Maybe have ofxOscBundle return its size? + static const int OUTPUT_BUFFER_SIZE = 327680; + 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 ) +{ + //setting this much larger as it gets trimmed down to the size its using before being sent. + //TODO: much better if we could make this dynamic? Maybe have ofxOscMessage return its size? + static const int OUTPUT_BUFFER_SIZE = 327680; + 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::sendParameter( const ofAbstractParameter & parameter){ + if(!parameter.isSerializable()) return; + if(parameter.type()==typeid(ofParameterGroup).name()){ + string address = "/"; + const vector hierarchy = parameter.getGroupHierarchyNames(); + for(int i=0;i<(int)hierarchy.size()-1;i++){ + address+=hierarchy[i] + "/"; + } + ofxOscBundle bundle; + appendParameter(bundle,parameter,address); + sendBundle(bundle); + }else{ + string address = ""; + const vector hierarchy = parameter.getGroupHierarchyNames(); + for(int i=0;i<(int)hierarchy.size()-1;i++){ + address+= "/" + hierarchy[i]; + } + if(address.length()) address += "/"; + ofxOscMessage msg; + appendParameter(msg,parameter,address); + sendMessage(msg); + } +} + + +void ofxOscSender::appendParameter( ofxOscBundle & _bundle, const ofAbstractParameter & parameter, string address){ + if(parameter.type()==typeid(ofParameterGroup).name()){ + ofxOscBundle bundle; + const ofParameterGroup & group = static_cast(parameter); + for(int i=0;i).name()){ + msg.addIntArg(parameter.cast()); + }else if(parameter.type()==typeid(ofParameter).name()){ + msg.addFloatArg(parameter.cast()); + }else if(parameter.type()==typeid(ofParameter).name()){ + msg.addIntArg(parameter.cast()); + }else{ + msg.addStringArg(parameter.toString()); + } +} + +void ofxOscSender::appendBundle( ofxOscBundle& bundle, osc::OutboundPacketStream& p ) +{ + // recursively serialise the bundle + p << osc::BeginBundleImmediate; + for ( int i=0; i