]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/blobdiff - helpers/music_file.py
Cleanup actions and subscribe to music events for loading
[perso/Immae/Projets/Python/MusicSampler.git] / helpers / music_file.py
index ccf60ce5eb8874f5b68dc81d48a89b9e86fd8626..aeba1b9912fd9d2aa74da3fddd8683fc9e21fb12 100644 (file)
@@ -32,7 +32,8 @@ class MusicFile:
         {
             'trigger': 'load',
             'source': 'initial',
-            'dest': 'loading'
+            'dest': 'loading',
+            'after': 'poll_loaded'
         },
         {
             'trigger': 'fail',
@@ -68,7 +69,8 @@ class MusicFile:
             'trigger': 'stopped',
             'source': '*',
             'dest': 'loaded',
-            'before': 'trigger_stopped_events'
+            'before': 'trigger_stopped_events',
+            'conditions': ['is_in_use']
         }
     ]
 
@@ -77,6 +79,7 @@ class MusicFile:
                 transitions=self.TRANSITIONS, initial='initial',
                 ignore_invalid_triggers=True)
 
+        self.loaded_callbacks = []
         self.mapping = mapping
         self.filename = filename
         self.name = name or filename
@@ -230,6 +233,21 @@ class MusicFile:
         self.wait_event.clear()
         self.wait_event.wait()
 
+    # Let other subscribe for an event when they are ready
+    def subscribe_loaded(self, callback):
+        with file_lock:
+            if self.is_loaded(allow_substates=True):
+                callback(True)
+            elif self.is_failed():
+                callback(False)
+            else:
+                self.loaded_callbacks.append(callback)
+
+    def poll_loaded(self):
+        for callback in self.loaded_callbacks:
+            callback(self.is_loaded())
+        self.loaded_callbacks = []
+
     # Callbacks
     def finished_callback(self):
         self.stopped()