Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Fixing up Receiver for arbitrary ports

  • Loading branch information...
commit 122a1353ed8bc02f3fc54fee977d67b1454fb01e 1 parent 3ffcfbb
Jonathan del Strother authored
18 BBOSC.xcodeproj/project.pbxproj
@@ -33,6 +33,7 @@
33 33 FC520B0A1056B90000FE3004 /* BBOSCSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC520AC11056B56400FE3004 /* BBOSCSettings.xib */; };
34 34 FC520BFC1057E69B00FE3004 /* NSArrayExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = FC520BFB1057E69B00FE3004 /* NSArrayExtensions.m */; };
35 35 FC520CFB1058085100FE3004 /* BBOSCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC520CFA1058085100FE3004 /* BBOSCViewController.m */; };
  36 + FC520D301058137600FE3004 /* OSCExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = FC520D2F1058137600FE3004 /* OSCExtensions.m */; };
36 37 /* End PBXBuildFile section */
37 38
38 39 /* Begin PBXContainerItemProxy section */
@@ -47,42 +48,42 @@
47 48 isa = PBXContainerItemProxy;
48 49 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
49 50 proxyType = 2;
50   - remoteGlobalIDString = 963E71D00E993BB9007CF9D8 /* VVOSCTester.app */;
  51 + remoteGlobalIDString = 963E71D00E993BB9007CF9D8;
51 52 remoteInfo = VVOSCTester;
52 53 };
53 54 FC5208CF10567BED00FE3004 /* PBXContainerItemProxy */ = {
54 55 isa = PBXContainerItemProxy;
55 56 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
56 57 proxyType = 2;
57   - remoteGlobalIDString = 8DC2EF5B0486A6940098B216 /* VVOSC.framework */;
  58 + remoteGlobalIDString = 8DC2EF5B0486A6940098B216;
58 59 remoteInfo = "VVOSC framework";
59 60 };
60 61 FC5208D110567BED00FE3004 /* PBXContainerItemProxy */ = {
61 62 isa = PBXContainerItemProxy;
62 63 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
63 64 proxyType = 2;
64   - remoteGlobalIDString = 96EB122C0EFAA64300B2D581 /* libVVOSC.a */;
  65 + remoteGlobalIDString = 96EB122C0EFAA64300B2D581;
65 66 remoteInfo = "VVOSC-iPhone sim";
66 67 };
67 68 FC5208D310567BED00FE3004 /* PBXContainerItemProxy */ = {
68 69 isa = PBXContainerItemProxy;
69 70 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
70 71 proxyType = 2;
71   - remoteGlobalIDString = 967FDE3C0EFAA6A600BCF87E /* libVVOSC.a */;
  72 + remoteGlobalIDString = 967FDE3C0EFAA6A600BCF87E;
72 73 remoteInfo = "VVOSC-iPhone dev";
73 74 };
74 75 FC5208D510567BED00FE3004 /* PBXContainerItemProxy */ = {
75 76 isa = PBXContainerItemProxy;
76 77 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
77 78 proxyType = 2;
78   - remoteGlobalIDString = 96A059B40EFACDDB00E82377 /* libVVOSC.a */;
  79 + remoteGlobalIDString = 96A059B40EFACDDB00E82377;
79 80 remoteInfo = "VVOSC-os x";
80 81 };
81 82 FC5208EC10567C6C00FE3004 /* PBXContainerItemProxy */ = {
82 83 isa = PBXContainerItemProxy;
83 84 containerPortal = FC5208BF10567BED00FE3004 /* VVOSC.xcodeproj */;
84 85 proxyType = 1;
85   - remoteGlobalIDString = 8DC2EF4F0486A6940098B216 /* VVOSC framework */;
  86 + remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
86 87 remoteInfo = "VVOSC framework";
87 88 };
88 89 /* End PBXContainerItemProxy section */
@@ -123,6 +124,8 @@
123 124 FC520BFB1057E69B00FE3004 /* NSArrayExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSArrayExtensions.m; sourceTree = "<group>"; };
124 125 FC520CF91058085100FE3004 /* BBOSCViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BBOSCViewController.h; sourceTree = "<group>"; };
125 126 FC520CFA1058085100FE3004 /* BBOSCViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BBOSCViewController.m; sourceTree = "<group>"; };
  127 + FC520D2E1058137600FE3004 /* OSCExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSCExtensions.h; sourceTree = "<group>"; };
  128 + FC520D2F1058137600FE3004 /* OSCExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OSCExtensions.m; sourceTree = "<group>"; };
126 129 /* End PBXFileReference section */
127 130
128 131 /* Begin PBXFrameworksBuildPhase section */
@@ -184,6 +187,8 @@
184 187 FC520BFB1057E69B00FE3004 /* NSArrayExtensions.m */,
185 188 FC520CF91058085100FE3004 /* BBOSCViewController.h */,
186 189 FC520CFA1058085100FE3004 /* BBOSCViewController.m */,
  190 + FC520D2E1058137600FE3004 /* OSCExtensions.h */,
  191 + FC520D2F1058137600FE3004 /* OSCExtensions.m */,
