From 8e628e5b38640fefd748243ae32b9c267b93f871 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Mon, 18 May 2020 04:59:26 -0500 Subject: [PATCH] Added sound handling. Added create new room and get room list to client and server --- examples/chat app/client/main.py | 34 +++++++++ examples/chat app/client/paths.py | 12 ++++ examples/chat app/client/sound.py | 84 ++++++++++++++++++++++ examples/chat app/client/sounds/chat.ogg | Bin 0 -> 6381 bytes examples/chat app/client/sounds/chat1.ogg | Bin 0 -> 21771 bytes examples/chat app/client/sounds/pm.ogg | Bin 0 -> 11141 bytes examples/chat app/server/server.py | 30 ++++++++ 7 files changed, 160 insertions(+) create mode 100644 examples/chat app/client/paths.py create mode 100644 examples/chat app/client/sound.py create mode 100644 examples/chat app/client/sounds/chat.ogg create mode 100644 examples/chat app/client/sounds/chat1.ogg create mode 100644 examples/chat app/client/sounds/pm.ogg diff --git a/examples/chat app/client/main.py b/examples/chat app/client/main.py index d9f0b09..551ea3c 100644 --- a/examples/chat app/client/main.py +++ b/examples/chat app/client/main.py @@ -5,6 +5,7 @@ import wx import client import output import gui +import sound from pubsub import pub # Client instance. @@ -19,9 +20,12 @@ class controller(object): self.window = window self.connect_events() self.window.Show() + self.next_action = "" def connect_events(self): self.window.chat.Bind(wx.EVT_CHAR_HOOK, self.on_process) + self.window.list.Bind(wx.EVT_LISTBOX_DCLICK, self.on_process_listbox_click) + self.window.list.Bind(wx.EVT_CHAR_HOOK, self.on_process_listbox) pub.subscribe(self.response, "response") pub.subscribe(self.ask_login, "ask_login") pub.subscribe(self.disconnected, "disconnected") @@ -32,6 +36,23 @@ class controller(object): self.send_message() event.Skip() + def on_process_listbox_click(self, event): + selected_option = self.window.menu_items[self.window.list.GetSelection()][0] + if selected_option == "create_room": + data = dict(action="create_room") + c.send_data(0, data) + elif selected_option == "join_room": + data = dict(action="request_room_list") + c.send_data(0, data) + if event != None: + event.Skip() + + def on_process_listbox(self, event): + key = event.GetKeyCode() + if key == wx.WXK_RETURN: + self.on_process_listbox_click(None) + event.Skip() + def send_message(self): global c message = self.window.chat.GetValue() @@ -48,6 +69,7 @@ class controller(object): getattr(self, "cmd_"+command)(data) def cmd_connected(self, data): + self.window.enable_app() connected = data.get("nickname") msg = "{} has entered this platform".format(connected) self.window.add_message(msg) @@ -57,8 +79,19 @@ class controller(object): nickname = data.get("nickname") msg = "{0}: {1}".format(nickname, msg) output.speak(msg) + sound.sound.play("chat.ogg") self.window.add_message(msg) + def cmd_create_room(self, data): + self.window.list.Clear() + msg = "{} Has created a room.".format(data.get("nickname")) + self.window.add_message(msg) + output.speak(msg) + + def cmd_room_list(self, data): + print(data) + + def ask_login(self): global c data = dict(action="login", nickname=self.username) @@ -71,6 +104,7 @@ class controller(object): def setup(): global c, t output.setup() + sound.setup() app = wx.App() d = gui.loginDialog() f = gui.appFrame() diff --git a/examples/chat app/client/paths.py b/examples/chat app/client/paths.py new file mode 100644 index 0000000..4671010 --- /dev/null +++ b/examples/chat app/client/paths.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +import os +from platform_utils import paths as paths_ + +def app_path(): + return paths_.app_path() + +def locale_path(): + return os.path.join(app_path(), "locales") + +def sound_path(): + return os.path.join(app_path(), "sounds") \ No newline at end of file diff --git a/examples/chat app/client/sound.py b/examples/chat app/client/sound.py new file mode 100644 index 0000000..2a22a38 --- /dev/null +++ b/examples/chat app/client/sound.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +import threading +import os +import subprocess +import paths +import sound_lib +import output +from sound_lib import recording, stream +from sound_lib import output, input + +def recode_audio(filename, quality=10): + subprocess.call(r'"%s" --downmix -q %r "%s"' % (os.path.join(paths.app_path(), 'oggenc2.exe'), quality, filename)) + +def get_recording(filename): + val = recording.WaveRecording(filename=filename) + return val + +class RepeatingTimer(threading.Thread): + """Call a function after a specified number of seconds, it will then repeat again after the specified number of seconds + Note: If the function provided takes time to execute, this time is NOT taken from the next wait period + + t = RepeatingTimer(30.0, f, args=[], kwargs={}) + t.start() + t.cancel() # stop the timer's actions + """ + + def __init__(self, interval, function, daemon=True, *args, **kwargs): + threading.Thread.__init__(self) + self.daemon = daemon + self.interval = float(interval) + self.function = function + self.args = args + self.kwargs = kwargs + self.finished = threading.Event() + + def cancel(self): + """Stop the timer if it hasn't finished yet""" + self.finished.set() + + stop = cancel + + def run(self): + while not self.finished.is_set(): + self.finished.wait(self.interval) + if not self.finished.is_set(): #In case someone has canceled while waiting + try: + self.function(*self.args, **self.kwargs) + except: + print("Execution failed. Function: %r args: %r and kwargs: %r" % (self.function, self.args, self.kwargs)) + +class soundSystem(object): + + def __init__(self): + """ Sound Player.""" + # Set the output and input default devices. + try: + self.output = output.Output() + self.input = input.Input() + except: + pass + self.files = [] + self.cleaner = RepeatingTimer(60, self.clear_list) + self.cleaner.start() + + def clear_list(self): + if len(self.files) == 0: return + try: + for i in range(0, len(self.files)): + if self.files[i].is_playing == False: + self.files[i].free() + self.files.pop(i) + except IndexError: + pass + + def play(self, sound, argument=False): + sound_object = stream.FileStream(file="%s/%s" % (paths.sound_path(), sound)) + self.files.append(sound_object) + sound_object.play() + +sound = None + +def setup(): + global sound + sound = soundSystem() \ No newline at end of file diff --git a/examples/chat app/client/sounds/chat.ogg b/examples/chat app/client/sounds/chat.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ca8fed8388627525a0be1d108bb9210ca6c9f58b GIT binary patch literal 6381 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 literal 0 HcmV?d00001 diff --git a/examples/chat app/client/sounds/chat1.ogg b/examples/chat app/client/sounds/chat1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..58008a30d68d1bf867fe399c375256251ccc9a83 GIT binary patch literal 21771 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 z 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