xshige & Radio Junk Box's OSCReceiver modded version(#define INPUT_PORT >> extern) http://mbed.org/users/radiojunkbox/code/KAMUI_OSC-CV_Example/ http://mbed.org/users/xshige/programs/OSCReceiver/
OSCReceiver.cpp@3:ff3e4aee583e, 2016-02-25 (annotated)
- Committer:
- casiotone401
- Date:
- Thu Feb 25 11:21:14 2016 +0000
- Revision:
- 3:ff3e4aee583e
- Parent:
- 2:6dab18e1eb37
minor change
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
casiotone401 | 0:4ce7c0ce6a66 | 1 | // |
casiotone401 | 0:4ce7c0ce6a66 | 2 | // OSC Receiver |
casiotone401 | 0:4ce7c0ce6a66 | 3 | // |
casiotone401 | 0:4ce7c0ce6a66 | 4 | // date: 2011/1/10 |
casiotone401 | 0:4ce7c0ce6a66 | 5 | // version: 0.7 |
casiotone401 | 0:4ce7c0ce6a66 | 6 | // written by: xshige |
casiotone401 | 0:4ce7c0ce6a66 | 7 | // |
casiotone401 | 0:4ce7c0ce6a66 | 8 | // please find OSC Sender program at the bottom of this file |
casiotone401 | 0:4ce7c0ce6a66 | 9 | // |
casiotone401 | 0:4ce7c0ce6a66 | 10 | /* |
casiotone401 | 0:4ce7c0ce6a66 | 11 | The followings are supported: |
casiotone401 | 0:4ce7c0ce6a66 | 12 | |
casiotone401 | 0:4ce7c0ce6a66 | 13 | Transport Type: |
casiotone401 | 0:4ce7c0ce6a66 | 14 | UDP |
casiotone401 | 0:4ce7c0ce6a66 | 15 | |
casiotone401 | 0:4ce7c0ce6a66 | 16 | Features: |
casiotone401 | 0:4ce7c0ce6a66 | 17 | Packet Parsing (Client) |
casiotone401 | 0:4ce7c0ce6a66 | 18 | Not Supported:Packet Construction (Server) |
casiotone401 | 0:4ce7c0ce6a66 | 19 | Bundle NOT Support |
casiotone401 | 0:4ce7c0ce6a66 | 20 | Timetag NOT Support |
casiotone401 | 0:4ce7c0ce6a66 | 21 | |
casiotone401 | 0:4ce7c0ce6a66 | 22 | Type Support: |
casiotone401 | 0:4ce7c0ce6a66 | 23 | i: int32 |
casiotone401 | 0:4ce7c0ce6a66 | 24 | b: blob |
casiotone401 | 0:4ce7c0ce6a66 | 25 | s: string |
casiotone401 | 0:4ce7c0ce6a66 | 26 | f: float32 |
casiotone401 | 0:4ce7c0ce6a66 | 27 | m: MIDI message(port id, status byte, data1, data2) // I don't know the detail |
casiotone401 | 0:4ce7c0ce6a66 | 28 | |
casiotone401 | 0:4ce7c0ce6a66 | 29 | */ |
casiotone401 | 1:3d6dc580b565 | 30 | |
casiotone401 | 2:6dab18e1eb37 | 31 | #pragma O3 |
casiotone401 | 2:6dab18e1eb37 | 32 | #pragma Otime |
casiotone401 | 2:6dab18e1eb37 | 33 | |
casiotone401 | 0:4ce7c0ce6a66 | 34 | #include "mbed.h" |
casiotone401 | 0:4ce7c0ce6a66 | 35 | #include "OSCReceiver.h" // Add by RadioJunkBox 2012/05/16 |
casiotone401 | 1:3d6dc580b565 | 36 | |
casiotone401 | 2:6dab18e1eb37 | 37 | inline int getOSCmsg(char , union OSCarg); |
casiotone401 | 2:6dab18e1eb37 | 38 | inline size_t strlength(const char *); |
casiotone401 | 2:6dab18e1eb37 | 39 | |
casiotone401 | 2:6dab18e1eb37 | 40 | size_t strlength(const char *s) |
casiotone401 | 2:6dab18e1eb37 | 41 | { |
casiotone401 | 2:6dab18e1eb37 | 42 | size_t len = 0; |
casiotone401 | 1:3d6dc580b565 | 43 | |
casiotone401 | 2:6dab18e1eb37 | 44 | for(;;) |
casiotone401 | 2:6dab18e1eb37 | 45 | { |
casiotone401 | 2:6dab18e1eb37 | 46 | unsigned x = *(unsigned*)s; |
casiotone401 | 2:6dab18e1eb37 | 47 | if((x & 0xFF) == 0) return len; |
casiotone401 | 2:6dab18e1eb37 | 48 | if((x & 0xFF00) == 0) return len + 1; |
casiotone401 | 2:6dab18e1eb37 | 49 | if((x & 0xFF0000) == 0) return len + 2; |
casiotone401 | 2:6dab18e1eb37 | 50 | if((x & 0xFF000000) == 0) return len + 3; |
casiotone401 | 2:6dab18e1eb37 | 51 | s += 4, len += 4; |
casiotone401 | 2:6dab18e1eb37 | 52 | } |
casiotone401 | 2:6dab18e1eb37 | 53 | } |
casiotone401 | 2:6dab18e1eb37 | 54 | |
casiotone401 | 3:ff3e4aee583e | 55 | int getOSCmsg(const char *packet, union OSCarg *msg) |
casiotone401 | 2:6dab18e1eb37 | 56 | { |
casiotone401 | 0:4ce7c0ce6a66 | 57 | // Caution: the returned result points to packet as blobs or strings (not newly allocatd) |
casiotone401 | 2:6dab18e1eb37 | 58 | char *p, *typeTag; |
casiotone401 | 3:ff3e4aee583e | 59 | uint8_t n, str1 = 0; |
casiotone401 | 2:6dab18e1eb37 | 60 | |
casiotone401 | 2:6dab18e1eb37 | 61 | if(packet[0] != '/') |
casiotone401 | 2:6dab18e1eb37 | 62 | { |
casiotone401 | 2:6dab18e1eb37 | 63 | return -1; |
casiotone401 | 2:6dab18e1eb37 | 64 | } |
casiotone401 | 2:6dab18e1eb37 | 65 | |
casiotone401 | 0:4ce7c0ce6a66 | 66 | msg[0].address = packet; // address |
casiotone401 | 3:ff3e4aee583e | 67 | msg[1].typeTag = packet + (((strlength(msg[0].s) >> 2) + 1) << 2);//typeTag |
casiotone401 | 3:ff3e4aee583e | 68 | typeTag = msg[1].s + 1; // skip ',' |
casiotone401 | 3:ff3e4aee583e | 69 | p = msg[1].s + (((strlength(msg[1].s) >> 2) + 1) << 2); |
casiotone401 | 1:3d6dc580b565 | 70 | |
casiotone401 | 2:6dab18e1eb37 | 71 | str1 = strlength(typeTag); |
casiotone401 | 3:ff3e4aee583e | 72 | |
casiotone401 | 3:ff3e4aee583e | 73 | for(n = 0; n < str1; ++n) |
casiotone401 | 1:3d6dc580b565 | 74 | { |
casiotone401 | 3:ff3e4aee583e | 75 | switch (typeTag[n]) |
casiotone401 | 2:6dab18e1eb37 | 76 | { |
casiotone401 | 3:ff3e4aee583e | 77 | case 's': |
casiotone401 | 3:ff3e4aee583e | 78 | msg[n+2].s = p; |
casiotone401 | 3:ff3e4aee583e | 79 | p += (((strlength(msg[n+2].s) >> 2) + 1) << 2); |
casiotone401 | 3:ff3e4aee583e | 80 | break; |
casiotone401 | 3:ff3e4aee583e | 81 | |
casiotone401 | 3:ff3e4aee583e | 82 | case 'i': |
casiotone401 | 3:ff3e4aee583e | 83 | case 'f': |
casiotone401 | 3:ff3e4aee583e | 84 | // chang endian (big to little) |
casiotone401 | 3:ff3e4aee583e | 85 | msg[n+2]._b[3] = p[0]; |
casiotone401 | 3:ff3e4aee583e | 86 | msg[n+2]._b[2] = p[1]; |
casiotone401 | 3:ff3e4aee583e | 87 | msg[n+2]._b[1] = p[2]; |
casiotone401 | 3:ff3e4aee583e | 88 | msg[n+2]._b[0] = p[3]; |
casiotone401 | 3:ff3e4aee583e | 89 | |
casiotone401 | 3:ff3e4aee583e | 90 | p += 4; |
casiotone401 | 3:ff3e4aee583e | 91 | break; |
casiotone401 | 3:ff3e4aee583e | 92 | |
casiotone401 | 3:ff3e4aee583e | 93 | case 'b': |
casiotone401 | 3:ff3e4aee583e | 94 | // chang endian (big to little) |
casiotone401 | 3:ff3e4aee583e | 95 | // get lenth of blog (copy to msg[n].blog.len) |
casiotone401 | 3:ff3e4aee583e | 96 | msg[n+2]._b[3] = p[0]; |
casiotone401 | 3:ff3e4aee583e | 97 | msg[n+2]._b[2] = p[1]; |
casiotone401 | 3:ff3e4aee583e | 98 | msg[n+2]._b[1] = p[2]; |
casiotone401 | 3:ff3e4aee583e | 99 | msg[n+2]._b[0] = p[3]; |
casiotone401 | 3:ff3e4aee583e | 100 | |
casiotone401 | 3:ff3e4aee583e | 101 | p += 4; |
casiotone401 | 3:ff3e4aee583e | 102 | // get ponter of blog (copy to msg[n].blog.p) |
casiotone401 | 3:ff3e4aee583e | 103 | msg[n+2].blob.p = p; |
casiotone401 | 3:ff3e4aee583e | 104 | |
casiotone401 | 3:ff3e4aee583e | 105 | p += (((msg[n+2].blob.len >> 2) + 1) << 2); |
casiotone401 | 3:ff3e4aee583e | 106 | break; |
casiotone401 | 3:ff3e4aee583e | 107 | |
casiotone401 | 3:ff3e4aee583e | 108 | case 'm': |
casiotone401 | 3:ff3e4aee583e | 109 | // get midi data (copy to msg[n].m[]) |
casiotone401 | 3:ff3e4aee583e | 110 | msg[n+2].m[0] = p[0]; |
casiotone401 | 3:ff3e4aee583e | 111 | msg[n+2].m[1] = p[1]; |
casiotone401 | 3:ff3e4aee583e | 112 | msg[n+2].m[2] = p[2]; |
casiotone401 | 3:ff3e4aee583e | 113 | msg[n+2].m[3] = p[3]; |
casiotone401 | 3:ff3e4aee583e | 114 | |
casiotone401 | 3:ff3e4aee583e | 115 | p += 4; |
casiotone401 | 3:ff3e4aee583e | 116 | break; |
casiotone401 | 1:3d6dc580b565 | 117 | |
casiotone401 | 3:ff3e4aee583e | 118 | default: |
casiotone401 | 3:ff3e4aee583e | 119 | return -1; |
casiotone401 | 1:3d6dc580b565 | 120 | |
casiotone401 | 0:4ce7c0ce6a66 | 121 | } |
casiotone401 | 0:4ce7c0ce6a66 | 122 | }; |
casiotone401 | 0:4ce7c0ce6a66 | 123 | |
casiotone401 | 1:3d6dc580b565 | 124 | return 1; |
casiotone401 | 2:6dab18e1eb37 | 125 | } |