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/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 ++++++++++++++++++++++++++++++++++- 5 files changed, 80 insertions(+), 1 deletion(-) 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/actions') 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() -- cgit v1.2.3