// Description: a node that can send messages over Open Sound Control // //notes: // // // Category: Sound // Author: Ben Chang // Revision: 05/10/04 #include "OSCNode.h" #include "OSC-client.h" #include "htmsocket.h" using namespace std; extern "C" ygNode* construct_OSCNode(const char* name,bool master) { return new OSCNode(name,master); } struct _OSCNodePrivateData { ygString OSCInstrumentName; ygString netOSCInstrumentName; ygString host; int port; bool netPlay; }; OSCNode::OSCNode(const char* name,bool master) : ygNode(name,master) { setClassName("OSCNode"); p_ = new struct _OSCNodePrivateData; p_->host = "localhost"; p_->port = 10000; } OSCNode::~OSCNode(void) { delete p_; } void OSCNode::reset(void) { ygNode::reset(); } void OSCNode::message(const ygMessage& msg) { if (msg == "sendMessage") { // arg(0) = message address (string) // arg(1 ... numArgs) are float arguments int numArgs = msg.args.size(); float arglist [32]; char * messageName; if (numArgs>32) cout << "Warning: OSCNode takes only 32 args\n"; for (int i=1;ihost = msg.args[0]; cerr << "setting host = " << p_->host.c_str() << "\n"; } // set the port number on the host sound server else if (msg == "port") p_->port = msg.intArg(0); else ygNode::message(msg); } void OSCNode::app(void) { ygNode::app(); } #define MAX_ARGS 2000 #define SC_BUFFER_SIZE 32000 void OSCNode::sendOSCMessage (ygString oscmessage,int count, float *args) { OSCbuf buf; void *socket; int messagelength; static char bufferForOSCbuf[SC_BUFFER_SIZE]; OSC_initBuffer (&buf,SC_BUFFER_SIZE,bufferForOSCbuf); //OSC_writeAddressAndTypes (&buf,messageName,",fff"); if (count==0) OSC_writeAddress (&buf, oscmessage.c_str()); else if (count==1) OSC_writeAddressAndTypes (&buf,oscmessage.c_str(),",f"); for (int i=0;ihost.c_str(),p_->port); SendHTMSocket (socket,OSC_packetSize(&buf),OSC_getPacket(&buf)); CloseHTMSocket (socket); } void OSCNode::sendOSCMessage (ygString oscmessage) { sendOSCMessage (oscmessage,0,NULL); }