Mercurial > hg > midi-score-follower
diff addons/ofxOsc/src/ofxOscMessage.cpp @ 0:b299a65a3ad0
start project
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Tue, 16 Aug 2011 11:29:59 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/addons/ofxOsc/src/ofxOscMessage.cpp Tue Aug 16 11:29:59 2011 +0100 @@ -0,0 +1,210 @@ +/* + + 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 "ofxOscMessage.h" +#include <iostream> +#include <assert.h> + +ofxOscMessage::ofxOscMessage() + +{ +} + +ofxOscMessage::~ofxOscMessage() +{ + clear(); +} + +void ofxOscMessage::clear() +{ + for ( unsigned int i=0; i<args.size(); ++i ) + delete args[i]; + args.clear(); + address = ""; +} + +/* + +get methods + +*/ + +int ofxOscMessage::getNumArgs() const +{ + return (int)args.size(); +} + +ofxOscArgType ofxOscMessage::getArgType( int index ) const +{ + if ( index >= (int)args.size() ) + { + fprintf(stderr,"ofxOscMessage::getArgType: index %d out of bounds\n", index ); + return OFXOSC_TYPE_INDEXOUTOFBOUNDS; + } + else + return args[index]->getType(); +} + +string ofxOscMessage::getArgTypeName( int index ) const +{ + if ( index >= (int)args.size() ) + { + fprintf(stderr,"ofxOscMessage::getArgTypeName: index %d out of bounds\n", index ); + return "INDEX OUT OF BOUNDS"; + } + else + return args[index]->getTypeName(); +} + + +int32_t ofxOscMessage::getArgAsInt32( int index ) const +{ + if ( getArgType(index) != OFXOSC_TYPE_INT32 ) + { + if ( getArgType( index ) == OFXOSC_TYPE_FLOAT ) + { + fprintf(stderr, "ofxOscMessage:getArgAsInt32: warning: converting int32 to float for argument %i\n", index ); + return ((ofxOscArgFloat*)args[index])->get(); + } + else + { + fprintf(stderr, "ofxOscMessage:getArgAsInt32: error: argument %i is not a number\n", index ); + return 0; + } + } + else + return ((ofxOscArgInt32*)args[index])->get(); +} + + +float ofxOscMessage::getArgAsFloat( int index ) const +{ + if ( getArgType(index) != OFXOSC_TYPE_FLOAT ) + { + if ( getArgType( index ) == OFXOSC_TYPE_INT32 ) + { + fprintf(stderr, "ofxOscMessage:getArgAsFloat: warning: converting float to int32 for argument %i\n", index ); + return ((ofxOscArgInt32*)args[index])->get(); + } + else + { + fprintf(stderr, "ofxOscMessage:getArgAsFloat: error: argument %i is not a number\n", index ); + return 0; + } + } + else + return ((ofxOscArgFloat*)args[index])->get(); +} + + +string ofxOscMessage::getArgAsString( int index ) const +{ + if ( getArgType(index) != OFXOSC_TYPE_STRING ) + { + if ( getArgType( index ) == OFXOSC_TYPE_FLOAT ) + { + char buf[1024]; + sprintf(buf,"%f",((ofxOscArgFloat*)args[index])->get() ); + fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting float to string for argument %i\n", index ); + return buf; + } + else if ( getArgType( index ) == OFXOSC_TYPE_INT32 ) + { + char buf[1024]; + sprintf(buf,"%i",((ofxOscArgInt32*)args[index])->get() ); + fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting int32 to string for argument %i\n", index ); + return buf; + } + else + { + fprintf(stderr, "ofxOscMessage:getArgAsString: error: argument %i is not a string\n", index ); + return ""; + } + } + else + return ((ofxOscArgString*)args[index])->get(); +} + + + +/* + +set methods + +*/ + + +void ofxOscMessage::addIntArg( int32_t argument ) +{ + + args.push_back( new ofxOscArgInt32( argument ) ); +} + +void ofxOscMessage::addFloatArg( float argument ) +{ + args.push_back( new ofxOscArgFloat( argument ) ); +} + +void ofxOscMessage::addStringArg( string argument ) +{ + args.push_back( new ofxOscArgString( argument ) ); +} + + +/* + + housekeeping + + */ + +ofxOscMessage& ofxOscMessage::copy( const ofxOscMessage& other ) +{ + // copy address + address = other.address; + + remote_host = other.remote_host; + remote_port = other.remote_port; + + // copy arguments + for ( int i=0; i<(int)other.args.size(); ++i ) + { + ofxOscArgType argType = other.getArgType( i ); + if ( argType == OFXOSC_TYPE_INT32 ) + args.push_back( new ofxOscArgInt32( other.getArgAsInt32( i ) ) ); + else if ( argType == OFXOSC_TYPE_FLOAT ) + args.push_back( new ofxOscArgFloat( other.getArgAsFloat( i ) ) ); + else if ( argType == OFXOSC_TYPE_STRING ) + args.push_back( new ofxOscArgString( other.getArgAsString( i ) ) ); + else + { + assert( false && "bad argument type" ); + } + } + + return *this; +}