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.



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

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

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

Class Method Details

.decode_simple_message(time, osc_packet) ⇒ Object



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

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



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
37
38
# File 'lib/osc-ruby/osc_packet.rb', line 9

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)


133
134
135
# File 'lib/osc-ruby/osc_packet.rb', line 133

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

#get_argumentsObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/osc-ruby/osc_packet.rb', line 92

def get_arguments
  if @packet.getc == ?,

    tags = get_string
    args = []

    tags.scan(/./) do | tag |
      type_handler = @types[tag]
      raise( UnknownType, "Unknown OSC type: #{tag}" ) unless type_handler
      args << type_handler.call
    end
    args
  end
end

#get_blobObject



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

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

#get_bundle_messagesObject



58
59
60
61
62
63
64
65
66
# File 'lib/osc-ruby/osc_packet.rb', line 58

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_double64Object



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

def get_double64
  f = @packet.getn(8).unpack('G')[0]
  @packet.skip_padding
  f
end

#get_float32Object



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

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

#get_int32Object



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

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



68
69
70
71
72
73
74
75
# File 'lib/osc-ruby/osc_packet.rb', line 68

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

#get_timestampObject



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

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



137
138
139
# File 'lib/osc-ruby/osc_packet.rb', line 137

def string_delemeter
 "\x00"
end