187 192 );
188 193 name = Classes;
189 194 sourceTree = "<group>";
@@ -349,6 +354,7 @@
349 354 FC5209AC1056853800FE3004 /* BBOSCPluginReceiver.m in Sources */,
350 355 FC520BFC1057E69B00FE3004 /* NSArrayExtensions.m in Sources */,
351 356 FC520CFB1058085100FE3004 /* BBOSCViewController.m in Sources */,
  357 + FC520D301058137600FE3004 /* OSCExtensions.m in Sources */,
352 358 );
353 359 runOnlyForDeploymentPostprocessing = 0;
354 360 };
47 BBOSCPlugInSender.m
@@ -8,8 +8,7 @@
8 8
9 9 /* It's highly recommended to use CGL macros instead of changing the current context for plug-ins that perform OpenGL rendering */
10 10 #import <OpenGL/CGLMacro.h>
11   -#import "vvosc/FrameworkSrc/VVOSC.h"
12   -
  11 +#import "OSCExtensions.h"
13 12 #import "BBOSCViewController.h"
14 13 #import "BBOSCPlugInSender.h"
15 14 #import "NSArrayExtensions.h"
@@ -18,50 +17,10 @@
18 17 #define kQCPlugIn_Description @"Best Before Open Sound Control sender plugin"
19 18
20 19
21   -@interface OSCMessage(BBExtensions)
22   --(void)addNSValue:(id)newValue withBias:(BBOSCType)bias;
23   -@end
24   -@implementation OSCMessage(BBExtensions)
25   --(void)addNSValue:(id)newValue withBias:(BBOSCType)bias {
26   -
27   - if ([newValue isKindOfClass:[NSString class]]) {
28   - [self addString:newValue];
29   -
30   - } else if ([newValue isKindOfClass:[NSNumber class]]) {
31   - switch(bias) {
32   - case BBOSCTypeBool:
33   - [self addBOOL:[newValue boolValue]];
34   - break;
35   - case BBOSCTypeInt:
36   - [self addInt:[newValue intValue]];
37   - break;
38   - case BBOSCTypeFloat:
39   - [self addFloat:[newValue floatValue]];
40   - break;
41   - default:
42   - NSAssert2(NO, @"Bad type %d for %@", bias, newValue);
43   - }
44   -
45   - } else if ([newValue isKindOfClass:[NSArray class]]) {
46   - NSAssert2(bias>=BBOSCTypeArrayOfInt && bias<=BBOSCTypeArrayOfBool, @"Unexpected value %@ for type %d", newValue, bias);
47   - // We've got an array - add all the subvalues into the message, using the appropriate type (eg if we're using BBOSCTypeArrayOfFloat, subvalues should use BBOSCTypeFloat)
48   - for(id subvalue in newValue) {
49   - [self addNSValue:subvalue withBias:bias-4];
50   - }
51   -
52   - } else {
53   - [self addBOOL:!!newValue];
54   - }
55   -}
56   -@end
57   -
58   -
59   -
60 20 @interface BBOSCPlugInSender ()
61 21 @property (nonatomic, readwrite, retain) OSCManager *oscManager;
62 22 @property (nonatomic, readwrite, retain) OSCOutPort *oscPort;
63 23 @property (nonatomic, readwrite, retain) NSArray* oscParameters;
64   -
65 24 @end
66 25
67 26 @implementation BBOSCPlugInSender
@@ -171,10 +130,6 @@ -(void)setOscParameters:(NSArray*)params {
171 130 }
172 131 }
173 132
174   --(NSArray*)oscParameters {
175   - return oscParameters;
176   -}
177   -
178 133 @end
179 134
180 135 @implementation BBOSCPlugInSender (Execution)
14 BBOSCPluginReceiver.h
@@ -9,14 +9,18 @@
9 9 #import <Quartz/Quartz.h>
10 10
11 11 @class OSCManager, OSCInPort;
12   -@interface BBOSCPluginReceiver : QCPlugIn
13   -{
14   - OSCManager *oscManager;
15   - OSCInPort *oscPort;
  12 +@interface BBOSCPluginReceiver : QCPlugIn {
16 13 NSMutableArray* messages;
17 14 NSLock* messageLock;
18 15 }
  16 +@property (nonatomic, readonly, retain) NSString* listeningPath;
19 17
20   -@property (nonatomic, readwrite, assign) NSArray* outputStructure;
  18 +@property (nonatomic, readonly, retain) NSArray* oscParameters;
21 19
  20 +@property (nonatomic, readonly, retain) OSCManager *oscManager;
  21 +@property (nonatomic, readonly, retain) OSCInPort *oscPort;
  22 +
  23 +@property (nonatomic, readwrite, assign) NSUInteger inputReceivingPort;
  24 +@property (nonatomic, readwrite, assign) NSString* inputReceivingPath;
  25 +@property (nonatomic, readwrite, assign) BOOL outputMessageReceived;
22 26 @end
129 BBOSCPluginReceiver.m
@@ -8,14 +8,24 @@
8 8
9 9 /* It's highly recommended to use CGL macros instead of changing the current context for plug-ins that perform OpenGL rendering */
10 10 #import <OpenGL/CGLMacro.h>
11   -#import "vvosc/FrameworkSrc/VVOSC.h"
12 11 #import "BBOSCPluginReceiver.h"
  12 +#import "BBOSCViewController.h"
  13 +#import "NSArrayExtensions.h"
  14 +#import "OSCExtensions.h"
13 15
14 16 #define kQCPlugIn_Name @"BBOSC Receiver"
15 17 #define kQCPlugIn_Description @"Best Before Open Sound Control receiver plugin"
16 18
  19 +@interface BBOSCPluginReceiver ()
  20 +@property (nonatomic, readwrite, retain) OSCManager *oscManager;
  21 +@property (nonatomic, readwrite, retain) OSCOutPort *oscPort;
  22 +@property (nonatomic, readwrite, retain) NSArray* oscParameters;
  23 +@property (nonatomic, readwrite, retain) NSString* listeningPath;
  24 +@end
  25 +
17 26 @implementation BBOSCPluginReceiver
18   -@dynamic outputStructure;
  27 +@dynamic inputReceivingPort, inputReceivingPath, outputMessageReceived;
  28 +@synthesize oscManager, oscPort, oscParameters, listeningPath;
19 29
20 30 + (NSDictionary*) attributes
21 31 {
@@ -31,6 +41,17 @@ + (NSDictionary*) attributesForPropertyPortWithKey:(NSString*)key
31 41 /*
32 42 Specify the optional attributes for property based ports (QCPortAttributeNameKey, QCPortAttributeDefaultValueKey...).
33 43 */
  44 + if ([key isEqualToString:@"inputReceivingPort"]) {
  45 + return [NSDictionary dictionaryWithObjectsAndKeys:@"Receiving Port", QCPortAttributeNameKey,
  46 + [NSNumber numberWithInt:60000], QCPortAttributeDefaultValueKey, nil];
  47 + }
  48 + if ([key isEqualToString:@"inputReceivingPath"]) {
  49 + return [NSDictionary dictionaryWithObjectsAndKeys:@"Receiving Path", QCPortAttributeNameKey,
  50 + @"", QCPortAttributeDefaultValueKey, nil];
  51 + }
  52 + if ([key isEqualToString:@"outputMessageReceived"]) {
  53 + return [NSDictionary dictionaryWithObjectsAndKeys:@"Message Received", QCPortAttributeNameKey, nil];
  54 + }
34 55
35 56 return nil;
36 57 }
@@ -56,10 +77,11 @@ + (QCPlugInTimeMode) timeMode
56 77 - (id) init
57 78 {
58 79 if(self = [super init]) {
59   - oscManager = [[OSCManager alloc] init];
60   - oscManager.delegate = self;
  80 + self.oscManager = [[[OSCManager alloc] init] autorelease];
  81 + self.oscManager.delegate = self;
  82 + self.oscParameters = [NSArray array];
61 83 messages = [[NSMutableArray alloc] init];
62   - messageLock = [[NSLock alloc] init];
  84 + messageLock = [[NSLock alloc] init];
63 85 }
64 86
65 87 return self;
@@ -81,16 +103,51 @@ - (void) dealloc
81 103 [oscManager release];
82 104 [messages release];
83 105 [messageLock release];
  106 + [listeningPath release];
  107 + [oscParameters release];
84 108 [super dealloc];
85 109 }
86 110
  111 +- (QCPlugInViewController*) createViewController
  112 +{
  113 + return [[BBOSCViewController alloc] initWithPlugIn:self
  114 + viewNibName:@"BBOSCSettings"];
  115 +}
  116 +
  117 ++ (NSArray*) plugInKeys {
  118 + return [NSArray arrayWithObjects:@"oscParameters", nil];
  119 +}
  120 +
  121 +-(void)setOscParameters:(NSArray*)params {
  122 + NSArray* originalPortKeys = [oscParameters map:^(id port){ return [port objectForKey:BBOSCPortKey]; }];
  123 +
  124 + [self willChangeValueForKey:@"oscParameters"];
  125 + [oscParameters release];
  126 + oscParameters = [params retain];
  127 + [self didChangeValueForKey:@"oscParameters"];
  128 +
  129 + // Bleh, just trash all the original input ports
  130 + for(NSString* portKey in originalPortKeys) {
  131 + [self removeOutputPortForKey:portKey];
  132 + }
  133 +
  134 + for(NSDictionary* port in oscParameters) {
  135 + NSString* key = [port objectForKey:BBOSCPortKey];
  136 + NSNumber* oscType = [port objectForKey:BBOSCTypeKey];
  137 + NSString* name = [NSString stringWithFormat:@"OSC-%@", [[BBOSCTypeToStringTransformer transformer] transformedValue:oscType]];
  138 + NSDictionary* attributes = [NSDictionary dictionaryWithObjectsAndKeys:name, QCPortAttributeNameKey, nil];
  139 +
  140 + [self addOutputPortWithType:QCTypeForOSCType([oscType intValue]) forKey:key withAttributes:attributes];
  141 + }
  142 +}
  143 +
  144 +
87 145 - (void) receivedOSCMessage:(OSCMessage *)m {
88   - // TODO : Needs to be thread safe
89   - if ([[m address] isEqualToString:@"/test"]) {
90   - [messageLock lock];
  146 + [messageLock lock];
  147 + if ([[m address] hasPrefix:self.listeningPath]) {
91 148 [messages addObject:m];
92   - [messageLock unlock];
93 149 }
  150 + [messageLock unlock];
94 151 }
95 152 @end
96 153
@@ -102,7 +159,6 @@ - (BOOL) startExecution:(id<QCPlugInContext>)context
102 159 Called by Quartz Composer when rendering of the composition starts: perform any required setup for the plug-in.
103 160 Return NO in case of fatal failure (this will prevent rendering of the composition to start).
104 161 */
105   - oscPort = [[oscManager createNewInputForPort:60000 withLabel:@"BB OSC"] retain];
106 162 return YES;
107 163 }
108 164
@@ -124,31 +180,40 @@ Return NO in case of failure during the execution (this will prevent rendering o
124 180 CGLContextObj cgl_ctx = [context CGLContextObj];
125 181 */
126 182
  183 + if ([self didValueForInputKeyChange:@"inputReceivingPort"]) {
  184 + if (self.oscPort)
  185 + [self.oscManager removeInput:self.oscPort];
  186 + self.oscPort = [self.oscManager createNewInputForPort:self.inputReceivingPort withLabel:@"BB OSC"];
  187 + }
  188 +
  189 + if ([self didValueForInputKeyChange:@"inputReceivingPath"]) {
  190 + [messageLock lock];
  191 + self.listeningPath = self.inputReceivingPath;
  192 + [messages removeAllObjects];
  193 + [messageLock unlock];
  194 + }
  195 +
127 196 [messageLock lock];
128   - if ([messages count]>0) {
  197 + if ([messages count]==0) {
  198 + self.outputMessageReceived = NO;
  199 + } else {
  200 + self.outputMessageReceived = YES;
  201 +
129 202 OSCMessage* message = [messages objectAtIndex:0];
130   - NSLog(@"Yay %@", message);
131   - NSMutableArray* messageContent = [NSMutableArray array];
132   - for(OSCValue* oscValue in [message valueArray]) {
133   - switch (oscValue.type) {
134   - case OSCValInt:
135   - [messageContent addObject:[NSNumber numberWithInt:[oscValue intValue]]];
136   - break;
137   - case OSCValFloat:
138   - [messageContent addObject:[NSNumber numberWithFloat:[oscValue floatValue]]];
139   - break;
140   - case OSCValString:
141   - [messageContent addObject:[oscValue stringValue]];
142   - break;
143   - case OSCValBool:
144   - [messageContent addObject:[NSNumber numberWithBool:[oscValue boolValue]]];
145   - break;
146   - default:
147   - NSLog(@"Ignoring object value %@", oscValue);
148   - break;
149   - }
  203 +
  204 + NSUInteger valueIndex=0;
  205 + for(NSDictionary* port in oscParameters) {
  206 + BBOSCType expectedType = [[port objectForKey:BBOSCTypeKey] intValue];
  207 + NSString* portKey = [port objectForKey:BBOSCPortKey];
  208 +
  209 + id outputValue = [message readNSValueFromPosition:&valueIndex withBias:expectedType];
  210 + // Grr, no assigning arrays to QCStructures. rdar://5672284
  211 + if ([outputValue isKindOfClass:[NSArray class]])
  212 + outputValue = [outputValue qcStructure];
  213 +
  214 + [self setValue:outputValue forOutputKey:portKey];
150 215 }
151   - self.outputStructure = messageContent;
  216 +
152 217 [messages removeObjectAtIndex:0];
153 218 }
154 219 [messageLock unlock];
2  NSArrayExtensions.h
@@ -11,4 +11,6 @@
11 11
12 12 @interface NSArray(BBExtensions)
13 13 - (NSArray *)map: (id (^)(id obj))block;
  14 +- (NSArray *)select: (BOOL (^)(id obj))block;
  15 +-(NSDictionary*)qcStructure;
14 16 @end
9 NSArrayExtensions.m
@@ -33,4 +33,13 @@ - (NSArray *)select: (BOOL (^)(id obj))block
33 33 }
34 34 return new;
35 35 }
  36 +
  37 +-(NSDictionary*)qcStructure {
  38 + int i=0;
  39 + NSMutableDictionary* result = [NSMutableDictionary dictionary];
  40 + for(id object in self) {
  41 + [result setObject:object forKey:[NSNumber numberWithInt:i++]];
  42 + }
  43 + return result;
  44 +}
36 45 @end
16 OSCExtensions.h
... ... @@ -0,0 +1,16 @@
  1 +//
  2 +// OSCExtensions.h
  3 +// BBOSC
  4 +//
  5 +// Created by Jonathan del Strother on 09/09/2009.
  6 +// Copyright 2009 Best Before Media Ltd. All rights reserved.
  7 +//
  8 +
  9 +#import <Cocoa/Cocoa.h>
  10 +#import "vvosc/FrameworkSrc/VVOSC.h"
  11 +#import "BBOSCViewController.h"
  12 +
  13 +@interface OSCMessage(BBExtensions)
  14 +-(void)addNSValue:(id)newValue withBias:(BBOSCType)bias;
  15 +-(id)readNSValueFromPosition:(NSUInteger*)pos withBias:(BBOSCType)bias; // Returns an NS object from the value at *pos. Increments *pos by the number of positions it ends up reading
  16 +@end
84 OSCExtensions.m
... ... @@ -0,0 +1,84 @@
  1 +//
  2 +// OSCExtensions.m
  3 +// BBOSC
  4 +//
  5 +// Created by Jonathan del Strother on 09/09/2009.
  6 +// Copyright 2009 Best Before Media Ltd. All rights reserved.
  7 +//
  8 +
  9 +#import "OSCExtensions.h"
  10 +
  11 +@implementation OSCMessage(BBExtensions)
  12 +-(void)addNSValue:(id)newValue withBias:(BBOSCType)bias {
  13 +
  14 + if ([newValue isKindOfClass:[NSString class]]) {
  15 + [self addString:newValue];
  16 +
  17 + } else if ([newValue isKindOfClass:[NSNumber class]]) {
  18 + switch(bias) {
  19 + case BBOSCTypeBool:
  20 + [self addBOOL:[newValue boolValue]];
  21 + break;
  22 + case BBOSCTypeInt:
  23 + [self addInt:[newValue intValue]];
  24 + break;
  25 + case BBOSCTypeFloat:
  26 + [self addFloat:[newValue floatValue]];
  27 + break;
  28 + default:
  29 + NSAssert2(NO, @"Bad type %d for %@", bias, newValue);
  30 + }
  31 +
  32 + } else if ([newValue isKindOfClass:[NSArray class]]) {
  33 + NSAssert2(bias>=BBOSCTypeArrayOfInt && bias<=BBOSCTypeArrayOfBool, @"Unexpected value %@ for type %d", newValue, bias);
  34 + // We've got an array - add all the subvalues into the message, using the appropriate type (eg if we're using BBOSCTypeArrayOfFloat, subvalues should use BBOSCTypeFloat)
  35 + for(id subvalue in newValue) {
  36 + [self addNSValue:subvalue withBias:bias-4];
  37 + }
  38 +
  39 + } else {
  40 + [self addBOOL:!!newValue];
  41 + }
  42 +}
  43 +
  44 +-(id)readNSValueFromPosition:(NSUInteger*)pos withBias:(BBOSCType)bias {
  45 +
  46 + if (bias >= BBOSCTypeArrayOfInt) {
  47 + NSMutableArray* result = [NSMutableArray array];
  48 + while(*pos<self.valueCount) {
  49 + id subvalue = [self readNSValueFromPosition:pos withBias:bias-4];
  50 + if (!subvalue)
  51 + break;
  52 + [result addObject:subvalue];
  53 + }
  54 + return result;
  55 + }
  56 +
  57 + id outputValue = nil;
  58 +
  59 + OSCValue* oscValue;
  60 + if (*pos >= self.valueCount)
  61 + oscValue = nil;
  62 + else if (self.valueCount==1 && *pos==0)
  63 + oscValue = [self value];
  64 + else
  65 + oscValue = [self valueAtIndex:*pos];
  66 + (*pos)++;
  67 +
  68 + switch (bias) {
  69 + case BBOSCTypeBool:
  70 + outputValue = [NSNumber numberWithBool:[oscValue boolValue]];
  71 + break;
  72 + case BBOSCTypeInt:
  73 + outputValue = [NSNumber numberWithInt:[oscValue intValue]];
  74 + break;
  75 + case BBOSCTypeFloat:
  76 + outputValue = [NSNumber numberWithFloat:[oscValue floatValue]];
  77 + break;
  78 + case BBOSCTypeString:
  79 + outputValue = [oscValue stringValue];
  80 + break;
  81 + }
  82 + return outputValue;
  83 +}
  84 +@end

0 comments on commit 122a135

Please sign in to comment.
Something went wrong with that request. Please try again.