X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=helpers%2Fmusic_file.py;h=2d3ba727ce6486771c54e6a99e0ee83a1ee076cf;hb=dd2887c2db888065f11534b2fe180d1ca7deb191;hp=aeba1b9912fd9d2aa74da3fddd8683fc9e21fb12;hpb=b7ca3fc2b6b05d3aafd44dd0b8e40a4707213ff5;p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git diff --git a/helpers/music_file.py b/helpers/music_file.py index aeba1b9..2d3ba72 100644 --- a/helpers/music_file.py +++ b/helpers/music_file.py @@ -48,7 +48,10 @@ class MusicFile: { 'trigger': 'start_playing', 'source': 'loaded', - 'dest': 'loaded_playing' + 'dest': 'loaded_playing', + # if a child has no transitions, then it is bubbled to the parent, + # and we don't want that. Not useful in that machine precisely. + 'conditions': ['is_loaded'] }, { 'trigger': 'pause', @@ -89,15 +92,50 @@ class MusicFile: threading.Thread(name="MSMusicLoad", target=self.load).start() + def reload_properties(self, name=None, gain=1): + self.name = name or self.filename + if gain != self.initial_volume_factor: + self.initial_volume_factor = gain + self.reload_music_file() + + def reload_music_file(self): + with file_lock: + try: + if self.filename.startswith("/"): + filename = self.filename + else: + filename = Config.music_path + self.filename + + debug_print("Reloading « {} »".format(self.name)) + initial_db_gain = gain(self.initial_volume_factor * 100) + self.audio_segment = pydub.AudioSegment \ + .from_file(filename) \ + .set_frame_rate(Config.frame_rate) \ + .set_channels(Config.channels) \ + .set_sample_width(Config.sample_width) \ + .apply_gain(initial_db_gain) + except Exception as e: + error_print("failed to reload « {} »: {}"\ + .format(self.name, e)) + self.loading_error = e + self.to_failed() + else: + debug_print("Reloaded « {} »".format(self.name)) + # Machine related events def on_enter_loading(self): with file_lock: try: + if self.filename.startswith("/"): + filename = self.filename + else: + filename = Config.music_path + self.filename + debug_print("Loading « {} »".format(self.name)) self.mixer = self.mapping.mixer or Mixer() initial_db_gain = gain(self.initial_volume_factor * 100) self.audio_segment = pydub.AudioSegment \ - .from_file(self.filename) \ + .from_file(filename) \ .set_frame_rate(Config.frame_rate) \ .set_channels(Config.channels) \ .set_sample_width(Config.sample_width) \ @@ -112,6 +150,9 @@ class MusicFile: debug_print("Loaded « {} »".format(self.name)) def on_enter_loaded(self): + self.cleanup() + + def cleanup(self): self.gain_effects = [] self.set_gain(0, absolute=True) self.current_audio_segment = None @@ -133,6 +174,7 @@ class MusicFile: def trigger_stopped_events(self): self.mixer.remove_file(self) self.wait_event.set() + self.cleanup() # Actions and properties called externally @property @@ -235,13 +277,14 @@ class MusicFile: # 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) + # 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: