From 77c49cde2ae72289eedbe95a36628685c4ff63b7 Mon Sep 17 00:00:00 2001 From: rob Date: Sun, 21 Dec 2008 21:29:10 +0000 Subject: [PATCH] add README etc --- README | 67 ++ SC3Controller.m | 1 - build/Release/README | 66 ++ build/Release/SC3Controller.sc | 140 +++++ build/Release/VVOSC.framework/Headers | 1 + build/Release/VVOSC.framework/Resources | 1 + build/Release/VVOSC.framework/VVOSC | 1 + .../Versions/A/Headers/AddressValPair.h | 28 + .../Versions/A/Headers/OSCBundle.h | 34 + .../Versions/A/Headers/OSCInPort.h | 93 +++ .../Versions/A/Headers/OSCManager.h | 144 +++++ .../Versions/A/Headers/OSCMessage.h | 43 ++ .../Versions/A/Headers/OSCOutPort.h | 58 ++ .../Versions/A/Headers/OSCPacket.h | 37 ++ .../Versions/A/Headers/OSCZeroConfDomain.h | 44 ++ .../Versions/A/Headers/OSCZeroConfManager.h | 39 ++ .../Versions/A/Headers/VVOSC.h | 9 + .../Resources/English.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../Versions/A/Resources/Info.plist | 24 + .../Release/VVOSC.framework/Versions/A/VVOSC | Bin 0 -> 117664 bytes .../Release/VVOSC.framework/Versions/Current | 1 + build/Release/install.rb | 17 + build/Release/sc3ctrl | Bin 0 -> 47164 bytes install.rb | 3 + sc3ctrl.xcodeproj/project.pbxproj | 34 +- sc3ctrl.xcodeproj/rfw21.pbxuser | 587 +++++++++++++++--- sc3ctrl.xcodeproj/rfw21.perspectivev3 | 37 +- 27 files changed, 1395 insertions(+), 114 deletions(-) create mode 100644 build/Release/README create mode 100644 build/Release/SC3Controller.sc create mode 120000 build/Release/VVOSC.framework/Headers create mode 120000 build/Release/VVOSC.framework/Resources create mode 120000 build/Release/VVOSC.framework/VVOSC create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/AddressValPair.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCBundle.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCInPort.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCManager.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCMessage.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCOutPort.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCPacket.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfDomain.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfManager.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Headers/VVOSC.h create mode 100644 build/Release/VVOSC.framework/Versions/A/Resources/English.lproj/InfoPlist.strings create mode 100644 build/Release/VVOSC.framework/Versions/A/Resources/Info.plist create mode 100755 build/Release/VVOSC.framework/Versions/A/VVOSC create mode 120000 build/Release/VVOSC.framework/Versions/Current create mode 100755 build/Release/install.rb create mode 100755 build/Release/sc3ctrl create mode 100644 install.rb diff --git a/README b/README index e69de29..f21eee3 100644 --- a/README +++ b/README @@ -0,0 +1,67 @@ +sc3ctrl +======= + +************************************************************************** +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +************************************************************************** + + +Introduction +============ + +sc3ctrl is a command line utility which uses OpenSoundControl to control +the SuperCollider3.app in OSX. + +Source code/downloads: http://github.com/rfwatson/sc3ctrl + + +Installation +============ + +1) Drag the bundle into a suitable location on your machine + (such as /Application/Utilities/) + +2) Double click "install.rb". (This will create an executable script in +/usr/local/lib. This allows sc3ctrl to be run from the command-line. It also +copies the required SuperCollider class file to ~/Application\ +Support/SuperCollider/Extensions/). + +3) Start SuperCollider.app + + +Usage +===== + +sc3ctrl -x Execute the SC code in environment variable SC_INTERPRET_TEXT + +sc3ctrl -x VARIABLE_NAME Execute the SC code in environment variable VARIABLE_NAME + +sc3ctrl -d classname Open the help file for classname + +sc3ctrl -j classname Open the class definition for classname + +sc3ctrl -y methodname Examine implementations of methodname + +sc3ctrl -Y methodname Examine references to methodname + +sc3ctrl -s Stop server (CMD-PERIOD) + +sc3ctrl -c Clear post window + +sc3ctrl -p Post window to front + +sc3ctrl -k Recompile class library (requires recent build) + diff --git a/SC3Controller.m b/SC3Controller.m index 0072989..d172aa0 100644 --- a/SC3Controller.m +++ b/SC3Controller.m @@ -19,7 +19,6 @@ return self; } - - (void)interpretContentsOfEnvironmentVariable:(const char *)var { char *utf8cmd = getenv(var); diff --git a/build/Release/README b/build/Release/README new file mode 100644 index 0000000..a11d57f --- /dev/null +++ b/build/Release/README @@ -0,0 +1,66 @@ +************************************************************************** +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +************************************************************************** + + +Introduction +============ + +sc3ctrl is a command line utility which uses OpenSoundControl to control +the SuperCollider3.app in OSX. + +Consists of a small CoreFoundation bundle written in Objective-C and a +single SuperCollider class. + +Source code: http://github.com/rfwatson/sc3ctrl + + +Installation +============ + +1) Drag the bundle into a suitable location on your machine + (e.g. /Application/Utilities/) + +2) cd /Application/Utilities/sc3ctrl/ + +3) sudo install.rb + +4) Start SuperCollider.app + + +Usage +===== + +sc3ctrl -x Execute the SC code in environment variable SC_INTERPRET_TEXT + +sc3ctrl -x VARIABLE_NAME Execute the SC code in environment variable VARIABLE_NAME + +sc3ctrl -d classname Open help file for classname + +sc3ctrl -j classname Open class definition for classname + +sc3ctrl -y methodname Examine implementations of methodname + +sc3ctrl -Y methodname Examine references to methodname + +sc3ctrl -s Stop server (CMD-PERIOD) + +sc3ctrl -c Clear post window + +sc3ctrl -p Post window to front + +sc3ctrl -k Recompile class library (requires recent build) + diff --git a/build/Release/SC3Controller.sc b/build/Release/SC3Controller.sc new file mode 100644 index 0000000..f2c66c8 --- /dev/null +++ b/build/Release/SC3Controller.sc @@ -0,0 +1,140 @@ +// http://github.com/rfwatson/sc3ctrl + +SC3Controller { + classvar nodes; + + *addListeners { + var node; + if(nodes.isEmpty) { + node = OSCresponderNode(nil, '/sc3ctrl/cmd') { |t, r, msg| + msg[1].asString.interpretPrint; + { postToFront.() }.defer; + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/help') { |t, r, msg| + { msg[1].asString.openHelpFile }.defer + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/class') { |t, r, msg| + { msg[1].asString.interpret.openCodeFile }.defer + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/implementations') { |t, r, msg| + { SC3Controller.methodTemplates(msg[1]) }.defer + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/references') { |t, r, msg| + { SC3Controller.methodReferences(msg[1]) }.defer + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/stop') { |t, r, msg| + thisProcess.stop; + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/clear') { |t, r, msg| + { + Document.listener.string = ""; ""; + postToFront.(); + }.defer; + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/postfront') { |t, r, msg| + { postToFront.() }.defer; + }.add; + nodes.add(node); + + node = OSCresponderNode(nil, '/sc3ctrl/recompile') { |t, r, msg| + { + thisProcess.recompile; + postToFront.(); + }.defer; + }.add; + nodes.add(node); + } + } + + *removeAllListeners { + nodes.do(_.remove); + } + + *initClass { + var postToFront; + nodes = List[]; + + Platform.case(\osx) { + postToFront = { + Document.listener.front; + }; + + StartUp.add { + this.addListeners; + } + } + } + + // adapated from Kernel.sc + *methodTemplates { |name| + var out, found = 0, namestring; + out = CollStream.new; + out << "Implementations of '" << name << "' :\n"; + Class.allClasses.do({ arg class; + class.methods.do({ arg method; + if (method.name == name, { + found = found + 1; + namestring = class.name ++ ":" ++ name; + out << " " << namestring << " : "; + if (method.argNames.isNil or: { method.argNames.size == 1 }, { + out << "this." << name; + if (name.isSetter, { out << "(val)"; }); + },{ + out << method.argNames.at(0); + if (name.asString.at(0).isAlpha, { + out << "." << name << "("; + method.argNames.do({ arg argName, i; + if (i > 0, { + if (i != 1, { out << ", " }); + out << argName; + }); + }); + out << ")"; + },{ + out << " " << name << " "; + out << method.argNames.at(1); + }); + }); + out.nl; + }); + }); + }); + if(found == 0) + { + Post << "\nNo implementations of '" << name << "'.\n"; + } + { + out.collection.newTextWindow(name.asString); + }; + } + + // adapted from Kernel.sc + *methodReferences { |name| + var out, references; + name = name.asSymbol; + out = CollStream.new; + references = Class.findAllReferences(name); + + if (references.notNil, { + out << "References to '" << name << "' :\n"; + references.do({ arg ref; out << " " << ref.asString << "\n"; }); + out.collection.newTextWindow(name.asString); + },{ + Post << "\nNo references to '" << name << "'.\n"; + }); + } +} \ No newline at end of file diff --git a/build/Release/VVOSC.framework/Headers b/build/Release/VVOSC.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/build/Release/VVOSC.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/build/Release/VVOSC.framework/Resources b/build/Release/VVOSC.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/build/Release/VVOSC.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/build/Release/VVOSC.framework/VVOSC b/build/Release/VVOSC.framework/VVOSC new file mode 120000 index 0000000..c6a43b0 --- /dev/null +++ b/build/Release/VVOSC.framework/VVOSC @@ -0,0 +1 @@ +Versions/Current/VVOSC \ No newline at end of file diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/AddressValPair.h b/build/Release/VVOSC.framework/Versions/A/Headers/AddressValPair.h new file mode 100644 index 0000000..e8ab9ca --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/AddressValPair.h @@ -0,0 +1,28 @@ +// +// AddressValPair.h +// VVOSC +// +// Created by bagheera on 12/11/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + + + +@interface AddressValPair : NSObject { + NSString *address; + id val; +} + ++ (id) createWithAddress:(NSString *)a val:(id)v; +- (id) initWithAddress:(NSString *)a val:(id)v; + +- (NSString *) address; +- (id) val; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCBundle.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCBundle.h new file mode 100644 index 0000000..712f13a --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCBundle.h @@ -0,0 +1,34 @@ +// +// OSCBundle.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#import "OSCMessage.h" + + + + +@interface OSCBundle : NSObject { + NSMutableArray *elementArray; // array of messages or bundles +} + ++ (void) parseRawBuffer:(unsigned char *)b ofMaxLength:(int)l toInPort:(id)p; + ++ (id) create; + +- (void) addElement:(id)n; +- (void) addElementArray:(NSArray *)a; + +- (int) bufferLength; +- (void) writeToBuffer:(unsigned char *)b; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCInPort.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCInPort.h new file mode 100644 index 0000000..3f1fa83 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCInPort.h @@ -0,0 +1,93 @@ +// +// OSCInPort.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + + +//#import +//#import +#import + +#import +#import "AddressValPair.h" +#import "OSCPacket.h" +#import "OSCBundle.h" +#import "OSCMessage.h" + + +@protocol OSCInPortDelegateProtocol +- (void) oscMessageReceived:(NSDictionary *)d; +- (void) receivedOSCVal:(id)v forAddress:(NSString *)a; +@end + +@protocol OSCDelegateProtocol +- (void) oscMessageReceived:(NSDictionary *)d; +- (void) receivedOSCVal:(id)v forAddress:(NSString *)a; +@end + + +@interface OSCInPort : NSObject { + BOOL deleted; // whether or not i'm deleted- ensures that socket gets closed + BOOL bound; // whether or not the socket is bound + int sock; // socket file descriptor. remember, everything in unix is files! + struct sockaddr_in addr; // struct that describes *my* address (this is an in port) + unsigned short port; // the port number i'm receiving from + BOOL running; // whether or not i should keep running + BOOL busy; + unsigned char buf[8192]; // the socket gets data and dumps it here immediately + + pthread_mutex_t lock; + NSTimer *threadTimer; + int threadTimerCount; + NSAutoreleasePool *threadPool; + + NSString *portLabel; // the "name" of the port (added to distinguish multiple osc input ports for bonjour) + NSNetService *zeroConfDest; // bonjour service for publishing this input's address...only active if there's a portLabel! + + NSMutableDictionary *scratchDict; // key of dict is address port; object at key is a mut. array. coalesced messaging. + NSMutableArray *scratchArray; // array of AddressValPair objects. used for serial messaging. + id delegate; // my delegate gets notified of incoming messages +} + ++ (id) createWithPort:(unsigned short)p; ++ (id) createWithPort:(unsigned short)p labelled:(NSString *)n; +- (id) initWithPort:(unsigned short)p; +- (id) initWithPort:(unsigned short)p labelled:(NSString *)n; + +- (void) prepareToBeDeleted; + +- (NSDictionary *) createSnapshot; + +- (BOOL) createSocket; +- (void) start; +- (void) stop; +- (void) launchOSCLoop:(id)o; +- (void) OSCThreadProc:(NSTimer *)t; +- (void) parseRawBuffer:(unsigned char *)b ofMaxLength:(int)l; + +// if the delegate im +- (void) handleParsedScratchDict:(NSDictionary *)d; +- (void) handleScratchArray:(NSArray *)a; + +- (void) addValue:(id)val toAddressPath:(NSString *)p; + +- (unsigned short) port; +- (void) setPort:(unsigned short)n; +- (NSString *) portLabel; +- (void) setPortLabel:(NSString *)n; +- (NSNetService *) zeroConfDest; +- (BOOL) bound; + +- (id) delegate; +- (void) setDelegate:(id)n; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCManager.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCManager.h new file mode 100644 index 0000000..5673296 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCManager.h @@ -0,0 +1,144 @@ +// +// OSCManager.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#import "OSCZeroConfManager.h" +#import "OSCInPort.h" +#import "OSCOutPort.h" +#import + +/* + TOP-LEVEL OVERVIEW + + this osc manager class is all you need to add to your app. it has methods for + adding and removing ports. you can have as many osc managers as you like, but + you should really only need one instance. + + input ports have a delegate- delegate methods are called as the port receives data. + it's important to note that the delegate methods must be thread-safe: each input + port is running on its own (non-main) thread. + + data is sent via the output ports (convenience methods for doing this are built + into the osc manager). + + + + + GENERAL OSC STRUCTURE AND OVERVIEW + + this framework was written from the OSC spec found here: + http://opensoundcontrol.org/spec-1_0 + + - an OSC packet is the basic unit of transmitting OSC data. + - an OSC packet consists of: + - contents- contiguous block of binary data (either a bundle or a message), and then the + - size- number of 8-bit bytes that comprise 'contents'- ALWAYS multiple of 4! + - an OSC message consists of: + - an OSC address pattern (starting with '/'), followed by + - an OSC type tag string, followed by + - zero or more 'OSC arguments' + - an OSC bundle consists of: + - the OSC-string "#bundle", followed by + - an OSC time tag, followed by + - zero or more 'OSC bundle elements' + - an OSC bundle element consists of: + - 'size' (int32)- number of 8-bit bytes in the contents- ALWAYS multiple of 4! + - 'contents'- either another OSC bundle, or an OSC message + + + + + PORTS- SENDING AND RECEIVING UDP/TCP DATA + + some basic information, gleaned from: + http://beej.us/guide/bgnet/output/html/multipage/index.html + + struct sockaddr { + unsigned short sa_family; // address family, AF_xxx + char sa_data[14]; // 14 bytes of protocol address + } + struct sockaddr_in { + short int sin_family; // address family + unsigned short int sin_port; // port number + struct in_addr sin_addr; // internet address + unsigned char sin_zero[8]; // exists so sockaddr_in has same length as sockaddr + } + + recv(int sockfd, void *buf, int len, unsigned int flags); + - sockfd is the socket descriptor to read from + - buf is the buffer to read the information into + - len is the max length of the buffer + - flags can be set to 0 + recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); + - from is a pointer to a local struct sockaddr that will be filled with the IP & port of the originating machine + - fromlen is a pointer to a local int that should be initialized to a sizeof(struct sockaddr)- contains length of address actually stored in from on return + ...as well as the 4 params listed above in recv() + + int select(int numfds, fd_set *readrds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +*/ + +@interface OSCManager : NSObject { + NSMutableArray *inPortArray; + NSMutableArray *outPortArray; + + pthread_rwlock_t inPortLock; + pthread_rwlock_t outPortLock; + + id delegate; + + OSCZeroConfManager *zeroConfManager; // bonjour/zero-configuration manager +} + +- (void) deleteAllInputs; +- (void) deleteAllOutputs; +// methods for creating input ports +- (OSCInPort *) createNewInputFromSnapshot:(NSDictionary *)s; +- (OSCInPort *) createNewInputForPort:(int)p withLabel:(NSString *)l; +- (OSCInPort *) createNewInputForPort:(int)p; +- (OSCInPort *) createNewInput; +// methods for creating output ports +- (OSCOutPort *) createNewOutputFromSnapshot:(NSDictionary *)s; +- (OSCOutPort *) createNewOutputToAddress:(NSString *)a atPort:(int)p withLabel:(NSString *)l; +- (OSCOutPort *) createNewOutputToAddress:(NSString *)a atPort:(int)p; +- (OSCOutPort *) createNewOutput; + +// typically, the manager is the input port's delegate- input ports tell delegates when they receive data +// this method is called and contains coalesced messages (grouped by address path) +- (void) oscMessageReceived:(NSDictionary *)d; +// this method is called every time any osc val is processed +- (void) receivedOSCVal:(id)v forAddress:(NSString *)a; + +// methods for working with ports +- (NSString *) getUniqueInputLabel; +- (NSString *) getUniqueOutputLabel; +- (OSCInPort *) findInputWithLabel:(NSString *)n; +- (OSCOutPort *) findOutputWithLabel:(NSString *)n; +- (OSCOutPort *) findOutputWithAddress:(NSString *)a andPort:(int)p; +- (OSCOutPort *) findOutputForIndex:(int)i; +- (OSCInPort *) findInputWithZeroConfName:(NSString *)n; +- (void) removeInput:(id)p; +- (void) removeOutput:(id)p; +- (NSArray *) outPortLabelArray; + +// subclassable methods for customizing +- (id) inPortClass; +- (NSString *) inPortLabelBase; +- (id) outPortClass; + +// misc +- (id) delegate; +- (void) setDelegate:(id)n; +- (NSMutableArray *) inPortArray; +- (NSMutableArray *) outPortArray; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCMessage.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCMessage.h new file mode 100644 index 0000000..e86444c --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCMessage.h @@ -0,0 +1,43 @@ +// +// OSCMessage.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#import + + + +@interface OSCMessage : NSObject { + NSString *address; + NSMutableArray *typeArray; + NSMutableArray *argArray; + pthread_rwlock_t lock; +} + ++ (void) parseRawBuffer:(unsigned char *)b ofMaxLength:(int)l toInPort:(id)p; ++ (id) createMessageToAddress:(NSString *)a; +- (id) initWithAddress:(NSString *)a; + +- (void) addInt:(int)n; +- (void) addFloat:(float)n; +#if IPHONE +- (void) addColor:(UIColor *)c; +#else +- (void) addColor:(NSColor *)c; +#endif +- (void) addBOOL:(BOOL)n; +- (void) addString:(NSString *)n; + +- (int) bufferLength; +- (void) writeToBuffer:(unsigned char *)b; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCOutPort.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCOutPort.h new file mode 100644 index 0000000..859b046 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCOutPort.h @@ -0,0 +1,58 @@ +// +// OSCOutPort.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + + +#include + +#import "OSCPacket.h" +#import "OSCBundle.h" +#import "OSCMessage.h" + + + + +@interface OSCOutPort : NSObject { + BOOL deleted; + int sock; + struct sockaddr_in addr; + unsigned short port; + NSString *addressString; + NSString *portLabel; // used it to distinguish between multiple osc outputs +} + ++ (id) createWithAddress:(NSString *)a andPort:(unsigned short)p; ++ (id) createWithAddress:(NSString *)a andPort:(unsigned short)p labelled:(NSString *)l; +- (id) initWithAddress:(NSString *)a andPort:(unsigned short)p; +- (id) initWithAddress:(NSString *)a andPort:(unsigned short)p labelled:(NSString *)l; +- (void) prepareToBeDeleted; + +- (NSDictionary *) createSnapshot; + +- (BOOL) createSocket; + +- (void) sendThisBundle:(OSCBundle *)b; +- (void) sendThisMessage:(OSCMessage *)m; +- (void) sendThisPacket:(OSCPacket *)p; + +- (void) setAddressString:(NSString *)n; +- (void) setPort:(unsigned short)p; +- (void) setAddressString:(NSString *)n andPort:(unsigned short)p; + +- (NSString *) portLabel; +- (void) setPortLabel:(NSString *)n; + +- (unsigned short) port; +- (NSString *) addressString; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCPacket.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCPacket.h new file mode 100644 index 0000000..4d79674 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCPacket.h @@ -0,0 +1,37 @@ +// +// OSCPacket.h +// OSC +// +// Created by bagheera on 9/20/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#include +#import "OSCBundle.h" +#import "OSCMessage.h" + +/* + this class requires a bundle or message on create/init. the buffer/msg + is NOT retained by this class in any way- it's used to immediately create + the buffer which will be sent. +*/ + +@interface OSCPacket : NSObject { + int bufferLength; + unsigned char *payload; +} + ++ (void) parseRawBuffer:(unsigned char *)b ofMaxLength:(int)l toInPort:(id)p; ++ (id) createWithContent:(id)c; +- (id) initWithContent:(id)c; + +- (int) bufferLength; +- (unsigned char *) payload; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfDomain.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfDomain.h new file mode 100644 index 0000000..22a94bc --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfDomain.h @@ -0,0 +1,44 @@ +// +// OSCZeroConfDomain.h +// VVOSC +// +// Created by bagheera on 12/9/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#import +#import +#include + + + + +@interface OSCZeroConfDomain : NSObject { + NSString *domainString; + NSNetServiceBrowser *serviceBrowser; + + NSMutableArray *servicesArray; + pthread_rwlock_t servicesLock; + + id domainManager; +} + ++ (id) createWithDomain:(NSString *)d andDomainManager:(id)m; +- (id) initWithDomain:(NSString *)d andDomainManager:(id)m; + +// NSNetServiceBrowser delegate methods +- (void)netServiceBrowser:(NSNetServiceBrowser *)n didFindService:(NSNetService *)x moreComing:(BOOL)m; +- (void)netServiceBrowser:(NSNetServiceBrowser *)n didNotSearch:(NSDictionary *)err; +- (void)netServiceBrowser:(NSNetServiceBrowser *)n didRemoveService:(NSNetService *)s moreComing:(BOOL)m; + +// NSNetService delegate methods +- (void)netService:(NSNetService *)n didNotResolve:(NSDictionary *)err; +- (void)netServiceDidResolveAddress:(NSNetService *)n; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfManager.h b/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfManager.h new file mode 100644 index 0000000..21ddd7f --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/OSCZeroConfManager.h @@ -0,0 +1,39 @@ +// +// OSCZeroConfManager.h +// VVOSC +// +// Created by bagheera on 12/9/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#if IPHONE +#import +#else +#import +#endif + +#import "OSCZeroConfDomain.h" +#import + + + + +@interface OSCZeroConfManager : NSObject { + NSNetServiceBrowser *domainBrowser; + + NSMutableDictionary *domainDict; + pthread_rwlock_t domainLock; + + id oscManager; +} + +- (id) initWithOSCManager:(id)m; + +- (void) serviceRemoved:(NSNetService *)s; +- (void) serviceResolved:(NSNetService *)s; + +// NSNetServiceBrowser delegate methods +- (void)netServiceBrowser:(NSNetServiceBrowser *)n didFindDomain:(NSString *)d moreComing:(BOOL)m; +- (void)netServiceBrowser:(NSNetServiceBrowser *)n didNotSearch:(NSDictionary *)err; + +@end diff --git a/build/Release/VVOSC.framework/Versions/A/Headers/VVOSC.h b/build/Release/VVOSC.framework/Versions/A/Headers/VVOSC.h new file mode 100644 index 0000000..0248ef1 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Headers/VVOSC.h @@ -0,0 +1,9 @@ + + +#import "AddressValPair.h" +#import "OSCManager.h" +#import "OSCZeroConfManager.h" +#import "OSCPacket.h" +#import "OSCBundle.h" +#import "OSCMessage.h" + diff --git a/build/Release/VVOSC.framework/Versions/A/Resources/English.lproj/InfoPlist.strings b/build/Release/VVOSC.framework/Versions/A/Resources/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..dea12de4cad936a6204d4da70d2ca96aef900b31 GIT binary patch literal 92 zcmW-Z!3uyN5C!M#S9tbN-x2r|Q3;V~qzLu#)x*oq?lA28G2*azG7B@2orjH8u89{# bCX+-f2F*!V&^~bXzEEWk)pxI)ej3aVcM}l{ literal 0 HcmV?d00001 diff --git a/build/Release/VVOSC.framework/Versions/A/Resources/Info.plist b/build/Release/VVOSC.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..5dfb179 --- /dev/null +++ b/build/Release/VVOSC.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + VVOSC + CFBundleGetInfoString + 0.1.2 + CFBundleIdentifier + com.vidvox.VVOSC + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + VVOSC + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 0.1.2 + + diff --git a/build/Release/VVOSC.framework/Versions/A/VVOSC b/build/Release/VVOSC.framework/Versions/A/VVOSC new file mode 100755 index 0000000000000000000000000000000000000000..878f6e1a22e98198ea9b04f8351b9144e3370f97 GIT binary patch literal 117664 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 /usr/local/bin/sc3ctrl} +%x{chmod a+x /usr/local/bin/sc3ctrl} +puts "Done." + +puts +puts "Copying SuperCollider class to Extensions folder .." +system 'cp SC3Controller.sc ~/Library/Application\ Support/SuperCollider/Extensions/' +puts "Done." + +puts \ No newline at end of file diff --git a/build/Release/sc3ctrl b/build/Release/sc3ctrl new file mode 100755 index 0000000000000000000000000000000000000000..251521d85d979472b635586dd229a82d9c85e32a GIT binary patch literal 47164 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 + BecomeActive + ContentConfiguration PBXBottomSmartGroupGIDs @@ -271,9 +273,11 @@ 08FB7795FE84155DC02AAC07 C6859EA2029092E104C91782 08FB779DFE84155DC02AAC07 - 08FB779EFE84155DC02AAC07 1AB674ADFE9D54B511CA2CBB 1C37FBAC04509CD000000102 + 5671655C0EFE9A030047EA2B + 5671676C0EFEDC740047EA2B + 5671672E0EFECD7F0047EA2B 1C37FAAC04509CD000000102 1C77FABC04509CD000000102 1C3E0DCA080725EA00A55177 @@ -281,8 +285,7 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 2 - 1 + 15 0 @@ -315,14 +318,12 @@ Dock - BecomeActive - ContentConfiguration PBXProjectModuleGUID 567162000EFD3EA50047EA2B PBXProjectModuleLabel - SC3Controller.m + install.rb PBXSplitModuleInNavigatorKey Split0 @@ -330,20 +331,23 @@ PBXProjectModuleGUID 567162010EFD3EA50047EA2B PBXProjectModuleLabel - SC3Controller.m + install.rb _historyCapacity 0 bookmark - 567167100EFEC8B00047EA2B + 5671677C0EFEDCBF0047EA2B history 567164430EFE8E370047EA2B 567165460EFE996B0047EA2B - 567166740EFEAFD20047EA2B 567166FD0EFEC78D0047EA2B - 5671670A0EFEC8B00047EA2B 5671670B0EFEC8B00047EA2B - 5671670C0EFEC8B00047EA2B + 567167290EFECD490047EA2B + 5671676D0EFEDC740047EA2B + 5671676E0EFEDC740047EA2B + 5671676F0EFEDC740047EA2B + 567167790EFEDCBF0047EA2B + 5671677A0EFEDCBF0047EA2B prevStack @@ -421,6 +425,13 @@ 5671670D0EFEC8B00047EA2B 5671670E0EFEC8B00047EA2B 5671670F0EFEC8B00047EA2B + 5671672A0EFECD490047EA2B + 5671672B0EFECD490047EA2B + 5671672C0EFECD490047EA2B + 567167710EFEDC740047EA2B + 567167720EFEDC740047EA2B + 567167730EFEDC740047EA2B + 5671677B0EFEDCBF0047EA2B SplitCount @@ -515,7 +526,7 @@ GeometryConfiguration Frame - {{10, 27}, {1473, 180}} + {{10, 27}, {1473, 218}} Module PBXBuildResultsModule @@ -731,8 +742,6 @@ 5 WindowOrderList - 567165EC0EFEA8780047EA2B - 567165ED0EFEA8780047EA2B 567165D60EFEA7DD0047EA2B 567165D70EFEA7DD0047EA2B /Developer/Projects/sc3ctrl/sc3ctrl.xcodeproj