From 5cd1b41677a341ed5fdb1d7b7f6276600ef78257 Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Tue, 24 Nov 2015 19:28:18 -0500 Subject: [PATCH 1/8] - Changed super().__init__ to direct calls of parent __init__ methods --- pythonosc/osc_server.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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): From 1700082a44e1def19f1bb28560117a307579a815 Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Fri, 26 Feb 2016 16:30:56 -0500 Subject: [PATCH 2/8] - simple_server.py wants print to be a function a la Python 3. Fixed. - PEP8 improvements. - Word-wrapped long lines. - Made simple_server and simple_client executables (w/ UTF-8 encoding). --- examples/simple_client.py | 37 ++++++++++++++++------------ examples/simple_server.py | 51 ++++++++++++++++++++++++--------------- 2 files changed, 52 insertions(+), 36 deletions(-) mode change 100644 => 100755 examples/simple_client.py mode change 100644 => 100755 examples/simple_server.py diff --git a/examples/simple_client.py b/examples/simple_client.py old mode 100644 new mode 100755 index 257bf04..ee1c8bd --- 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 /filter +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="/filter") + 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() From eba4b15a5ccf2418d485edb567080c2cf1e8578f Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Fri, 26 Feb 2016 16:38:15 -0500 Subject: [PATCH 3/8] - Changed simple_client's address from "/filter" to "/debug" so that it works with one of the handlers simple_server implements. --- examples/simple_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/simple_client.py b/examples/simple_client.py index ee1c8bd..644b322 100755 --- a/examples/simple_client.py +++ b/examples/simple_client.py @@ -3,7 +3,7 @@ """Small example OSC client -This program sends 10 random values between 0.0 and 1.0 to the /filter +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 @@ -27,7 +27,7 @@ client = udp_client.UDPClient(args.ip, args.port) for x in range(10): - msg = osc_message_builder.OscMessageBuilder(address="/filter") + msg = osc_message_builder.OscMessageBuilder(address="/debug") msg.add_arg(random.random()) msg = msg.build() client.send(msg) From abdb9bed0959c999265f7ba9f7ada4e8e3e1ae11 Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Tue, 1 Mar 2016 17:30:15 -0500 Subject: [PATCH 4/8] - Changed queue to Queue for python2 - Switched to PEP8 indentation --- examples/reaktor_lazerbass.py | 184 ++++++++++++++++++---------------- 1 file changed, 96 insertions(+), 88 deletions(-) diff --git a/examples/reaktor_lazerbass.py b/examples/reaktor_lazerbass.py index 293f6f9..f256bb4 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,99 @@ 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() From bf7a73e7039048ceb832d3df5679ee5f8de881b0 Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Tue, 1 Mar 2016 17:34:53 -0500 Subject: [PATCH 5/8] - Wrapped some long lines in reaktor_lazybass.py --- examples/reaktor_lazerbass.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/reaktor_lazerbass.py b/examples/reaktor_lazerbass.py index f256bb4..54b0bac 100644 --- a/examples/reaktor_lazerbass.py +++ b/examples/reaktor_lazerbass.py @@ -55,8 +55,9 @@ def run(self): # 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]) + [10, 200, 50, 50 + if self._parameters['blocks'] >= 0.5 + else 0]) # Show actual values. for index, [key, val] in enumerate(self._parameters.items()): @@ -100,7 +101,8 @@ def run(self): reaktor = ReaktorDisplay(bq) def put_in_queue(args, value): - """Put a named argument in the queue to be able to use a single queue.""" + """Put a named argument in the queue to be able to use a single + queue.""" bq.put([args[0], value]) dispatcher = dispatcher.Dispatcher() From bce52cf48eac89632dd488e1672b3aa9d3467cb2 Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Sun, 2 Oct 2016 18:52:29 -0400 Subject: [PATCH 6/8] - Added .gitattributes for binary file type and image handling --- .gitattributes | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .gitattributes 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 From ebb083d10810623e79d25051c0e36bb8a061353c Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Wed, 29 May 2019 15:32:25 -0400 Subject: [PATCH 7/8] - Add allow_broadcast option --- pythonosc/udp_client.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pythonosc/udp_client.py b/pythonosc/udp_client.py index 8c2f3f9..898a62e 100644 --- a/pythonosc/udp_client.py +++ b/pythonosc/udp_client.py @@ -6,14 +6,21 @@ 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.setblocking(0) + if allow_broadcast: + self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) self._address = address self._port = port From d8a74ee2ff8948764f0d25df3e6a027c1f91503d Mon Sep 17 00:00:00 2001 From: Kevin Cole Date: Wed, 29 May 2019 16:05:19 -0400 Subject: [PATCH 8/8] - Add reuse address socket option to udp_client.py --- pythonosc/udp_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pythonosc/udp_client.py b/pythonosc/udp_client.py index 898a62e..306c54d 100644 --- a/pythonosc/udp_client.py +++ b/pythonosc/udp_client.py @@ -18,6 +18,7 @@ def __init__(self, address, port, allow_broadcast): 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)