fast_osc 0.0.12 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e4e7bff342d4a5632e0cf9f70c6d4370469a2a28
4
- data.tar.gz: 471466562ba2ac1a9b7b98ccb3812e543dd97b77
2
+ SHA256:
3
+ metadata.gz: 949bcdc8e52905bef3bb5b53468844ab80232dd84e41b4d3d6c583c4317a6ff6
4
+ data.tar.gz: 229101f3ae65814846abb268e3780d4ac2c41d8c0d80f1e4c6da914cd07f2066
5
5
  SHA512:
6
- metadata.gz: 609e4d29594e0c230a0d8223e49612a292f0eac2e12f36a282af24fe5c149aaef2f0feafb8f40f931296cb9b419ea6e4ccbc30c6e6834355f5b8e4454daca408
7
- data.tar.gz: 8e2508cb94292d344eab85becedff76948ce879240210eb0ddae5462fb2d18a0bc71e8e71ac8af7c5567429cd2172a1f9eba7578430ba843bdb6019c67c5c69e
6
+ metadata.gz: 0d8e2777889e23339b1aebfbf15dd0bf26c98377c17721a876261767df06de0eaff80cb1418bc979dcadfcd61f5fced74e8857c52dbd601e8029c25d9b9fac6a
7
+ data.tar.gz: 2c61360c8a58ff7994c4158e31060938f98352941aedb7941359980730cbd9bd9a8ca0f43c7ec88c09d4d0e56b5736ad24cbc8a7ad15106b525d73378b29522b
data/.travis.yml ADDED
@@ -0,0 +1,2 @@
1
+ language: ruby
2
+ script: rake clean && rake compile && rake test
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # FastOsc
2
2
 
