aboutsummaryrefslogtreecommitdiff
path: root/helpers/music_file.py
diff options
context:
space:
mode:
Diffstat (limited to 'helpers/music_file.py')
-rw-r--r--helpers/music_file.py28
1 files changed, 25 insertions, 3 deletions
diff --git a/helpers/music_file.py b/helpers/music_file.py
index ccf60ce..a972bc5 100644
--- a/helpers/music_file.py
+++ b/helpers/music_file.py
@@ -32,7 +32,8 @@ class MusicFile:
32 { 32 {
33 'trigger': 'load', 33 'trigger': 'load',
34 'source': 'initial', 34 'source': 'initial',
35 'dest': 'loading' 35 'dest': 'loading',
36 'after': 'poll_loaded'
36 }, 37 },
37 { 38 {
38 'trigger': 'fail', 39 'trigger': 'fail',
@@ -47,7 +48,10 @@ class MusicFile:
47 { 48 {
48 'trigger': 'start_playing', 49 'trigger': 'start_playing',
49 'source': 'loaded', 50 'source': 'loaded',
50 'dest': 'loaded_playing' 51 'dest': 'loaded_playing',
52 # if a child has no transitions, then it is bubbled to the parent,
53 # and we don't want that. Not useful in that machine precisely.
54 'conditions': ['is_loaded']
51 }, 55 },
52 { 56 {
53 'trigger': 'pause', 57 'trigger': 'pause',
@@ -68,7 +72,8 @@ class MusicFile:
68 'trigger': 'stopped', 72 'trigger': 'stopped',
69 'source': '*', 73 'source': '*',
70 'dest': 'loaded', 74 'dest': 'loaded',
71 'before': 'trigger_stopped_events' 75 'before': 'trigger_stopped_events',
76 'conditions': ['is_in_use']
72 } 77 }
73 ] 78 ]
74 79
@@ -77,6 +82,7 @@ class MusicFile:
77 transitions=self.TRANSITIONS, initial='initial', 82 transitions=self.TRANSITIONS, initial='initial',
78 ignore_invalid_triggers=True) 83 ignore_invalid_triggers=True)
79 84
85 self.loaded_callbacks = []
80 self.mapping = mapping 86 self.mapping = mapping
81 self.filename = filename 87 self.filename = filename
82 self.name = name or filename 88 self.name = name or filename
@@ -230,6 +236,22 @@ class MusicFile:
230 self.wait_event.clear() 236 self.wait_event.clear()
231 self.wait_event.wait() 237 self.wait_event.wait()
232 238
239 # Let other subscribe for an event when they are ready
240 def subscribe_loaded(self, callback):
241 # FIXME: should lock to be sure we have no race, but it makes the
242 # initialization screen not showing until everything is loaded
243 if self.is_loaded(allow_substates=True):
244 callback(True)
245 elif self.is_failed():
246 callback(False)
247 else:
248 self.loaded_callbacks.append(callback)
249
250 def poll_loaded(self):
251 for callback in self.loaded_callbacks:
252 callback(self.is_loaded())
253 self.loaded_callbacks = []
254
233 # Callbacks 255 # Callbacks
234 def finished_callback(self): 256 def finished_callback(self):
235 self.stopped() 257 self.stopped()