summaryrefslogtreecommitdiff
path: root/udpsoundserver.py
diff options
context:
space:
mode:
Diffstat (limited to 'udpsoundserver.py')
-rwxr-xr-xudpsoundserver.py98
1 files changed, 98 insertions, 0 deletions
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: