diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dbdbabb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,41 @@ +*.db binary +*.a binary +*.o binary +*.py[co] binary +*.so binary +*.sw[nop] binary +.xvpics binary +*.pdf binary +*.od[pst] binary +*.sxw binary +*.wpd binary +*.doc binary +*.ppt binary +*.xls binary +*.avi binary +*.swf binary +*.svg binary +*.ico diff=exif +*.gif diff=exif +*.tif diff=exif +*.jpg diff=exif +*.png diff=exif +*.xbm binary +*.xcf binary +*.mpg binary +*.mov binary +*.mp3 binary +*.ogg binary +*.gz binary +*.tgz binary +*.bz2 binary +*.zip binary +*.rpm binary +*.deb binary +*.hqx binary +*.spo binary +*.db binary +*.mdb binary +*.djvu binary +*.fig binary +*.egg binary diff --git a/examples/reaktor_lazerbass.py b/examples/reaktor_lazerbass.py index 293f6f9..54b0bac 100644 --- a/examples/reaktor_lazerbass.py +++ b/examples/reaktor_lazerbass.py @@ -1,8 +1,11 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- + """Example to drive/show reaktor's lazerbass instrument in pygame.""" import argparse import pygame import multiprocessing -import queue +import Queue import logging from pygame.locals import * @@ -21,94 +24,101 @@ class ReaktorDisplay(multiprocessing.Process): - def __init__(self, bq): - multiprocessing.Process.__init__(self) - self._bq = bq - - def run(self): - pygame.init() - font = pygame.font.SysFont("monospace", 15) - screen = pygame.display.set_mode((640, 480)) # FULLSCREEN - running = True - dirty = True - # OSC controlled parameters. - self._parameters = { - 'beating': 0.0, - 'blocks': 0.0, - 'basic_Model': 0.0, - 'Do!': 0.0, - } - while running: - for event in pygame.event.get(): - if event.type == QUIT: - running = False - if dirty: - screen.fill(_BLACK) - # Draw a gauge using rectangles. - # Left, top, width, height. - pygame.draw.rect( - screen, _WHITE, [10, 10, 50, 100], 2) - pygame.draw.rect( - screen, _WHITE, [10, 110, 50, -int(self._parameters['beating'] * 100)]) - - # Draw a button-like square for on/off display. - pygame.draw.rect( - screen, _WHITE, [10, 200, 50, 50], 2) - pygame.draw.rect( - screen, _WHITE, [10, 200, 50, 50 if self._parameters['blocks'] >= 0.5 else 0]) - - # Show actual values. - for index, [key, val] in enumerate(self._parameters.items()): - label = font.render("{0}: {1}".format(key, val), 1, _WHITE) - screen.blit(label, (200, index * 15)) - pygame.display.flip() - dirty = False - try: - what, value = self._bq.get(True) - self._parameters[what] = value + def __init__(self, bq): + multiprocessing.Process.__init__(self) + self._bq = bq + + def run(self): + pygame.init() + font = pygame.font.SysFont("monospace", 15) + screen = pygame.display.set_mode((640, 480)) # FULLSCREEN + running = True dirty = True - logging.debug('Received new value {0} = {1}'.format(what, value)) - except queue.Empty: - running = False - pygame.quit() + # OSC controlled parameters. + self._parameters = {'beating': 0.0, + 'blocks': 0.0, + 'basic_Model': 0.0, + 'Do!': 0.0} + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + if dirty: + screen.fill(_BLACK) + # Draw a gauge using rectangles. + # Left, top, width, height. + pygame.draw.rect(screen, _WHITE, [10, 10, 50, 100], 2) + pygame.draw.rect(screen, _WHITE, + [10, 110, 50, + -int(self._parameters['beating'] * 100)]) + + # Draw a button-like square for on/off display. + pygame.draw.rect(screen, _WHITE, [10, 200, 50, 50], 2) + pygame.draw.rect(screen, _WHITE, + [10, 200, 50, 50 + if self._parameters['blocks'] >= 0.5 + else 0]) + + # Show actual values. + for index, [key, val] in enumerate(self._parameters.items()): + label = font.render("{0}: {1}".format(key, val), + 1, _WHITE) + screen.blit(label, (200, index * 15)) + pygame.display.flip() + dirty = False + try: + what, value = self._bq.get(True) + self._parameters[what] = value + dirty = True + logging.debug('Received new value {0} = {1}' + .format(what, value)) + except Queue.Empty: + running = False + pygame.quit() if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--server_ip", default="0.0.0.0", - help="The ip to listen to for reaktor OSC messages") - parser.add_argument( - "--server_port", type=int, default=8000, - help="The port to listen on for reaktor OSC messages") - #parser.add_argument("--client_ip", - # default="127.0.0.1", help="The ip to listen on") - #parser.add_argument("--client_port", - # type=int, default=5005, help="The port to listen on") - args = parser.parse_args() - - #client = udp_client.UDPClient(args.client_ip, args.client_port) - - bq = multiprocessing.Queue() - reaktor = ReaktorDisplay(bq) - - def put_in_queue(args, value): - """Put a named argument in the queue to be able to use a single queue.""" - bq.put([args[0], value]) - - dispatcher = dispatcher.Dispatcher() - dispatcher.map("/debug", logging.debug) - dispatcher.map("/beating", put_in_queue, "beating") - dispatcher.map("/blocks", put_in_queue, "blocks") - dispatcher.map("/basic_Model", put_in_queue, "basic_Model") - dispatcher.map("/Do!", put_in_queue, "Do!") - - server = osc_server.ThreadingOSCUDPServer( - (args.server_ip, args.server_port), dispatcher) - logging.info("Serving on {}".format(server.server_address)) - - # Exit thread when the main thread terminates. - reaktor.daemon = True - reaktor.start() - - server.serve_forever() + parser = argparse.ArgumentParser() + parser.add_argument("--server_ip", + default="0.0.0.0", + help="The ip to listen to for reaktor OSC messages") + parser.add_argument("--server_port", + type=int, + default=8000, + help="The port to listen on for reaktor OSC messages") +# parser.add_argument("--client_ip", +# default="127.0.0.1", +# help="The ip to listen on") +# parser.add_argument("--client_port", +# type=int, +# default=5005, +# help="The port to listen on") + args = parser.parse_args() + +# client = udp_client.UDPClient(args.client_ip, args.client_port) + + bq = multiprocessing.Queue() + reaktor = ReaktorDisplay(bq) + + def put_in_queue(args, value): + """Put a named argument in the queue to be able to use a single + queue.""" + bq.put([args[0], value]) + + dispatcher = dispatcher.Dispatcher() + dispatcher.map("/debug", logging.debug) + dispatcher.map("/beating", put_in_queue, "beating") + dispatcher.map("/blocks", put_in_queue, "blocks") + dispatcher.map("/basic_Model", put_in_queue, "basic_Model") + dispatcher.map("/Do!", put_in_queue, "Do!") + + server = osc_server.ThreadingOSCUDPServer((args.server_ip, + args.server_port), + dispatcher) + logging.info("Serving on {}".format(server.server_address)) + + # Exit thread when the main thread terminates. + reaktor.daemon = True + reaktor.start() + + server.serve_forever() diff --git a/examples/simple_client.py b/examples/simple_client.py old mode 100644 new mode 100755 index 257bf04..644b322 --- a/examples/simple_client.py +++ b/examples/simple_client.py @@ -1,7 +1,10 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- + """Small example OSC client -This program sends 10 random values between 0.0 and 1.0 to the /filter address, -waiting for 1 seconds between each value. +This program sends 10 random values between 0.0 and 1.0 to the /debug +address, waiting for 1 seconds between each value. """ import argparse import random @@ -10,20 +13,22 @@ from pythonosc import osc_message_builder from pythonosc import udp_client - if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ip", default="127.0.0.1", - help="The ip of the OSC server") - parser.add_argument("--port", type=int, default=8000, - help="The port the OSC server is listening on") - args = parser.parse_args() + parser = argparse.ArgumentParser() + parser.add_argument("--ip", + default="127.0.0.1", + help="The ip of the OSC server") + parser.add_argument("--port", + type=int, + default=8000, + help="The port the OSC server is listening on") + args = parser.parse_args() - client = udp_client.UDPClient(args.ip, args.port) + client = udp_client.UDPClient(args.ip, args.port) - for x in range(10): - msg = osc_message_builder.OscMessageBuilder(address = "/filter") - msg.add_arg(random.random()) - msg = msg.build() - client.send(msg) - time.sleep(1) + for x in range(10): + msg = osc_message_builder.OscMessageBuilder(address="/debug") + msg.add_arg(random.random()) + msg = msg.build() + client.send(msg) + time.sleep(1) diff --git a/examples/simple_server.py b/examples/simple_server.py old mode 100644 new mode 100755 index ad5aa50..65bc98f --- a/examples/simple_server.py +++ b/examples/simple_server.py @@ -1,31 +1,42 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- + +from __future__ import print_function + import argparse import math from pythonosc import dispatcher from pythonosc import osc_server + def print_volume_handler(unused_addr, args, volume): - print("[{0}] ~ {1}".format(args[0], volume)) + print("[{0}] ~ {1}".format(args[0], volume)) + def print_compute_handler(unused_addr, args, volume): - try: - print("[{0}] ~ {1}".format(args[0], args[1](volume))) - except ValueError: pass + try: + print("[{0}] ~ {1}".format(args[0], args[1](volume))) + except ValueError: + pass if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ip", - default="0.0.0.0", help="The ip to listen on") - parser.add_argument("--port", - type=int, default=5005, help="The port to listen on") - args = parser.parse_args() - - dispatcher = dispatcher.Dispatcher() - dispatcher.map("/debug", print) - dispatcher.map("/volume", print_volume_handler, "Volume") - dispatcher.map("/logvolume", print_compute_handler, "Log volume", math.log) - - server = osc_server.ThreadingOSCUDPServer( - (args.ip, args.port), dispatcher) - print("Serving on {}".format(server.server_address)) - server.serve_forever() + parser = argparse.ArgumentParser() + parser.add_argument("--ip", + default="0.0.0.0", + help="The ip to listen on") + parser.add_argument("--port", + type=int, + default=5005, + help="The port to listen on") + args = parser.parse_args() + + dispatcher = dispatcher.Dispatcher() + dispatcher.map("/debug", print) + dispatcher.map("/volume", print_volume_handler, "Volume") + dispatcher.map("/logvolume", print_compute_handler, "Log volume", math.log) + + server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), + dispatcher) + print("Serving on {0}".format(server.server_address)) + server.serve_forever() diff --git a/pythonosc/osc_server.py b/pythonosc/osc_server.py index d6af49d..da35ce5 100644 --- a/pythonosc/osc_server.py +++ b/pythonosc/osc_server.py @@ -99,7 +99,7 @@ class BlockingOSCUDPServer(socketserver.UDPServer): """ def __init__(self, server_address, dispatcher): - super().__init__(server_address, _UDPHandler) + socketserver.UDPServer.__init__(self, server_address, _UDPHandler) self._dispatcher = dispatcher def verify_request(self, request, client_address): @@ -121,7 +121,7 @@ class ThreadingOSCUDPServer( """ def __init__(self, server_address, dispatcher): - super().__init__(server_address, _UDPHandler) + socketserver.UDPServer.__init__(self, server_address, _UDPHandler) self._dispatcher = dispatcher def verify_request(self, request, client_address): @@ -144,7 +144,7 @@ class ForkingOSCUDPServer( """ def __init__(self, server_address, dispatcher): - super().__init__(server_address, _UDPHandler) + socketserver.UDPServer.__init__(self, server_address, _UDPHandler) self._dispatcher = dispatcher def verify_request(self, request, client_address): diff --git a/pythonosc/udp_client.py b/pythonosc/udp_client.py index 8c2f3f9..306c54d 100644 --- a/pythonosc/udp_client.py +++ b/pythonosc/udp_client.py @@ -6,14 +6,22 @@ class UDPClient(object): """OSC client to send OscMessages or OscBundles via UDP.""" - def __init__(self, address, port): + def __init__(self, address, port, allow_broadcast): """Initialize the client. As this is UDP it will not actually make any attempt to connect to the given server at ip:port until the send() method is called. + + Args: + address: IP address of server + port: Port of server + allow_broadcast: Allow for broadcast transmissions """ self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._sock.setblocking(0) + if allow_broadcast: + self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) self._address = address self._port = port