From d4217fda2ff3991eb1ee9a9bec6acff751798507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Fri, 12 Aug 2016 18:21:22 +0200 Subject: wait actions are now pausable and resettable This fixes https://git.immae.eu/mantisbt/view.php?id=6 --- music_sampler/action.py | 18 ++++++++ music_sampler/actions/__init__.py | 3 ++ music_sampler/actions/pause_wait.py | 8 ++++ music_sampler/actions/reset_wait.py | 8 ++++ music_sampler/actions/unpause_wait.py | 8 ++++ music_sampler/actions/wait.py | 54 +++++++++++++++++++++- .../locales/fr/LC_MESSAGES/music_sampler.po | 24 ++++++++++ music_sampler/mapping.py | 33 +++++++++++-- 8 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 music_sampler/actions/pause_wait.py create mode 100644 music_sampler/actions/reset_wait.py create mode 100644 music_sampler/actions/unpause_wait.py (limited to 'music_sampler') diff --git a/music_sampler/action.py b/music_sampler/action.py index d269d0e..22a2bdc 100644 --- a/music_sampler/action.py +++ b/music_sampler/action.py @@ -98,6 +98,24 @@ class Action: return getattr(getattr(actions, self.action), 'interrupt')( self, **self.arguments) + def pause(self): + if getattr(actions, self.action, None) and\ + hasattr(getattr(actions, self.action), 'pause'): + return getattr(getattr(actions, self.action), 'pause')( + self, **self.arguments) + + def unpause(self): + if getattr(actions, self.action, None) and\ + hasattr(getattr(actions, self.action), 'unpause'): + return getattr(getattr(actions, self.action), 'unpause')( + self, **self.arguments) + + def reset(self): + if getattr(actions, self.action, None) and\ + hasattr(getattr(actions, self.action), 'reset'): + return getattr(getattr(actions, self.action), 'reset')( + self, **self.arguments) + # Helpers def music_list(self, music): if music is not None: diff --git a/music_sampler/actions/__init__.py b/music_sampler/actions/__init__.py index 658cef0..7c812cb 100644 --- a/music_sampler/actions/__init__.py +++ b/music_sampler/actions/__init__.py @@ -1,10 +1,13 @@ from . import interrupt_wait from . import pause +from . import pause_wait from . import play +from . import reset_wait from . import run_command from . import seek from . import stop from . import stop_all_actions from . import unpause +from . import unpause_wait from . import volume from . import wait diff --git a/music_sampler/actions/pause_wait.py b/music_sampler/actions/pause_wait.py new file mode 100644 index 0000000..e4ab6ea --- /dev/null +++ b/music_sampler/actions/pause_wait.py @@ -0,0 +1,8 @@ +def run(action, wait_id=None, **kwargs): + action.mapping.pause_wait(wait_id) + +def description(action, wait_id=None, **kwargs): + if wait_id is None: + return _("pause all waits") + else: + return _("pause wait with id {}").format(wait_id) diff --git a/music_sampler/actions/reset_wait.py b/music_sampler/actions/reset_wait.py new file mode 100644 index 0000000..500bcca --- /dev/null +++ b/music_sampler/actions/reset_wait.py @@ -0,0 +1,8 @@ +def run(action, wait_id=None, **kwargs): + action.mapping.reset_wait(wait_id) + +def description(action, wait_id=None, **kwargs): + if wait_id is None: + return _("reset all waits") + else: + return _("reset wait with id {}").format(wait_id) diff --git a/music_sampler/actions/unpause_wait.py b/music_sampler/actions/unpause_wait.py new file mode 100644 index 0000000..25e9a11 --- /dev/null +++ b/music_sampler/actions/unpause_wait.py @@ -0,0 +1,8 @@ +def run(action, wait_id=None, **kwargs): + action.mapping.unpause_wait(wait_id) + +def description(action, wait_id=None, **kwargs): + if wait_id is None: + return _("unpause all waits") + else: + return _("unpause wait with id {}").format(wait_id) diff --git a/music_sampler/actions/wait.py b/music_sampler/actions/wait.py index bcee649..31439b8 100644 --- a/music_sampler/actions/wait.py +++ b/music_sampler/actions/wait.py @@ -1,4 +1,5 @@ import threading +import time def run(action, duration=0, music=None, set_wait_id=None, **kwargs): action.mapping.add_wait(action, wait_id=set_wait_id) @@ -8,10 +9,17 @@ def run(action, duration=0, music=None, set_wait_id=None, **kwargs): duration, action.sleep_event.set) + action.sleep_event_initial_duration = duration + action.sleep_event_paused = False + action.sleep_event_left_time = duration + if music is not None: music.wait_end() - action.sleep_event_timer.start() + if duration <= 0 or not action.sleep_event_paused: + action.sleep_event_timer.start() + action.sleep_event_started_time = time.time() + action.sleep_event.wait() def description(action, duration=0, music=None, set_wait_id=None, **kwargs): @@ -34,6 +42,50 @@ def description(action, duration=0, music=None, set_wait_id=None, **kwargs): return _(message).format(*formats) +def pause(action, **kwargs): + if action.sleep_event_paused: + return + + action.sleep_event_paused = True + + if not action.sleep_event_timer.is_alive(): + return + + action.sleep_event_timer.cancel() + + action.sleep_event_left_time = action.sleep_event_left_time\ + - (time.time() - action.sleep_event_started_time) + if action.sleep_event_left_time < 0: + action.sleep_event.set() + +def unpause(action, **kwargs): + if not action.sleep_event_paused: + return + + action.sleep_event_paused = False + + action.sleep_event_timer = threading.Timer( + action.sleep_event_left_time, + action.sleep_event.set) + + action.sleep_event_timer.start() + action.sleep_event_started_time = time.time() + +def reset(action, **kwargs): + action.sleep_event_timer.cancel() + + action.sleep_event_left_time = action.sleep_event_initial_duration + + if action.sleep_event_paused: + return + + action.sleep_event_timer = threading.Timer( + action.sleep_event_left_time, + action.sleep_event.set) + + action.sleep_event_timer.start() + action.sleep_event_started_time = time.time() + def interrupt(action, duration=0, music=None, **kwargs): if action.sleep_event is not None: action.sleep_event.set() diff --git a/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po b/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po index 888d7a5..af27ca9 100644 --- a/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po +++ b/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po @@ -103,6 +103,14 @@ msgstr "mise en pause de « {} »" msgid "pausing all musics" msgstr "mise en pause des musiques" +#: music_sampler/actions/pause_wait.py:5 +msgid "pause wait with id {}" +msgstr "Mettre en pause l'attente d'identifiant {}" + +#: music_sampler/actions/pause_wait.py:5 +msgid "pause all waits" +msgstr "Mettre en pause toutes les attentes" + #: music_sampler/actions/play.py:50 msgid "starting « {} » at volume {}%" msgstr "lance « {} » au volume {}%" @@ -295,6 +303,14 @@ msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% en boucle (re msgid "starting all musics at {}s with {}s fade_in at volume {}% in loop (restarting if already running)" msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% en boucle (redémarre si déjà lancée)" +#: music_sampler/actions/reset_wait.py:5 +msgid "reset wait with id {}" +msgstr "Réinitialise l'attente d'identifiant {}" + +#: music_sampler/actions/reset_wait.py:5 +msgid "reset all waits" +msgstr "Réinitialise toutes les attentes" + #: music_sampler/actions/run_command.py:15 msgid "running command {}" msgstr "lance la commande {}" @@ -367,6 +383,14 @@ msgstr "reprend « {} »" msgid "unpausing all musics" msgstr "reprend toutes les musiques" +#: music_sampler/actions/unpause_wait.py:5 +msgid "unpause wait with id {}" +msgstr "Reprendre l'attente d'identifiant {}" + +#: music_sampler/actions/unpause_wait.py:5 +msgid "unpause all waits" +msgstr "Reprendre toutes les attentes" + #: music_sampler/actions/volume.py:32 msgid "{:+d}% to volume of « {} »" msgstr "{:+d}% sur le volume de « {} »" diff --git a/music_sampler/mapping.py b/music_sampler/mapping.py index 99c9977..9e40d40 100644 --- a/music_sampler/mapping.py +++ b/music_sampler/mapping.py @@ -206,15 +206,17 @@ class Mapping(RelativeLayout): self.wait_ids[None] = [] self.wait_ids[None].append(action_or_wait) - def interrupt_wait(self, wait_id=None): + def matching_wait_ids(self, wait_id=None): if wait_id is None: - ids_to_interrupt = list(self.wait_ids.keys()) + matching_ids = list(self.wait_ids.keys()) elif wait_id in self.wait_ids: - ids_to_interrupt = [wait_id] + matching_ids = [wait_id] else: - ids_to_interrupt = [] + matching_ids = [] + return matching_ids - for _wait_id in ids_to_interrupt: + def interrupt_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): action_or_waits = self.wait_ids[_wait_id] del(self.wait_ids[_wait_id]) for action_or_wait in action_or_waits: @@ -223,6 +225,27 @@ class Mapping(RelativeLayout): else: action_or_wait.set() + def pause_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.pause() + + def unpause_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.unpause() + + def reset_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.reset() + # Methods to control running keys def start_running(self, key, start_time): self.running.append((key, start_time)) -- cgit v1.2.3