Add new project 'AudioControl'
[audiocontrol.git] / Looper.py
1 import socket, struct
2 import Actions, Logger
3
4 def osc_string(s) :
5     n = (len(s)+1)%4
6     if n : return s+'\0'*(5-n)
7     else : return s+'\0'
8
9 def osc_command(url,*args):
10     tag=","
11     argstring=""
12     for arg in args :
13         if type(arg) is int:
14             tag += 'i'
15             argstring += struct.pack(">I",arg)
16         elif type(arg) is str:
17             tag += 's'
18             argstring += osc_string(arg)
19         else:
20             raise RunstimeError, "Invalid OSC argument"
21     return osc_string(url) + osc_string(tag) + argstring
22
23 class OSCSender(object):
24
25     def __init__(self, host, port):
26         self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
27         self._target = (host,port)
28
29     def command(self, path, *args):
30         if type(args[0]) in (tuple, list) : args = args[0]
31         Logger.log('osc','osc://%s:%s%s %s'
32                    % (self._target[0], self._target[1], path,
33                       ' '.join(map(repr,args))))
34         self._sock.sendto(osc_command(path, *args),self._target)
35         
36
37 class Controller(object) :
38
39     def __init__(self, host, port):
40         self._sender = OSCSender(host,port)
41
42     def hit(self, command, index=0):
43         self._sender.command("/sl/%d/hit" % index, str(command))
44
45
46 class Command(Actions.Action):
47
48     def __init__(self, name, controller, command):
49         Actions.Action.__init__(self, name)
50         self._controller = controller
51         self._command = command
52
53     def __call__(self, binding):
54         self._controller.hit(self._command)