diff --git a/LiveOSCQueryHelper/Info.plist b/LiveOSCQueryHelper/Info.plist index ffaf7fe..7827194 100644 --- a/LiveOSCQueryHelper/Info.plist +++ b/LiveOSCQueryHelper/Info.plist @@ -44,7 +44,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/MIDIOSCQueryHelper/Info.plist b/MIDIOSCQueryHelper/Info.plist index 97580bf..556e73a 100644 --- a/MIDIOSCQueryHelper/Info.plist +++ b/MIDIOSCQueryHelper/Info.plist @@ -34,7 +34,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/OSCQueryHelper/Info.plist b/OSCQueryHelper/Info.plist index da0f1ae..4ed6795 100644 --- a/OSCQueryHelper/Info.plist +++ b/OSCQueryHelper/Info.plist @@ -36,7 +36,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/VVOSCQueryBrowser/Info.plist b/VVOSCQueryBrowser/Info.plist index 2770d77..ab597ea 100644 --- a/VVOSCQueryBrowser/Info.plist +++ b/VVOSCQueryBrowser/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/VVOSCQueryClient/Base.lproj/MainMenu.xib b/VVOSCQueryClient/Base.lproj/MainMenu.xib index 8daeb96..25f789e 100644 --- a/VVOSCQueryClient/Base.lproj/MainMenu.xib +++ b/VVOSCQueryClient/Base.lproj/MainMenu.xib @@ -684,24 +684,25 @@ - + - - + + + - - + + - + - + - + @@ -713,35 +714,22 @@ - + - - + + + + - + diff --git a/VVOSCQueryClient/Info.plist b/VVOSCQueryClient/Info.plist index 2770d77..ab597ea 100644 --- a/VVOSCQueryClient/Info.plist +++ b/VVOSCQueryClient/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/VVOSCQueryProtocol.xcodeproj/xcshareddata/xcschemes/All Apps.xcscheme b/VVOSCQueryProtocol.xcodeproj/xcshareddata/xcschemes/All Apps.xcscheme index de5e71d..2eef8eb 100644 --- a/VVOSCQueryProtocol.xcodeproj/xcshareddata/xcschemes/All Apps.xcscheme +++ b/VVOSCQueryProtocol.xcodeproj/xcshareddata/xcschemes/All Apps.xcscheme @@ -34,7 +34,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/VVOSCQueryServer/Base.lproj/MainMenu.xib b/VVOSCQueryServer/Base.lproj/MainMenu.xib index 178a370..7cd068e 100644 --- a/VVOSCQueryServer/Base.lproj/MainMenu.xib +++ b/VVOSCQueryServer/Base.lproj/MainMenu.xib @@ -686,15 +686,15 @@ - + - - - + + + - - + + @@ -702,8 +702,8 @@ - - + + @@ -711,45 +711,8 @@ - - - - - - This is a simple test server to demonstrate the OSC query protocol. It creates a simple OSC address space with a variety of different argument types, and uses the query protocol to advertise the OSC address space's existence and details. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -757,8 +720,8 @@ - - + + @@ -766,8 +729,8 @@ - - + + @@ -778,8 +741,8 @@ - - + + + + + + This app is for developers. + +This is a simple test server to demonstrate the OSC query protocol. It creates a small OSC address space with a variety of different argument types, and uses the query protocol to advertise the OSC address space's existence and details. This app supports bidirectional streaming- if a client sends a message to any node in the server's address space, that message is echoed out to all clients connected to the server. + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/VVOSCQueryServer/Info.plist b/VVOSCQueryServer/Info.plist index 2770d77..ab597ea 100644 --- a/VVOSCQueryServer/Info.plist +++ b/VVOSCQueryServer/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.2 + 0.3 CFBundleVersion 1 LSMinimumSystemVersion diff --git a/VVOSCQueryServer/OSCQueryProtocolServerAppDelegate.m b/VVOSCQueryServer/OSCQueryProtocolServerAppDelegate.m index fb35f02..622066a 100644 --- a/VVOSCQueryServer/OSCQueryProtocolServerAppDelegate.m +++ b/VVOSCQueryServer/OSCQueryProtocolServerAppDelegate.m @@ -9,6 +9,7 @@ @interface OSCQueryProtocolServerAppDelegate () @property (weak) IBOutlet NSWindow *window; - (void) _updateUIItems; - (void) populateOSCAddressSpace; +- (void) populateStreamingDirectory; - (void) populateTestDirectory; - (void) populateVecsDirectory; - (void) populateTuplesDirectory; @@ -133,6 +134,13 @@ - (IBAction) sliderUsed:(id)sender { msg = [OSCMessage createWithAddress:@"/test/dingus"]; [msg addFloat:(float)tmpVal]; [[OSCAddressSpace mainAddressSpace] dispatchMessage:msg]; + + NSLog(@"\t\tsending %@",msg); + OSCPacket *packet = [OSCPacket createWithContent:msg]; + [server + listenerNeedsToSendOSCData:[packet payload] + sized:[packet bufferLength] + fromOSCAddress:[msg address]]; } - (IBAction) renameButtonUsed:(id)sender { NSLog(@"%s",__func__); @@ -321,10 +329,10 @@ - (void) receivedOSCMessage:(OSCMessage *)m { //NSLog(@"%s ... %@",__func__,m); if (m==nil) return; - // just pass the message to the OSC address space + // pass the message to the OSC address space right away [_mainVVOSCAddressSpace dispatchMessage:m]; - + // create a new string, populate it with all the received messages in the array NSMutableString *tmpStr = [[NSMutableString alloc] init]; @synchronized (self) { [rxOSCMsgs addObject:m]; @@ -334,7 +342,7 @@ - (void) receivedOSCMessage:(OSCMessage *)m { for (OSCMessage *msg in [rxOSCMsgs reverseObjectEnumerator]) [tmpStr appendFormat:@"%@\n",[msg description]]; } - + // update the contents of the text view dispatch_async(dispatch_get_main_queue(), ^{ [rxOSCMessageView setString:tmpStr]; }); @@ -345,122 +353,133 @@ - (void) receivedOSCMessage:(OSCMessage *)m { - (void) populateOSCAddressSpace { + //[self populateStreamingDirectory]; [self populateTestDirectory]; - [self populateVecsDirectory]; - [self populateTuplesDirectory]; + //[self populateVecsDirectory]; + //[self populateTuplesDirectory]; +} +- (void) populateStreamingDirectory { + OSCAddressSpace *as = [OSCAddressSpace mainAddressSpace]; + OSCNode *tmpNode = nil; + tmpNode = [as findNodeForAddress:@"/floatInput" createIfMissing:YES]; + [tmpNode setNodeType:OSCNodeDirectory]; + [tmpNode setOSCDescription:@"Float input that echoes values back out to all connected clients using the OSC Query Protocol's bidirectional streaming"]; + [tmpNode setTypeTagString:@"f"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min: @0.0, kVVOSCQ_OptAttr_Range_Max: @100.0 } ]]; } - (void) populateTestDirectory { OSCAddressSpace *as = [OSCAddressSpace mainAddressSpace]; - OSCNode *tmpNode = nil; - // first make the "test" directory node (this will be created automatically if necessary, only fetching it as a discrete step here so we can set its description) - tmpNode = [as findNodeForAddress:@"/test" createIfMissing:YES]; - [tmpNode setNodeType:OSCNodeDirectory]; - [tmpNode setOSCDescription:@"test directory"]; - - // now make a bunch of other OSC nodes - tmpNode = [as findNodeForAddress:@"/test/my_int" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test integer node"]; - [tmpNode setTypeTagString:@"i"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0, kVVOSCQ_OptAttr_Range_Max:@100 } ]]; - [tmpNode setTags:@[ @"integer input" ]]; - [tmpNode setClipmode:@[ @"none" ]]; - [tmpNode setUnits:@[ @"dollars" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_float" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test float node"]; - [tmpNode setTypeTagString:@"f"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0., kVVOSCQ_OptAttr_Range_Max:@100. } ]]; - [tmpNode setTags:@[ @"float input" ]]; - [tmpNode setClipmode:@[ @"none" ]]; - [tmpNode setUnits:@[ @"percent" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_string" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeString]; - [tmpNode setOSCDescription:@"test string node"]; - [tmpNode setTypeTagString:@"s"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"string input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/timetag" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test timetag node"]; - [tmpNode setTypeTagString:@"t"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"timetag input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_longlong" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test 64-bit int node"]; - [tmpNode setTypeTagString:@"h"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0, kVVOSCQ_OptAttr_Range_Max:@100 } ]]; - [tmpNode setTags:@[ @"64-bit integer input" ]]; - [tmpNode setClipmode:@[ @"none" ]]; - [tmpNode setUnits:@[ @"big numbers" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_double" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test double node"]; - [tmpNode setTypeTagString:@"d"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0., kVVOSCQ_OptAttr_Range_Max:@100. } ]]; - [tmpNode setTags:@[ @"double input" ]]; - [tmpNode setClipmode:@[ @"none" ]]; - [tmpNode setUnits:@[ @"precise unit" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_char" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeString]; - [tmpNode setOSCDescription:@"test character node"]; - [tmpNode setTypeTagString:@"c"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"character input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_color" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeColor]; - [tmpNode setOSCDescription:@"test color node"]; - [tmpNode setTypeTagString:@"r"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"color input" ]]; - [tmpNode setUnits:@[ @"RGBA" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_midi" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test MIDI node"]; - [tmpNode setTypeTagString:@"m"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"midi input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_true" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test true node"]; - [tmpNode setTypeTagString:@"T"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"true input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_false" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test false node"]; - [tmpNode setTypeTagString:@"F"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"false input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_null" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test null node"]; - [tmpNode setTypeTagString:@"N"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"null input" ]]; - - tmpNode = [as findNodeForAddress:@"/test/my_infinity" createIfMissing:YES]; - //[tmpNode setNodeType:OSCNodeTypeNumber]; - [tmpNode setOSCDescription:@"test infinity node"]; - [tmpNode setTypeTagString:@"I"]; - [tmpNode setAccess:OSCNodeAccess_RW]; - [tmpNode setTags:@[ @"infinity input" ]]; + OSCNode *tmpNode = nil; + // first make the "test" directory node (this will be created automatically if necessary, only fetching it as a discrete step here so we can set its description) + tmpNode = [as findNodeForAddress:@"/test" createIfMissing:YES]; + [tmpNode setNodeType:OSCNodeDirectory]; + [tmpNode setOSCDescription:@"test directory"]; + + // now make a bunch of other OSC nodes + tmpNode = [as findNodeForAddress:@"/test/my_int" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test integer node"]; + [tmpNode setTypeTagString:@"i"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0, kVVOSCQ_OptAttr_Range_Max:@100 } ]]; + [tmpNode setTags:@[ @"integer input" ]]; + [tmpNode setClipmode:@[ @"none" ]]; + [tmpNode setUnits:@[ @"dollars" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_float" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test float node"]; + [tmpNode setTypeTagString:@"f"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0., kVVOSCQ_OptAttr_Range_Max:@100. } ]]; + [tmpNode setTags:@[ @"float input" ]]; + [tmpNode setClipmode:@[ @"none" ]]; + [tmpNode setUnits:@[ @"percent" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_string" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeString]; + [tmpNode setOSCDescription:@"test string node"]; + [tmpNode setTypeTagString:@"s"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"string input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/timetag" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test timetag node"]; + [tmpNode setTypeTagString:@"t"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"timetag input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_longlong" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test 64-bit int node"]; + [tmpNode setTypeTagString:@"h"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0, kVVOSCQ_OptAttr_Range_Max:@100 } ]]; + [tmpNode setTags:@[ @"64-bit integer input" ]]; + [tmpNode setClipmode:@[ @"none" ]]; + [tmpNode setUnits:@[ @"big numbers" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_double" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test double node"]; + [tmpNode setTypeTagString:@"d"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setRange:@[ @{ kVVOSCQ_OptAttr_Range_Min:@0., kVVOSCQ_OptAttr_Range_Max:@100. } ]]; + [tmpNode setTags:@[ @"double input" ]]; + [tmpNode setClipmode:@[ @"none" ]]; + [tmpNode setUnits:@[ @"precise unit" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_char" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeString]; + [tmpNode setOSCDescription:@"test character node"]; + [tmpNode setTypeTagString:@"c"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"character input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_color" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeColor]; + [tmpNode setOSCDescription:@"test color node"]; + [tmpNode setTypeTagString:@"r"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"color input" ]]; + [tmpNode setUnits:@[ @"RGBA" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_midi" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test MIDI node"]; + [tmpNode setTypeTagString:@"m"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"midi input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_true" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test true node"]; + [tmpNode setTypeTagString:@"T"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"true input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_false" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test false node"]; + [tmpNode setTypeTagString:@"F"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"false input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_null" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test null node"]; + [tmpNode setTypeTagString:@"N"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"null input" ]]; + + tmpNode = [as findNodeForAddress:@"/test/my_infinity" createIfMissing:YES]; + //[tmpNode setNodeType:OSCNodeTypeNumber]; + [tmpNode setOSCDescription:@"test infinity node"]; + [tmpNode setTypeTagString:@"I"]; + [tmpNode setAccess:OSCNodeAccess_RW]; + [tmpNode setTags:@[ @"infinity input" ]]; } - (void) populateVecsDirectory {