Module OSC::Server
In: lib/osc/server.rb

Mixin for making servers. Your job is to read a packet and call dispatch(Packet.decode(raw)), ad infinitum (e.g. in a method named serve).

Methods

Public Instance methods

  prock.respond_to?(:call) #=> true

Pass an OSC pattern, a typespec, and either prock or a block. The block/prock will be called if the pattern and typspec match. Numeric types will be coerced, so e.g. ‘fi’ would match ‘ii’ and the float would be coerced to an int.

[Source]

    # File lib/osc/server.rb, line 11
11:     def add_method(pat, typespec, prock=nil, &block)
12:       pat = Pattern.new(pat) unless Pattern === pat
13:       if block_given? and prock
14:         raise ArgumentError, 'Specify either a block or a Proc, not both.'
15:       end
16:       prock = block if block_given?
17:       unless prock.respond_to?(:call)
18:         raise ArgumentError, "Prock doesn't respond to :call"
19:       end
20:       unless typespec.nil? or typespec =~ /[ifsb]*/
21:         raise ArgumentError, "Bad typespec '#{typespec}'"
22:       end
23:       @cb ||= []
24:       @cb << [pat, typespec, prock]
25:     end

dispatch the provided message. It can be raw or already decoded with Packet.decode

[Source]

    # File lib/osc/server.rb, line 29
29:     def dispatch(mesg)
30:       case mesg
31:       when Bundle, Message
32:       else
33:         mesg = Packet.decode(mesg)
34:       end
35: 
36:       case mesg
37:       when Bundle; dispatch_bundle(mesg)
38:       when Message
39:         unless @cb.nil?
40:           @cb.each do |pat, typespec, obj|
41:             if pat.nil? or Pattern.intersect?(pat, mesg.address)
42:               if typespec
43:                 if typespec.size == mesg.args.size
44:                   match = true
45:                   typespec.size.times do |i|
46:                     c = typespec[i]
47:                     case c
48:                     when ?i, ?f
49:                       match &&= (Numeric === mesg.args[i])
50:                     when ?s, ?b
51:                       match &&= (String === mesg.args[i])
52:                     end
53:                   end
54:                   if match
55:                     typespec.size.times do |i|
56:                       case typespec[i]
57:                       when ?i
58:                         mesg.args[i] = mesg.args[i].to_i
59:                       when ?f
60:                         mesg.args[i] = mesg.args[i].to_f
61:                       when ?s,?b
62:                         mesg.args[i] = mesg.args[i].to_s
63:                         mesg.args[i] = mesg.args[i].to_s
64:                       end
65:                     end
66: 
67:                     obj.call(mesg)
68:                   end
69:                 end
70:               else # no typespec
71:                 obj.call(mesg)
72:               end
73:             end # pattern match
74:           end # @cb.each
75:         end # unless @cb.nil?
76:         else
77:           raise "bad mesg"
78:         end
79:       end

May create a new thread to wait to dispatch according to p.timetag.

[Source]

    # File lib/osc/server.rb, line 82
82:     def dispatch_bundle(p)
83:       diff = p.timetag.to_f - TimeTag.now.to_f
84:       if diff <= 0
85:         p.each {|m| m.source = p.source; dispatch m}
86:       else
87:         Thread.new do
88:           sleep diff
89:           p.each {|m| m.source = p.source; dispatch m}
90:         end
91:       end
92:     end

[Validate]