6 if n : return s+'\0'*(5-n)
10 def osc_command(url,*args):
16 argstring += struct.pack(">I",arg)
17 elif type(arg) is str:
19 argstring += osc_string(arg)
20 elif type(arg) is float:
22 argstring += struct.pack(">f",arg)
24 raise RunstimeError, "Invalid OSC argument"
25 return osc_string(url) + osc_string(tag) + argstring
32 if n : data = data[i+(5-n):]
33 else : data = data[i+1:]
38 url,data = osc_getstr(data)
39 tag,data = osc_getstr(data)
43 values.append(struct.unpack(">i",data[:4])[0])
46 v,data = osc_getstr(data)
49 values.append(struct.unpack(">f",data[:4])[0])
52 raise RuntimeError, "Unknown OSC parameter type received"
56 class OSCServer(Events.EventSource):
58 def __init__(self, addr, context):
59 Events.EventSource.__init__(self,
60 socket.socket(socket.AF_INET, socket.SOCK_DGRAM),
66 def registerHandler(self, addr, cb):
67 self._handlers[addr] = cb
69 def command(self, target, path, *args):
70 if args and type(args[0]) in (tuple, list) : args = args[0]
71 Logger.log('osc','osc://%s:%s%s %s'
72 % (target[0], target[1], path,
73 ' '.join(map(repr,args))))
74 self.fd().sendto(osc_command(path, *args),target)
77 data, addr = self.fd().recvfrom(1024)
78 path, args = osc_parse(data)
79 Logger.log('oscrcv','osc://%s:%s%s %s' % (addr[0], addr[1], path,
80 ' '.join(map(repr,args))))
81 handler = self._handlers.get(addr)
83 return handler(path, args)
88 return 'osc://%s:%s' % self._addr