]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/commitdiff
Make 'interrupt_wait' able to interrupt all waits
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Fri, 12 Aug 2016 12:51:32 +0000 (14:51 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Fri, 12 Aug 2016 12:51:32 +0000 (14:51 +0200)
If 'wait_id' is not specified, interrupt_wait will now stop all wait events.
This fixes https://git.immae.eu/mantisbt/view.php?id=4

documentation_en.md
documentation_fr.md
music_sampler/actions/interrupt_wait.py
music_sampler/actions/wait.py
music_sampler/locales/fr/LC_MESSAGES/music_sampler.po
music_sampler/mapping.py
music_sampler/music_file.py

index d65e7ad6f4ce95e752f96c55aa4333be277b83d6..899ef1ad77ba8eda0fc58a8073fe0ca30dc652b5 100644 (file)
@@ -386,9 +386,9 @@ actions.
       action. When false, it is thus useless to add actions after that one.
 - `interrupt_wait`: stop a wait event (normal `wait` or fade out wait). The keys
   that were waiting will move to the next actions. Parameters:
-    * `wait_id: name` : gives the id of the `wait` to interrupt (defined with
-      `set_wait_id`, see actions `wait` and `stop`). To interrupt several waits,
-      use the same action several times.
+    * `wait_id: name` (optional) gives the id of the `wait` to interrupt (defined with
+      `set_wait_id`, see actions `wait` and `stop`). If not given, interrupts
+      all wait events.
 - `run_command` : Run a command. Parameters:
     * `command: my_command` : Gives the command to run.
     * `wait: true/false` (optional, default false) if true, waits for the
index 64e3a4f7b09b2adcebafbed4f9d2c37516e2c30a..ff3cfe81cd4139dbbdca0bb5a86c201a5c355a26 100644 (file)
@@ -432,10 +432,9 @@ successivement mais sans attendre (donc presque simultanément) : ne pas hésite
       suite de celle-ci puisqu'elles seront systématiquement interrompues.
 - `interrupt_wait`: interrompt l'attente (de `wait` ou fin d'un fondu avec
   attente) et passe directement à l'action suivante. Paramètre :
-    * `wait_id: name` : précise l'identifiant du `wait` à stopper (défini par
-      `set_wait_id`, voir les actions `wait` et `stop`). Pour interrompre
-      plusieurs `wait` d'un seul coup, il faut mettre plusieurs
-      `interrupt_wait`.
+    * `wait_id: name` (facultatif) précise l'identifiant du `wait` à stopper
+      (défini par `set_wait_id`, voir les actions `wait` et `stop`). Si absent,
+      interrompt toutes les attentes.
 - `run_command` : lance une commande. Paramètres :
     * `command: my_command` : précise la commande à lancer.
     * `wait: true/false` (facultatif, défaut : false) : si `wait` est true,
index f85a3c4c58e48403766203453f385b294c509c61..b36762809418e710718d547db0bcbe219eba0b7c 100644 (file)
@@ -2,4 +2,7 @@ def run(action, wait_id=None, **kwargs):
     action.mapping.interrupt_wait(wait_id)
 
 def description(action, wait_id=None, **kwargs):
-    return _("interrupt wait with id {}").format(wait_id)
+    if wait_id is None:
+        return _("interrupt all waits")
+    else:
+        return _("interrupt wait with id {}").format(wait_id)
index e6d07f24de9d2b042f149b73ae6966c31de404a7..bcee64941cc93c160b0673612146c2740abecc9a 100644 (file)
@@ -1,8 +1,7 @@
 import threading
 
 def run(action, duration=0, music=None, set_wait_id=None, **kwargs):
-    if set_wait_id is not None:
-        action.mapping.add_wait_id(set_wait_id, action)
+    action.mapping.add_wait(action, wait_id=set_wait_id)
 
     action.sleep_event = threading.Event()
     action.sleep_event_timer = threading.Timer(
index f603a3d80edc76aa508699f53ce13b9dadb0791a..888d7a5e31769c757e273d2cdde98714901c29c1 100644 (file)
@@ -91,6 +91,10 @@ msgstr "L'argument '-V' ne peut être utilisé que dans la version compilée"
 msgid "interrupt wait with id {}"
 msgstr "Interrompre l'attente d'identifiant {}"
 
+#: music_sampler/actions/interrupt_wait.py:5
+msgid "interrupt all waits"
+msgstr "Interrompre toutes les attentes"
+
 #: music_sampler/actions/pause.py:8
 msgid "pausing « {} »"
 msgstr "mise en pause de « {} »"
index 50b68a9d903df95b0236cf76b4c39245628e9403..a04c2f6ec550021dacc65ec891a4d4e7a5f6f731 100644 (file)
@@ -197,17 +197,30 @@ class Mapping(RelativeLayout):
             music.set_gain_with_effect(db_gain, fade=fade)
 
     # Wait handler methods
-    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 add_wait(self, action_or_wait, wait_id=None):
+        if wait_id is not None:
+            self.wait_ids[wait_id] = [action_or_wait]
+        else:
+            if None not in self.wait_ids:
+                self.wait_ids[None] = []
+            self.wait_ids[None].append(action_or_wait)
+
+    def interrupt_wait(self, wait_id=None):
+        if wait_id is None:
+            ids_to_interrupt = list(self.wait_ids.keys())
+        elif wait_id in self.wait_ids:
+            ids_to_interrupt = [wait_id]
+        else:
+            ids_to_interrupt = []
+
+        for _wait_id in ids_to_interrupt:
+            action_or_waits = self.wait_ids[_wait_id]
+            del(self.wait_ids[_wait_id])
+            for action_or_wait in action_or_waits:
+                if isinstance(action_or_wait, Action):
+                    action_or_wait.interrupt()
+                else:
+                    action_or_wait.set()
 
     # Methods to control running keys
     def start_running(self, key, start_time):
index fa6293db9d9193df8811fab23842e5765cf30ca9..4ba65e342b921f2cd74f93feaecea7d7b223cf7a 100644 (file)
@@ -241,8 +241,7 @@ class MusicFile:
                 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.mapping.add_wait(self.wait_event, wait_id=set_wait_id)
                 self.wait_end()
         else:
             self.stopped()