diff --git a/src/controller/buffers.py b/src/controller/buffers.py index 77dc60e..316de3c 100644 --- a/src/controller/buffers.py +++ b/src/controller/buffers.py @@ -141,6 +141,7 @@ class audioBuffer(feedBuffer): def connect_events(self): widgetUtils.connect_event(self.tab.play, widgetUtils.BUTTON_PRESSED, self.play_audio) + widgetUtils.connect_event(self.tab.play_all, widgetUtils.BUTTON_PRESSED, self.play_all) super(audioBuffer, self).connect_events() def play_audio(self, *args, **kwargs): @@ -154,3 +155,7 @@ class audioBuffer(feedBuffer): a.dialog.get_response() a.dialog.Destroy() + def play_all(self, *args, **kwargs): + selected = self.tab.list.get_selected() + audios = [i["url"] for i in self.session.db[self.name]["items"][selected:]] + pub.sendMessage("play-audios", audios=audios) \ No newline at end of file diff --git a/src/controller/mainController.py b/src/controller/mainController.py index cdcfff7..fa7f7fb 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -62,6 +62,7 @@ class Controller(object): pub.subscribe(self.in_post, "posted") pub.subscribe(self.download, "download-file") pub.subscribe(self.play_audio, "play-audio") + pub.subscribe(self.play_audios, "play-audios") pub.subscribe(self.view_post, "open-post") widgetUtils.connect_event(self.window, widgetUtils.CLOSE_EVENT, self.exit) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.update_buffer, menuitem=self.window.update_buffer) @@ -71,6 +72,7 @@ class Controller(object): pub.unsubscribe(self.in_post, "posted") pub.unsubscribe(self.download, "download-file") pub.unsubscribe(self.play_audio, "play-audio") + pub.unsubscribe(self.play_audios, "play-audios") pub.unsubscribe(self.view_post, "open-post") def login(self): @@ -101,6 +103,9 @@ class Controller(object): def play_audio(self, audio_object): call_threaded(player.player.play, audio_object) + def play_audios(self, audios): + player.player.play_all(audios) + def view_post(self, post_object, controller_): p = getattr(posts, controller_)(self.session, post_object) p.dialog.get_response() diff --git a/src/controller/player.py b/src/controller/player.py index a94685c..2627de3 100644 --- a/src/controller/player.py +++ b/src/controller/player.py @@ -2,6 +2,7 @@ import sound_lib from sound_lib.output import Output from sound_lib.stream import URLStream +from mysc.repeating_timer import RepeatingTimer player = None @@ -18,28 +19,43 @@ class audioPlayer(object): self.stream = None self.vol = 100 self.is_working = False + self.queue = [] + self.stopped = True def play(self, url): if self.stream != None and self.stream.is_playing == True: self.stream.stop() + self.stopped = True + if hasattr(self, "worker") and self.worker != None: + self.worker.cancel() + self.worker = None + self.queue = [] # Make sure that there are no other sounds trying to be played. if self.is_working == False: self.is_working = True self.stream = URLStream(url=url) self.stream.volume = self.vol/100.0 self.stream.play() + self.stopped = False self.is_working = False def stop(self): if self.stream != None and self.stream.is_playing == True: self.stream.stop() + self.stopped = True + if hasattr(self, "worker") and self.worker != None: + self.worker.cancel() + self.worker = None + self.queue = [] def pause(self): if self.stream != None: if self.stream.is_playing == True: self.stream.pause() + self.stopped = True else: self.stream.play() + self.stopped = False @property def volume(self): @@ -53,3 +69,21 @@ class audioPlayer(object): if self.stream != None: self.stream.volume = self.vol/100.0 + def play_all(self, list_of_urls): + if len(self.queue) == 0: + self.queue = list_of_urls + else: + for i in list_of_urls: + self.queue.append(i) + self.play(self.queue[0]) + self.queue.remove(self.queue[0]) + self.worker = RepeatingTimer(5, self.player_function) + self.worker.start() + + def player_function(self): + if self.stream != None and self.stream.is_playing == False and self.stopped == False: + if len(self.queue) == 0: + self.worker.cancel() + return + self.play(self.queue[0]) + self.queue.remove(self.queue[0])