+ def abandon_all_effects(self):
+ db_gain = 0
+ for gain_effect in self.gain_effects:
+ db_gain += gain_effect.get_last_gain()
+
+ self.gain_effects = []
+ self.set_gain(db_gain)
+
+ def set_volume(self, value, delta=False, fade=0):
+ [db_gain, self.volume] = gain(
+ value + int(delta) * self.volume,
+ self.volume)
+
+ self.set_gain_with_effect(db_gain, fade=fade)
+
+ def set_gain_with_effect(self, db_gain, fade=0):
+ if not self.is_in_use():
+ return
+
+ if fade > 0:
+ self.add_fade_effect(db_gain, fade)
+ else:
+ self.set_gain(db_gain)
+
+ def wait_end(self):
+ self.wait_event.clear()
+ self.wait_event.wait()
+
+ # Let other subscribe for an event when they are ready
+ def subscribe_loaded(self, callback):
+ # FIXME: should lock to be sure we have no race, but it makes the
+ # initialization screen not showing until everything is loaded
+ 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()