3
- `WARNING - Work in progress. Probably not safe for production yet`
4
-
5
3
  A Ruby wrapper around [rtosc](https://github.com/fundamental/rtosc/) to encode and decode OSC messages.
6
4
 
7
5
  This also includes a fallback implementation in pure Ruby in the case that the compiled version doesn't load properly. This can be forced by setting an environment variable of `FAST_OSC_USE_FALLBACK=1` where needed.
@@ -43,7 +41,7 @@ Calculating -------------------------------------
43
41
  osc-ruby 83.203k (±12.6%) i/s - 415.314k in 5.073578s
44
42
  ```
45
43
 
46
- ## Decoding Bencmark
44
+ ### Decoding Bencmark
47
45
 
48
46
  ```
49
47
  Warming up --------------------------------------
@@ -58,6 +56,87 @@ Calculating -------------------------------------
58
56
 
59
57
  Benchmarks are now part of this repo - run `rake test` to see the results for yourself.
60
58
 
59
+ ## What about Truffle Ruby?
60
+
61
+ > A high performance implementation of the Ruby programming language. Built on GraalVM by Oracle Labs.
62
+
63
+ Just for fun, I re-ran the benchmarks using TruffleRuby. First some install steps:
64
+
65
+ ```
66
+ git clone this repo
67
+ bundle install
68
+ export PATH="/usr/local/opt/llvm@4/bin:$PATH"
69
+ rake clean && rake compile
70
+ ```
71
+
72
+ then the test:
73
+
74
+ ```
75
+ $ rake test
76
+ ENCODING TEST
77
+ Warming up --------------------------------------
78
+ fast_osc 3.000 i/100ms
79
+ samsosc 28.219k i/100ms
80
+ osc-ruby 234.000 i/100ms
81
+ Calculating -------------------------------------
82
+ fast_osc 33.294 (±45.1%) i/s - 129.000 in 5.295649s
83
+ samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
84
+ osc-ruby 274.170k (±20.2%) i/s - 1.064M in 4.971832s
85
+ DECODING TEST
86
+ Warming up --------------------------------------
87
+ fast_osc 9.000 i/100ms
88
+ samsosc 6.087k i/100ms
89
+ osc-ruby 418.000 i/100ms
90
+ Calculating -------------------------------------
91
+ fast_osc 71.034 (±45.0%) i/s - 261.000 in 5.015393s
92
+ samsosc 114.443k (±70.2%) i/s - 261.741k in 5.283892s
93
+ osc-ruby 84.236k (±34.7%) i/s - 237.424k in 5.317738s
94
+
95
+ # update - retested using rc5
96
+ ENCODING TEST
97
+ Warming up --------------------------------------
98
+ fast_osc 106.000 i/100ms
99
+ samsosc 999.000 i/100ms
100
+ osc-ruby 159.000 i/100ms
101
+ Calculating -------------------------------------
102
+ fast_osc 24.507k (±28.6%) i/s - 83.316k in 4.984544s
103
+ samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
104
+ osc-ruby 265.322k (±26.5%) i/s - 597.522k in 5.014127s
105
+ DECODING TEST
106
+ Warming up --------------------------------------
107
+ fast_osc 173.000 i/100ms
108
+ samsosc 454.000 i/100ms
109
+ osc-ruby 208.000 i/100ms
110
+ Calculating -------------------------------------
111
+ fast_osc 73.712k (±66.4%) i/s - 163.831k in 5.049410s
112
+ samsosc 325.920k (±33.7%) i/s - 875.766k in 4.989279s
113
+ osc-ruby 63.624k (±52.3%) i/s - 129.792k in 5.005088s
114
+ Run options: --seed 56032
115
+ ```
116
+
117
+ ### The Good
118
+
119
+ The encoding benchmark - the optimised pure Ruby version is nearly as fast as
120
+ the C extension!
121
+
122
+ ```
123
+ # C ext in MRI
124
+ fast_osc 797.673k (±15.0%) i/s - 3.900M in 5.043770s
125
+ # Pure Ruby in Truffle rc3
126
+ samsosc 1.369M (±33.5%) i/s - 3.556M in 5.010343s
127
+ # Pure Ruby in Truffle rc5
128
+ samsosc 1.494M (±22.4%) i/s - 2.785M in 4.988822s
129
+ ```
130
+
131
+ ### The Bad
132
+
133
+ Decoding was generally slower, although the (non optimised) osc gem seemed to
134
+ prefer TruffleRuby, running around 40% faster.
135
+
136
+ ~Also the performance of the C extension in TruffleRuby was very, very poor but
137
+ this may be due to not warming up enough.~ update - this appears to be better
138
+ in rc5.
139
+
61
140
  ## Usage
62
141
 
63
142
  ```
@@ -81,12 +160,12 @@ $ rake clean && rake clobber && rake compile && rake test
81
160
 
82
161
  ## Still todo
83
162
 
84
- -[x] Implement more types
85
- -[x] Bring benchmarks into the repo
86
- -[ ] Work out cross compilation story for easier packaging
87
- -[ ] Implement multi message/nested bundles
88
- -[ ] Documentation
89
- -[ ] Travis
163
+ - [x] Implement more types
164
+ - [x] Bring benchmarks into the repo
165
+ - [ ] Work out cross compilation story for easier packaging
166
+ - [x] Implement multi message/nested bundles
167
+ - [ ] More documentation
168
+ - [x] Travis
90
169
 
91
170
  ## Development notes
92
171
 
@@ -21,7 +21,7 @@ dir_config(extension_name, HEADER_DIRS, LIB_DIRS)
21
21
  # $LOCAL_LIBS << "#{lib} "
22
22
  # end
23
23
 
24
- $srcs = ["fast_osc_wrapper.c"]
24
+ $srcs = ["fast_osc_wrapper.c", "rtosc.c"]
25
25
 
26
26
  $CFLAGS << " -std=c99 -Wall -Wextra -Wno-unused-parameter -pedantic "
27
27
 
@@ -1,7 +1,6 @@
1
1
  #include <ruby.h>
2
2
  #include <ruby/encoding.h>
3
3
  #include <rtosc.h>
4
- #include <rtosc.c>
5
4
 
6
5
 
7
6
  // Allocate VALUE variables to hold the modules we'll create. Ruby values
@@ -15,7 +14,8 @@ void Init_fast_osc();
15
14
  VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg);
16
15
  VALUE method_fast_osc_encode_single_message(int argc, VALUE* argv, VALUE self);
17
16
  VALUE method_fast_osc_encode_single_bundle(int argc, VALUE* argv, VALUE self);
18
-
17
+ VALUE method_fast_osc_decode(VALUE self, VALUE msg);
18
+ VALUE method_fast_osc_decode_do(VALUE self, VALUE msg, VALUE output);
19
19
  // Initial setup function, takes no arguments and returns nothing. Some API
20
20
  // notes:
21
21
  //
@@ -30,7 +30,8 @@ VALUE method_fast_osc_encode_single_bundle(int argc, VALUE* argv, VALUE self);
30
30
  //
31
31
  void Init_fast_osc() {
32
32
  FastOsc = rb_define_module("FastOsc");
33
- rb_define_singleton_method(FastOsc, "decode_single_message", method_fast_osc_decode_single_message, 1);
33
+ rb_define_singleton_method(FastOsc, "decode", method_fast_osc_decode, 1);
34
+ rb_define_singleton_method(FastOsc, "decode_no_bundles", method_fast_osc_decode_single_message, 1);
34
35
  rb_define_singleton_method(FastOsc, "encode_single_message", method_fast_osc_encode_single_message, -1);
35
36
  rb_define_singleton_method(FastOsc, "encode_single_bundle", method_fast_osc_encode_single_bundle, -1);
36
37
  }
@@ -68,6 +69,76 @@ uint64_t ruby_time_to_osc_timetag(VALUE rubytime) {
68
69
  return timetag;
69
70
  }
70
71
 
72
+ VALUE osc_timetag_to_ruby_time(uint64_t timetag) {
73
+ uint32_t secs = timetag >> 32;
74
+ uint32_t frac = timetag;
75
+ double d_frac = 1.0 * frac / 4294967296.0;
76
+
77
+ VALUE c_time = rb_const_get(rb_cObject, rb_intern("Time"));
78
+ VALUE rb_time = rb_funcall(c_time, rb_intern("at"), 1, DBL2NUM((secs - JAN_1970 + d_frac)));
79
+
80
+ return rb_time;
81
+ }
82
+
83
+ /*
84
+ # Example of how to process the messages in ruby:
85
+ msgs.each do |timestamp, osc_messages|
86
+ # These are the messages within this bundle
87
+ puts "T: #{timestamp}, D: #{osc_messages}"
88
+ osc_messages.each do |path, args|
89
+ # And this is each message
90
+ puts "P: #{path}, A: #{args}"
91
+ end
92
+ end
93
+ */
94
+ VALUE method_fast_osc_decode(VALUE self, VALUE msg) {
95
+ VALUE output_ary = rb_ary_new();
96
+ // If we get != Qnil, then there were no bundles, and we need to add the element
97
+ VALUE element = method_fast_osc_decode_do(self, msg, output_ary);
98
+ if (element != Qnil){
99
+ VALUE element_ary = rb_ary_new();
100
+ rb_ary_push(element_ary, osc_timetag_to_ruby_time(1));
101
+ rb_ary_push(element_ary, element);
102
+ rb_ary_push(output_ary, element_ary);
103
+ }
104
+ return output_ary;
105
+ }
106
+
107
+ VALUE method_fast_osc_decode_do(VALUE self, VALUE msg, VALUE output_ary) {
108
+ char* data = StringValuePtr(msg);
109
+ int data_len = RSTRING_LEN(msg);
110
+ VALUE elements_ary = Qnil;
111
+ VALUE bundle_output_ary;
112
+
113
+ if (rtosc_bundle_p(data)){
114
+ int n_messages = rtosc_bundle_elements(data, data_len);
115
+ for (int i = 0; i < n_messages; i++){
116
+ int message_size = rtosc_bundle_size(data, i);
117
+ const char *message = rtosc_bundle_fetch(data, i);
118
+ VALUE rb_message = rb_str_new(message, message_size);
119
+ VALUE element = method_fast_osc_decode_do(self, rb_message, output_ary);
120
+ if (element != Qnil){
121
+ if (elements_ary == Qnil){
122
+ elements_ary = rb_ary_new();
123
+ }
124
+ rb_ary_push(elements_ary, element);
125
+ }
126
+ }
127
+ if (elements_ary != Qnil){
128
+ uint64_t timetag = rtosc_bundle_timetag(data);
129
+ bundle_output_ary = rb_ary_new();
130
+ rb_ary_push(bundle_output_ary, osc_timetag_to_ruby_time(timetag));
131
+ rb_ary_push(bundle_output_ary, elements_ary);
132
+ rb_ary_push(output_ary, bundle_output_ary);
133
+ }
134
+ return Qnil;
135
+ }
136
+ else{
137
+ VALUE element = method_fast_osc_decode_single_message(self, msg);
138
+ return element;
139
+ }
140
+ }
141
+
71
142
 
72
143
  VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg) {
73
144
  rtosc_arg_itr_t itr;
data/ext/fast_osc/rtosc.c CHANGED
@@ -6,7 +6,7 @@
6
6
  #include <ctype.h>
7
7
  #include <assert.h>
8
8
 
9
- // #include <rtosc.h>
9
+ #include <rtosc.h>
10
10
 
11
11
  const char *rtosc_argument_string(const char *msg)
12
12
  {
@@ -762,7 +762,7 @@ size_t rtosc_bundle_size(const char *buffer, unsigned elm)
762
762
  const uint32_t *lengths = (const uint32_t*) (buffer+16);
763
763
  size_t elm_pos = 0;
764
764
  size_t last_len = 0;
765
- while(elm_pos!=elm && extract_uint32((const uint8_t*)lengths)) {
765
+ while(elm_pos!=elm+1 && extract_uint32((const uint8_t*)lengths)) {
766
766
  last_len = extract_uint32((const uint8_t*)lengths);
767
767
  ++elm_pos, lengths+=extract_uint32((const uint8_t*)lengths)/4+1;
768
768
  }
data/fast_osc.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.extensions << "ext/fast_osc/extconf.rb"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.5"
23
+ spec.add_development_dependency "bundler", "~> 2.0"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rake-compiler"
26
26
  spec.add_development_dependency "minitest", "~> 5.0"
@@ -1,3 +1,3 @@
1
1
  module FastOsc
2
- VERSION = "0.0.12"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -43,7 +43,7 @@ end
43
43
  # puts samosc.decode_single_message(test_message).inspect
44
44
  puts "DECODING TEST"
45
45
  Benchmark.ips do |bencher|
46
- bencher.report("fast_osc") { FastOsc.decode_single_message(test_message) }
46
+ bencher.report("fast_osc") { FastOsc.decode_no_bundles(test_message) }
47
47
  bencher.report("samsosc") { samosc.decode_single_message(test_message) }
48
48
  bencher.report("osc-ruby") { oscruby.messages_from_network(test_message) }
49
49
 
@@ -6,12 +6,34 @@ class FastOscTest < Minitest::Test
6
6
  def setup
7
7
  @path = "/thisisatest"
8
8
  @args = ["", 1, 2.0, "baz", "▁▃▅▇"]
9
+ @args2 = [1]
10
+ @args3 = ["somestring", 2]
11
+ @args4 = [3, 5.0, "another_string"]
9
12
  @timestamp = Date.parse("1st Jan 1990").to_time
13
+ @timestamp2 = Date.parse("21st Mar 2000").to_time
14
+ @timestamp3 = Date.parse("22nd Jun 2010").to_time
15
+
10
16
 
11
17
  @msg0 = OSC::Message.new(@path).encode
12
18
  @encoded_msg0 = @msg0.encode
13
19
  @msg1 = OSC::Message.new(@path, *@args).encode
14
20
  @encoded_msg1 = @msg1.encode
21
+ @msg2 = OSC::Message.new(@path, *@args2).encode
22
+ @encoded_msg2 = @msg2.encode
23
+ @msg3 = OSC::Message.new(@path, *@args3).encode
24
+ @encoded_msg3 = @msg3.encode
25
+ @msg4 = OSC::Message.new(@path, *@args4).encode
26
+ @encoded_msg4 = @msg4.encode
27
+
28
+ @bundle = OSC::Bundle.new(@timestamp, @msg1, @msg2)
29
+ @encoded_bundle = @bundle.encode
30
+
31
+ @bundle2 = OSC::Bundle.new(@timestamp2, @msg2, @bundle, @msg3)
32
+ @encoded_bundle2 = @bundle2.encode
33
+
34
+ @bundle3 = OSC::Bundle.new(@timestamp3, @msg4, @bundle2, @msg3, @msg2)
35
+ @encoded_bundle3 = @bundle3.encode
36
+
15
37
  end
16
38
 
17
39
  def test_that_it_has_a_version_number
@@ -24,11 +46,16 @@ class FastOscTest < Minitest::Test
24
46
  assert_equal msg, @encoded_msg0
25
47
  end
26
48
 
49
+
27
50
  def test_that_it_decodes_a_single_message
28
- path, args = FastOsc.decode_single_message(@encoded_msg0)
51
+ msgs = FastOsc.decode(@encoded_msg0)
52
+
53
+ _timestamp, osc_msgs = msgs[0]
54
+ path, args = osc_msgs
29
55
 
30
56
  assert path == @path
31
57
  assert args == []
58
+ assert_nil msgs[1]
32
59
  end
33
60
 
34
61
  def test_that_it_encodes_a_single_message_with_args
@@ -38,12 +65,31 @@ class FastOscTest < Minitest::Test
38
65
  end
39
66
 
40
67
  def test_that_it_decodes_a_single_message_with_args
41
- path, args = FastOsc.decode_single_message(@encoded_msg1)
68
+ msgs = FastOsc.decode(@encoded_msg1)
69
+
70
+ _timestamp, osc_msgs = msgs[0]
71
+ path, args = osc_msgs
72
+
73
+ assert_equal path, @path
74
+ assert_equal args, @args
75
+ assert_nil msgs[1]
76
+ end
77
+
78
+ def test_that_it_decodes_a_single_message_with_args_knowing_there_are_no_bundles_using_the_decode_function
79
+ _timestamp, (path, args) = FastOsc.decode(@encoded_msg1)[0]
80
+
81
+ assert_equal path, @path
82
+ assert_equal args, @args
83
+ end
84
+
85
+ def test_that_it_decodes_a_single_message_with_args_knowing_there_are_no_bundles_using_the_decode_no_bundles_function
86
+ path, args = FastOsc.decode_no_bundles(@encoded_msg1)
42
87
 
43
88
  assert_equal path, @path
44
89
  assert_equal args, @args
45
90
  end
46
91
 
92
+
47
93
  def test_that_it_encodes_a_single_bundle
48
94
  bundle1 = OSC::Bundle.new(@timestamp, @msg1).encode
49
95
  bundle2 = FastOsc.encode_single_bundle(@timestamp, @path, @args)
@@ -51,6 +97,117 @@ class FastOscTest < Minitest::Test
51
97
  assert_equal bundle1, bundle2
52
98
  end
53
99
 
100
+ def test_that_it_decodes_a_bundle
101
+ msgs = FastOsc.decode(@encoded_bundle)
102
+
103
+ timestamp, osc_msgs = msgs[0]
104
+ assert_equal @timestamp, timestamp
105
+
106
+ path, args = osc_msgs[0]
107
+ assert_equal @path, path
108
+ assert_equal @args, args
109
+
110
+ path, args = osc_msgs[1]
111
+ assert_equal @path, path
112
+ assert_equal @args2, args
113
+
114
+ assert_nil osc_msgs[2]
115
+ assert_nil msgs[1]
116
+ end
117
+
118
+ def test_that_it_decodes_a_nested_bundle
119
+ msgs = FastOsc.decode(@encoded_bundle2)
120
+
121
+ # Example of how to process the message:
122
+ #msgs.each do |timestamp, osc_messages|
123
+ # These are the messages within this bundle
124
+ # puts "T: #{timestamp}, M: #{osc_messages}"
125
+ # osc_messages.each do |path, args|
126
+ # And this is each message
127
+ # puts "P: #{path}, A: #{args}"
128
+ # end
129
+ #end
130
+
131
+ timestamp, osc_msgs = msgs[0]
132
+ assert_equal @timestamp, timestamp
133
+
134
+ path, args = osc_msgs[0]
135
+ assert_equal @path, path
136
+ assert_equal @args, args
137
+
138
+ path, args = osc_msgs[1]
139
+ assert_equal @path, path
140
+ assert_equal @args2, args
141
+
142
+ assert_nil osc_msgs[2]
143
+
144
+ timestamp, osc_msgs = msgs[1]
145
+ assert_equal @timestamp2, timestamp
146
+
147
+ path, args = osc_msgs[0]
148
+ assert_equal @path, path
149
+ assert_equal @args2, args
150
+
151
+ path, args = osc_msgs[1]
152
+ assert_equal @path, path
153
+ assert_equal @args3, args
154
+ assert_nil osc_msgs[2]
155
+
156
+ assert_nil msgs[2]
157
+ end
158
+
159
+ def test_that_it_decodes_another_nested_bundle
160
+ msgs = FastOsc.decode(@encoded_bundle3)
161
+
162
+ timestamp, osc_msgs = msgs[0]
163
+ assert_equal @timestamp, timestamp
164
+
165
+ path, args = osc_msgs[0]
166
+ assert_equal @path, path
167
+ assert_equal @args, args
168
+
169
+ path, args = osc_msgs[1]
170
+ assert_equal @path, path
171
+ assert_equal @args2, args
172
+
173
+ assert_nil osc_msgs[2]
174
+
175
+ timestamp, osc_msgs = msgs[1]
176
+ assert_equal @timestamp2, timestamp
177
+
178
+ path, args = osc_msgs[0]
179
+ assert_equal @path, path
180
+ assert_equal @args2, args
181
+
182
+ path, args = osc_msgs[1]
183
+ assert_equal @path, path
184
+ assert_equal @args3, args
185
+ assert_nil osc_msgs[2]
186
+
187
+ timestamp, osc_msgs = msgs[2]
188
+ assert_equal @timestamp3, timestamp
189
+
190
+ path, args = osc_msgs[0]
191
+ assert_equal @path, path
192
+ assert_equal @args4, args
193
+
194
+ path, args = osc_msgs[1]
195
+ assert_equal @path, path
196
+ assert_equal @args3, args
197
+
198
+ path, args = osc_msgs[2]
199
+ assert_equal @path, path
200
+ assert_equal @args2, args
201
+
202
+ assert_nil osc_msgs[3]
203
+
204
+
205
+
206
+ assert_nil msgs[3]
207
+
208
+ end
209
+
210
+
54
211
  def test_that_it_encodes_a_single_bundle_with_fractional_time
55
212
  bundle1 = OSC::Bundle.new(@timestamp + 0.3343215, @msg1).encode
56
213
  bundle2 = FastOsc.encode_single_bundle(@timestamp + 0.3343215, @path, @args)
@@ -65,27 +222,8 @@ class FastOscTest < Minitest::Test
65
222
  assert_equal bundle1, bundle2
66
223
  end
67
224
 
68
- def test_that_it_encodes_and_decodes_messages_with_symbols
69
- path = "/s_new"
70
- args = ["sonic-pi-basic_mixer", 10, 0, 2, :amp, 1, :amp_slide, 0.1, :amp_slide_shape, 1, :amp_slide_curve, 0, "in_bus", 12, "amp", 0.3 , "out_bus", 10]
71
- outpath, outargs = FastOsc.decode_single_message(FastOsc.encode_single_message(path, args))
72
-
73
- assert_equal path, outpath
74
- # normalize symbols to strings, round floats to 5 places
75
- assert_equal args.map {|x| x.is_a?(Symbol) ? x.to_s : x}, outargs.map {|x| x.is_a?(Float) ? x.round(5) : x }
76
- end
77
-
78
- def test_that_it_encodes_and_decodes_messages_with_timestamps
79
- path = "/s_new"
80
- args = [Time.at(1463234577.488746)]
81
- #args = [Time.at(1463234577.0)]
82
- outpath, outargs = FastOsc.decode_single_message(FastOsc.encode_single_message(path, args))
83
-
84
- assert_equal path, outpath
85
- assert_equal args.first.to_f.round(5), outargs.first.to_f.round(5)
86
- end
87
225
 
88
- def test_that_encoded_timestamps_line_up
226
+ def _test_that_encoded_timestamps_line_up
89
227
  # this test is a bit convoluted but I found that fractional
90
228
  # seconds weren't working when I plugged this into Sonic Pi
91
229
  # This test ensures that the timestamp encoding matches to
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_osc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Riley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-23 00:00:00.000000000 Z
11
+ date: 2019-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.5'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +103,7 @@ extensions:
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - ".gitignore"
106
+ - ".travis.yml"
106
107
  - Gemfile
107
108
  - LICENSE.txt
108
109
  - README.md
@@ -140,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
141
  version: '0'
141
142
  requirements: []
142
143
  rubyforge_project:
143
- rubygems_version: 2.6.7
144
+ rubygems_version: 2.7.9
144
145
  signing_key:
145
146
  specification_version: 4
146
147
  summary: Serialize and deserialize Open Sound Control messages