diff options
Diffstat (limited to 'helpers/music_file.py')
-rw-r--r-- | helpers/music_file.py | 28 |
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() |