fast_osc 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,269 @@
1
+ /*
2
+ * Copyright (c) 2012 Mark McCurry
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a
5
+ * copy of this software and associated documentation files (the "Software"),
6
+ * to deal in the Software without restriction, including without limitation
7
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
+ * and/or sell copies of the Software, and to permit persons to whom the
9
+ * Software is furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice (including the next
12
+ * paragraph) shall be included in all copies or substantial portions of the
13
+ * Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
+ * DEALINGS IN THE SOFTWARE.
23
+ *
24
+ * @file rtosc.h
25
+ */
26
+ #ifndef RTOSC_H
27
+ #define RTOSC_H
28
+ #include <stdarg.h>
29
+ #include <stdint.h>
30
+ #include <stddef.h>
31
+ #include <stdbool.h>
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif
36
+
37
+ typedef struct {
38
+ int32_t len;
39
+ uint8_t *data;
40
+ } rtosc_blob_t;
41
+
42
+ typedef union {
43
+ int32_t i; //i,c,r
44
+ char T; //I,T,F,N
45
+ float f; //f
46
+ double d; //d
47
+ int64_t h; //h
48
+ uint64_t t; //t
49
+ uint8_t m[4];//m
50
+ const char *s; //s,S
51
+ rtosc_blob_t b; //b
52
+ } rtosc_arg_t;
53
+
54
+ /**
55
+ * Write OSC message to fixed length buffer
56
+ *
57
+ * On error, buffer will be zeroed.
58
+ * When buffer is NULL, the function returns the size of the buffer required to
59
+ * store the message
60
+ *
61
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62
+ * //Example messages
63
+ * char buffer[128];
64
+ * rtosc_message(buffer,128,"/path","TFI");
65
+ * rtosc_message(buffer,128,"/path","s","foobar");
66
+ * rtosc_message(buffer,128,"/path","i",128);
67
+ * rtosc_message(buffer,128,"/path","f",128.0);
68
+ * const char blob[4] = {'a','b','c','d'};
69
+ * rtosc_message(buffer,128,"/path","b",4,blob);
70
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71
+ *
72
+ * @param buffer Memory to write to
73
+ * @param len Length of buffer
74
+ * @param address OSC pattern to send message to
75
+ * @param arguments String consisting of the types of the following arguments
76
+ * @param ... OSC arguments to pass forward
77
+ * @returns length of resulting message or zero if bounds exceeded
78
+ */
79
+ size_t rtosc_message(char *buffer,
80
+ size_t len,
81
+ const char *address,
82
+ const char *arguments,
83
+ ...);
84
+
85
+ /**
86
+ * @see rtosc_message()
87
+ */
88
+ size_t rtosc_vmessage(char *buffer,
89
+ size_t len,
90
+ const char *address,
91
+ const char *arguments,
92
+ va_list va);
93
+
94
+ /**
95
+ * @see rtosc_message()
96
+ */
97
+ size_t rtosc_amessage(char *buffer,
98
+ size_t len,
99
+ const char *address,
100
+ const char *arguments,
101
+ const rtosc_arg_t *args);
102
+
103
+ /**
104
+ * Returns the number of arguments found in a given message
105
+ *
106
+ * @param msg well formed OSC message
107
+ * @returns number of arguments in message
108
+ */
109
+ unsigned rtosc_narguments(const char *msg);
110
+
111
+ /**
112
+ * @param msg well formed OSC message
113
+ * @param i index of argument
114
+ * @returns the type of the ith argument in msg
115
+ */
116
+ char rtosc_type(const char *msg, unsigned i);
117
+
118
+ typedef struct {
119
+ const char *type_pos;
120
+ const uint8_t *value_pos;
121
+ } rtosc_arg_itr_t;
122
+
123
+ typedef struct {
124
+ char type;
125
+ rtosc_arg_t val;
126
+ } rtosc_arg_val_t;
127
+
128
+ /**
129
+ * Create an argument iterator for a message
130
+ * @param msg OSC message
131
+ * @returns an initialized iterator
132
+ */
133
+ rtosc_arg_itr_t rtosc_itr_begin(const char *msg);
134
+
135
+ /**
136
+ * Gets the next argument in a message
137
+ * @param itr OSC message iterator
138
+ * @returns a type value pair from the message
139
+ */
140
+ rtosc_arg_val_t rtosc_itr_next(rtosc_arg_itr_t *itr);
141
+
142
+ /**
143
+ * Determines if the iterator is at the end of the argument list
144
+ * @param itr OSC message iterator
145
+ * @returns 1 if there are no more elements, 0 otherwise
146
+ */
147
+ int rtosc_itr_end(rtosc_arg_itr_t itr);
148
+
149
+ /**
150
+ * Blob data may be safely written to
151
+ * @param msg OSC message
152
+ * @param i index of argument
153
+ * @returns an argument by value via the rtosc_arg_t union
154
+ */
155
+ rtosc_arg_t rtosc_argument(const char *msg, unsigned i);
156
+
157
+ /**
158
+ * @param msg OSC message
159
+ * @param len Message length upper bound
160
+ * @returns the size of a message given a chunk of memory.
161
+ */
162
+ size_t rtosc_message_length(const char *msg, size_t len);
163
+
164
+ typedef struct {
165
+ char *data;
166
+ size_t len;
167
+ } ring_t;
168
+
169
+ /**
170
+ * Finds the length of the next message inside a ringbuffer structure.
171
+ *
172
+ * @param ring The addresses and lengths of the split buffer, in a compatible
173
+ * format to jack's ringbuffer
174
+ * @returns size of message stored in ring datastructure
175
+ */
176
+ size_t rtosc_message_ring_length(ring_t *ring);
177
+
178
+
179
+ /**
180
+ * Validate if an arbitrary byte sequence is an OSC message.
181
+ * @param msg pointer to memory buffer
182
+ * @param len length of buffer
183
+ */
184
+ bool rtosc_valid_message_p(const char *msg, size_t len);
185
+
186
+ /**
187
+ * @param OSC message
188
+ * @returns the argument string of a given message
189
+ */
190
+ const char *rtosc_argument_string(const char *msg);
191
+
192
+ /**
193
+ * Generate a bundle from sub-messages
194
+ *
195
+ * @param buffer Destination buffer
196
+ * @param len Length of buffer
197
+ * @param tt OSC time tag
198
+ * @param elms Number of sub messages
199
+ * @param ... Messages
200
+ * @returns legnth of generated bundle or zero on failure
201
+ */
202
+ size_t rtosc_bundle(char *buffer, size_t len, uint64_t tt, int elms, ...);
203
+
204
+ /**
205
+ * Find the elements in a bundle
206
+ *
207
+ * @param msg OSC bundle
208
+ * @param len Upper bound on the length of the bundle
209
+ * @returns The number of messages contained within the bundle
210
+ */
211
+ size_t rtosc_bundle_elements(const char *msg, size_t len);
212
+
213
+ /**
214
+ * Fetch a message within the bundle
215
+ *
216
+ * @param msg OSC bundle
217
+ * @param i index of sub-message
218
+ * @returns The ith message within the bundle
219
+ */
220
+ const char *rtosc_bundle_fetch(const char *msg, unsigned i);
221
+
222
+ /**
223
+ * Get the size of a particular bundle element
224
+ *
225
+ * @param msg OSC bundle
226
+ * @param i Index of sub-message
227
+ * @returns The size of the ith sub-message in bytes
228
+ */
229
+ size_t rtosc_bundle_size(const char *msg, unsigned i);
230
+
231
+ /**
232
+ * Test if the buffer contains a bundle
233
+ *
234
+ * @param msg OSC message
235
+ * @returns true if message is a bundle
236
+ */
237
+ int rtosc_bundle_p(const char *msg);
238
+
239
+ /**
240
+ * @returns Time Tag for a bundle
241
+ */
242
+ uint64_t rtosc_bundle_timetag(const char *msg);
243
+
244
+
245
+ /**
246
+ * This is a non-compliant pattern matcher for dispatching OSC messages
247
+ *
248
+ * Overall the pattern specification is
249
+ * (normal-path)(\#digit-specifier)?(/)?(:argument-restrictor)*
250
+ *
251
+ * @param pattern The pattern string stored in the Port
252
+ * @param msg The OSC message to be matched
253
+ * @returns true if a normal match and false if unmatched
254
+ */
255
+ bool rtosc_match(const char *pattern, const char *msg);
256
+
257
+
258
+ /**
259
+ * Attempt to match a rtosc style path while ignoring arguments
260
+ *
261
+ * @param pattern rtosc pattern
262
+ * @param msg a normal C string or a rtosc message
263
+ */
264
+ const char *rtosc_match_path(const char *pattern, const char *msg);
265
+
266
+ #ifdef __cplusplus
267
+ };
268
+ #endif
269
+ #endif
data/fast_osc.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fast_osc/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fast_osc"
8
+ spec.version = FastOsc::VERSION
9
+ spec.authors = ["Xavier Riley"]
10
+ spec.email = ["xavriley@hotmail.com"]
11
+ spec.summary = %q{Serialize and deserialize Open Sound Control messages}
12
+ spec.description = %q{Serialize and deserialize Open Sound Control messages using rtosc}
13
+ spec.homepage = "https://github.com/xavriley/fast_osc"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib", "ext"]
20
+
21
+ spec.extensions << "ext/fast_osc/extconf.rb"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.5"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rake-compiler"
26
+ end
@@ -0,0 +1,3 @@
1
+ module FastOsc
2
+ VERSION = "0.0.3"
3
+ end
data/lib/fast_osc.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "fast_osc/version"
2
+ require File.expand_path('../fast_osc.bundle', __FILE__)
3
+
4
+ module FastOsc
5
+ # Your code goes here...
6
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fast_osc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Xavier Riley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Serialize and deserialize Open Sound Control messages using rtosc
56
+ email:
57
+ - xavriley@hotmail.com
58
+ executables: []
59
+ extensions:
60
+ - ext/fast_osc/extconf.rb
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - ext/fast_osc/extconf.rb
69
+ - ext/fast_osc/fast_osc_wrapper.c
70
+ - ext/fast_osc/rtosc.c
71
+ - ext/fast_osc/rtosc.h
72
+ - fast_osc.gemspec
73
+ - lib/fast_osc.rb
74
+ - lib/fast_osc/version.rb
75
+ homepage: https://github.com/xavriley/fast_osc
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ - ext
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.6
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Serialize and deserialize Open Sound Control messages
100
+ test_files: []