Class: OSC::OSCPacket

Inherits:
Object
  • Object
show all
Defined in:
lib/osc-ruby/osc_packet.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(string) ⇒ OSCPacket

Returns a new instance of OSCPacket.



45
46
47
48
49
50
51
52
53
# File 'lib/osc-ruby/osc_packet.rb', line 45

def initialize( string )
  @packet = NetworkPacket.new( string )

  @types = { "i" => lambda{  OSCInt32.new(   get_int32 ) },
             "f" => lambda{  OSCFloat32.new( get_float32 ) },
             "s" => lambda{  OSCString.new(  get_string ) },
             "b" => lambda{  OSCBlob.new(    get_blob )}
            }
end

Class Method Details

.decode_simple_message(time, osc_packet) ⇒ Object



38
39
40
41
42
43
# File 'lib/osc-ruby/osc_packet.rb', line 38

def self.decode_simple_message( time, osc_packet )
  address = osc_packet.get_string
  args = osc_packet.get_arguments

  Message.new_with_time(address, time, nil, *args )
end

.messages_from_network(string, ip_info = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/osc-ruby/osc_packet.rb', line 7

def self.messages_from_network( string, ip_info=nil )
  messages = []
  osc = new( string )

  if osc.bundle?
    osc.get_string #=> bundle
    time = osc.get_timestamp

    osc.get_bundle_messages.each do | message |
      msg = decode_simple_message( time, OSCPacket.new( message ) )
      if ip_info
        # Append info for the ip address
        msg.ip_port = ip_info.shift
        msg.ip_address = ip_info.join(".")
      end
      messages << msg
    end

  else
    msg = decode_simple_message( time, osc )
    if ip_info
      # Append info for the ip address
        msg.ip_port = ip_info.shift
        msg.ip_address = ip_info.join(".")
    end
    messages << msg
  end

  return messages
end

Instance Method Details

#bundle?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/osc-ruby/osc_packet.rb', line 122

def bundle?
  !(@packet.to_s =~ /\A\#bundle/).nil?
end

#get_argumentsObject



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/osc-ruby/osc_packet.rb', line 89

def get_arguments
  if @packet.getc == ?,

    tags = get_string
    args = []

    tags.scan(/./) do | tag |
      args << @types[tag].call
    end
    args
  end
end

#get_blobObject



115
116
117
118
119
120
# File 'lib/osc-ruby/osc_packet.rb', line 115

def get_blob
  l = @packet.getn(4).unpack('N')[0]
  b = @packet.getn(l)
  @packet.skip_padding
  b
end

#get_bundle_messagesObject



55
56
57
58
59
60
61
62
63
# File 'lib/osc-ruby/osc_packet.rb', line 55

def get_bundle_messages
  bundle_messages = []

  until @packet.eof?
    l = @packet.getn(4).unpack('N')[0]
    bundle_messages << @packet.getn(l)
  end
  bundle_messages
end

#get_float32Object



109
110
111
112
113
# File 'lib/osc-ruby/osc_packet.rb', line 109

def get_float32
  f = @packet.getn(4).unpack('g')[0]
  @packet.skip_padding
  f
end

#get_int32Object



102
103
104
105
106
107
# File 'lib/osc-ruby/osc_packet.rb', line 102

def get_int32
  i = @packet.getn(4).unpack('N')[0]
  i -= 2**32 if i > (2**31-1)
  @packet.skip_padding
  i
end

#get_stringObject



65
66
67
68
69
70
71
72
# File 'lib/osc-ruby/osc_packet.rb', line 65

def get_string
  result = ''
  until (c = @packet.getc) == string_delemeter
   result << c
  end
  @packet.skip_padding
  result
end

#get_timestampObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/osc-ruby/osc_packet.rb', line 74

def get_timestamp
  #TODO: refactor this so a mortal can figure it out
  t1 = @packet.getn(4).unpack('N')[0]
  t2 = @packet.getn(4).unpack('N')[0]
  @packet.skip_padding

  if t1 == 0 && t2 == 1
    time = nil
  else
    time = t1 + t2.to_f / (2**32)
  end

  time
end

#string_delemeterObject



126
127
128
# File 'lib/osc-ruby/osc_packet.rb', line 126

def string_delemeter
 "\x00"
end