From 3aaddc9de62202a04ed84b3bf53e7ecab92ebf0d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Isma=C3=ABl=20Bouya?= Date: Sat, 23 Jul 2016 00:07:29 +0200 Subject: [PATCH] Add interrupt_wait action --- helpers/action.py | 43 ++++++++++++++++++++++++++++++++++--------- helpers/mapping.py | 14 ++++++++++++++ helpers/music_file.py | 4 +++- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/helpers/action.py b/helpers/action.py index eaa419b..99cd399 100644 --- a/helpers/action.py +++ b/helpers/action.py @@ -6,6 +6,7 @@ from . import debug_print class Action: action_types = [ 'command', + 'interrupt_wait', 'pause', 'play', 'seek', @@ -88,7 +89,11 @@ class Action: for music in self.music_list(music): music.seek(value=value, delta=delta) - def stop(self, music=None, fade_out=0, wait=False, **kwargs): + def interrupt_wait(self, wait_id=None): + self.mapping.interrupt_wait(wait_id) + + def stop(self, music=None, fade_out=0, wait=False, + set_wait_id=None, **kwargs): previous = None for music in self.music_list(music): if music.is_loaded_paused() or music.is_loaded_playing(): @@ -99,7 +104,10 @@ class Action: music.stop(fade_out=fade_out) if previous is not None: - previous.stop(fade_out=fade_out, wait=wait) + previous.stop( + fade_out=fade_out, + wait=wait, + set_wait_id=set_wait_id) def stop_all_actions(self, **kwargs): self.mapping.stop_all_running() @@ -110,7 +118,10 @@ class Action: else: self.mapping.set_master_volume(value, delta=delta, fade=fade) - def wait(self, duration=0, music=None, **kwargs): + def wait(self, duration=0, music=None, set_wait_id=None, **kwargs): + if set_wait_id is not None: + self.mapping.add_wait_id(set_wait_id, self) + self.sleep_event = threading.Event() if music is not None: @@ -123,6 +134,9 @@ class Action: def command_print(self, command="", **kwargs): return "running command {}".format(command) + def interrupt_wait_print(self, wait_id=None, **kwargs): + return "interrupt wait with id {}".format(wait_id) + def pause_print(self, music=None, **kwargs): if music is not None: return "pausing « {} »".format(music.name) @@ -161,7 +175,9 @@ class Action: return message - def stop_print(self, music=None, fade_out=0, wait=False, **kwargs): + def stop_print(self, music=None, fade_out=0, wait=False, + set_wait_id=None, **kwargs): + message = "stopping " if music is not None: message += "music « {} »".format(music.name) @@ -171,7 +187,11 @@ class Action: if fade_out > 0: message += " with {}s fadeout".format(fade_out) if wait: - message += " (waiting the end of fadeout)" + if set_wait_id is not None: + message += " (waiting the end of fadeout, with id {})"\ + .format(set_wait_id) + else: + message += " (waiting the end of fadeout)" return message @@ -217,17 +237,22 @@ class Action: return message - def wait_print(self, duration=0, music=None, **kwargs): + def wait_print(self, duration=0, music=None, set_wait_id=None, **kwargs): + message = "" if music is None: - return "waiting {}s" \ + message += "waiting {}s" \ .format(duration) elif duration == 0: - return "waiting the end of « {} »" \ + message += "waiting the end of « {} »" \ .format(music.name) else: - return "waiting the end of « {} » + {}s" \ + message += "waiting the end of « {} » + {}s" \ .format(music.name, duration) + if set_wait_id is not None: + message += " (setting id = {})".format(set_wait_id) + + return message # Interruptions def wait_interrupt(self, duration=0, music=None, **kwargs): diff --git a/helpers/mapping.py b/helpers/mapping.py index 43cacf2..0c81af4 100644 --- a/helpers/mapping.py +++ b/helpers/mapping.py @@ -11,6 +11,7 @@ from .music_file import * from .mixer import Mixer from . import Config, gain, error_print from .music_effect import GainEffect +from .action import Action class Mapping(RelativeLayout): expected_keys = NumericProperty(0) @@ -27,6 +28,7 @@ class Mapping(RelativeLayout): self._keyboard = Window.request_keyboard(self._keyboard_closed, self) self._keyboard.bind(on_key_down=self._on_keyboard_down) self.running = [] + self.wait_ids = {} Clock.schedule_interval(self.not_all_keys_ready, 1) @property @@ -53,6 +55,18 @@ class Mapping(RelativeLayout): else: music.set_gain(db_gain) + def add_wait_id(self, wait_id, action_or_wait): + self.wait_ids[wait_id] = action_or_wait + + def interrupt_wait(self, wait_id): + if wait_id in self.wait_ids: + action_or_wait = self.wait_ids[wait_id] + del(self.wait_ids[wait_id]) + if isinstance(action_or_wait, Action): + action_or_wait.interrupt() + else: + action_or_wait.set() + def _keyboard_closed(self): self._keyboard.unbind(on_key_down=self._on_keyboard_down) self._keyboard = None diff --git a/helpers/music_file.py b/helpers/music_file.py index 5f4fe76..b0e218f 100644 --- a/helpers/music_file.py +++ b/helpers/music_file.py @@ -259,7 +259,7 @@ class MusicFile(Machine): self.gain_effects = [] self.set_gain(db_gain) - def stop(self, fade_out=0, wait=False): + def stop(self, fade_out=0, wait=False, set_wait_id=None): if self.is_loaded_playing(): ms = int(self.sound_position * 1000) ms_fo = max(1, int(fade_out * 1000)) @@ -270,6 +270,8 @@ class MusicFile(Machine): self.current_audio_segment = new_audio_segment self.stop_playing() if wait: + if set_wait_id is not None: + self.mapping.add_wait_id(set_wait_id, self.wait_event) self.wait_end() else: self.stop_playing() -- 2.41.0