From af38cb02a9ca95b20056bc92e73fe72a45d1f523 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Tue, 23 Apr 2013 18:59:15 +0200 Subject: Initial checkin. --- udpsoundserver.py | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 udpsoundserver.py (limited to 'udpsoundserver.py') diff --git a/udpsoundserver.py b/udpsoundserver.py new file mode 100755 index 0000000..f8e7c58 --- /dev/null +++ b/udpsoundserver.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +"""Listen on a UDP port and play a sound when 'M' is received + +Starts the server listening on UDP port PORT (3533 by default) on address HOST +(by default all addresses). Valid commands are: +M - play Music +S - Stop the server +""" +try: + import socketserver +except ImportError: + import SocketServer as socketserver +from os import system,getpid +import threading +import sys + +# leave it empty to listen on all addresses +HOST = "" +PORT = 3533 + + +class UDPSvr(socketserver.BaseRequestHandler): + def handle(self): + data = self.request[0] + if sys.version >= '3': + data = str(data, "ISO-8859-1") + data = data.strip() + if data == "M": + ding.dong() + elif data == "S": + ding.die() + +class Worker(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.daemon = True + def run(self): + server.serve_forever(); + +class Handler(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.daemon = True + self.play = False + self.must_die = False + + def run(self): + self.event = threading.Event() + while True: + self.event.wait(1.) + if self.event.isSet(): + if self.play: + print("Playing...") + system("paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg") + # no else if to allow shutdown signals + if self.must_die: + print("Shutting down...") + server.shutdown() + break + self.play = False + self.event.clear() + + def dong(self): + self.play = True + self.event.set() + + def die(self): + self.must_die = True + self.event.set() + +def ca(num, x): + print("Caught SIGINT, shutting down...") + ding.die() + +import signal +if __name__ == "__main__": + print("My PID is: " + str(getpid())) + + if len(sys.argv) > 1: + HOST = sys.argv[1] + if len(sys.argv) > 2: + PORT = int(sys.argv[2]) + + print("Host: " + HOST) + print("Port: " + str(PORT)) + server = socketserver.UDPServer((HOST, PORT), UDPSvr) + + ding = Handler() + signal.signal(signal.SIGINT, ca) + worker = Worker() + ding.start() + worker.start() + # might not be the cleanest, but it allows Ctrl + C + while ding.isAlive(): + ding.join(3600) + +# vim: set expandtab shiftwidth=4: -- cgit v1.2.1