fast_osc 0.0.9 → 0.0.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 268fcf3a70da8309727ef032b0434db61b8e6e23
4
- data.tar.gz: 3df91b74cce13e82a908aadcd9f951bbb2ff39ce
3
+ metadata.gz: 508967c0e5e99fef79f7f3cc09bbe81fa82e0ee3
4
+ data.tar.gz: 281e6bae19a455de611780448a9238afde2f66d7
5
5
  SHA512:
6
- metadata.gz: 68be3a880de29bfe9e0d4870389cb75bb8f3c92a4dc174bb0ffe918ff5545525d9d08fa42d71aaa7f579ae37de49821aa48b7ad147a731fc780292f01752f426
7
- data.tar.gz: 97ad3ab5853cbfa9424a16611e4c0a2a15198fdccbff61de897543f534cacc30d10401fad8be3044eeda41174ce4feaf9ea01bcf38e74182aa3b72f6e2d99704
6
+ metadata.gz: bc96c488b7ea7b0c7e357e692efdc16351c2596731307ea51bc57d4ea52b2369d0367102170a73ab2c57f8bce6fbf27485e6123b71ea99a3f4f8cd94b53b8c5b
7
+ data.tar.gz: f2b0e4f6104a27077c48dafe65584e42628c6ab88e6def545cc1f6bfdf2a46e50977df2acef945b7f5dae77503c2e8ad80cbd374c07e089ab50d7672971fba22
@@ -38,6 +38,35 @@ const char *rtosc_path(const char *msg)
38
38
  return msg;
39
39
  }
40
40
 
41
+ #define JAN_1970 2208988800.0 /* 2208988800 time from 1900 to 1970 in seconds */
42
+
43
+ uint64_t ruby_time_to_osc_timetag(VALUE rubytime) {
44
+ uint64_t timetag;
45
+ double floattime;
46
+ uint32_t sec;
47
+ uint32_t frac;
48
+
49
+ switch(TYPE(rubytime)) {
50
+ case T_NIL:
51
+ timetag = 1;
52
+ break;
53
+ default:
54
+ // convert Time object to ntp
55
+ floattime = JAN_1970 + NUM2DBL(rb_funcall(rubytime, rb_intern("to_f"), 0));
56
+
57
+ sec = floor(floattime);
58
+ frac = (uint32_t)(fmod(floattime, 1.0) * 4294967296); // * (2 ** 32)
59
+ // printf("\nsec: %04x\n", sec);
60
+ // printf("\nfrac: %04x\n", frac);
61
+ timetag = (uint64_t)((uint64_t)sec << 32 | (uint64_t)frac);
62
+ // printf("\ntimetag: %08llx\n", timetag);
63
+ break;
64
+ }
65
+
66
+ return timetag;
67
+ }
68
+
69
+
41
70
  VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg) {
42
71
  rtosc_arg_itr_t itr;
43
72
  char* data = StringValuePtr(msg);
@@ -49,6 +78,9 @@ VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg) {
49
78
 
50
79
  rtosc_arg_val_t next_val;
51
80
 
81
+ // for timestamp arg decoding
82
+ uint64_t tt, secs, frac;
83
+
52
84
  while(!rtosc_itr_end(itr)) {
53
85
 
54
86
  next_val = rtosc_itr_next(&itr);
@@ -73,7 +105,21 @@ VALUE method_fast_osc_decode_single_message(VALUE self, VALUE msg) {
73
105
  break;
74
106
  case 't' :
75
107
  // OSC time tag
76
- // not implemented
108
+ // need to decode OSC (ntp style time) to unix timestamp
109
+ // then call Time.now with that
110
+ tt = next_val.val.t;
111
+ secs = (tt >> 32) - JAN_1970;
112
+ // taken from this SO post on how to convert NTP to Unix epoch
113
+ // http://stackoverflow.com/a/29138806
114
+ frac = ((tt & 0xFFFFFFFF) * 1000000) >> 32;
115
+ // example call from grpc ruby extension
116
+ // https://github.com/grpc/grpc/blob/master/src/ruby/ext/grpc/rb_grpc.c
117
+ // return rb_funcall(rb_cTime, id_at, 2, INT2NUM(real_time.tv_sec),
118
+ // INT2NUM(real_time.tv_nsec / 1000));
119
+ // printf("\noutsec: %08llx\n", secs);
120
+ // printf("\noutfrac: %08llx\n", frac);
121
+ // printf("\nouttimetag: %08llx\n", tt);
122
+ rb_ary_push(args_output, rb_funcall(rb_cTime, rb_intern("at"), 2, LONG2NUM(secs), LONG2NUM(frac)));
77
123
  break;
78
124
  case 'd' :
79
125
  rb_ary_push(args_output, rb_float_new(next_val.val.d));
@@ -164,6 +210,15 @@ VALUE method_fast_osc_encode_single_message(int argc, VALUE* argv, VALUE self) {
164
210
  rb_str_concat(tagstring, rb_str_new2("s"));
165
211
  output_args[i].s = StringValueCStr(strval);
166
212
  break;
213
+ case T_DATA:
214
+ if (CLASS_OF(current_arg) == rb_cTime) {
215
+ // at present I only care about the Time as an object arg
216
+ max_buffer_size += 8;
217
+
218
+ rb_str_concat(tagstring, rb_str_new2("t"));
219
+ output_args[i].t = ruby_time_to_osc_timetag(current_arg);
220
+ }
221
+ break;
167
222
  }
168
223
  }
169
224
 
@@ -194,34 +249,6 @@ VALUE method_fast_osc_encode_single_message(int argc, VALUE* argv, VALUE self) {
194
249
  return output;
195
250
  }
196
251
 
197
- #define JAN_1970 2208988800.0 /* 2208988800 time from 1900 to 1970 in seconds */
198
-
199
- uint64_t ruby_time_to_osc_timetag(VALUE rubytime) {
200
- uint64_t timetag;
201
- double floattime;
202
- uint32_t sec;
203
- uint32_t frac;
204
-
205
- switch(TYPE(rubytime)) {
206
- case T_NIL:
207
- timetag = 1;
208
- break;
209
- default:
210
- // convert Time object to ntp
211
- floattime = JAN_1970 + NUM2DBL(rb_funcall(rubytime, rb_intern("to_f"), 0));
212
-
213
- sec = floor(floattime);
214
- frac = (uint32_t)(fmod(floattime, 1.0) * 4294967296); // * (2 ** 32)
215
- /* printf("\nsec: %04x\n", sec); */
216
- /* printf("\nfrac: %04x\n", frac); */
217
- timetag = (uint64_t)((uint64_t)sec << 32 | (uint64_t)frac);
218
- /* printf("\ntimetag: %08llx\n", timetag); */
219
- break;
220
- }
221
-
222
- return timetag;
223
- }
224
-
225
252
  VALUE method_fast_osc_encode_single_bundle(int argc, VALUE* argv, VALUE self) {
226
253
  VALUE timetag, path, args;
227
254
  rb_scan_args(argc, argv, "21", &timetag, &path, &args);
@@ -1,3 +1,3 @@
1
1
  module FastOsc
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -75,6 +75,16 @@ class FastOscTest < Minitest::Test
75
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
76
  end
77
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
+
78
88
  def test_that_encoded_timestamps_line_up
79
89
  # this test is a bit convoluted but I found that fractional
80
90
  # seconds weren't working when I plugged this into Sonic Pi
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.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Riley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-14 00:00:00.000000000 Z
11
+ date: 2016-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  version: '0'
124
124
  requirements: []
125
125
  rubyforge_project:
126
- rubygems_version: 2.4.6
126
+ rubygems_version: 2.4.8
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: Serialize and deserialize Open Sound Control messages