import pygame import time class Action: action_types = [ 'command', 'pause', 'play', 'stop', 'stop_all_actions', 'unpause', 'volume', 'wait', ] def __init__(self, action, key, **kwargs): if action in self.action_types: self.action = action else: raise Exception("Unknown action {}".format(action)) self.key = key self.arguments = kwargs def ready(self): if 'music' in self.arguments: return self.arguments['music'].loaded else: return True def run(self): print(self.description()) getattr(self, self.action)(**self.arguments) pygame.event.post(pygame.event.Event(pygame.USEREVENT)) def description(self): return getattr(self, self.action + "_print")(**self.arguments) def command(self, command = "", **kwargs): pass def pause(self, music = None, **kwargs): if music is not None: music.pause() else: pygame.mixer.pause() def unpause(self, music = None, **kwargs): if music is not None: music.unpause() else: pygame.mixer.unpause() def play(self, music = None, fade_in = 0, start_at = 0, restart_if_running = False, volume = 100, **kwargs): if music is not None: if restart_if_running: if music.is_playing(): music.stop() music.play(volume = volume, fade_in = fade_in, start_at = start_at) else: if not music.is_playing(): music.play(volume = volume, fade_in = fade_in, start_at = start_at) else: pygame.mixer.unpause() def stop(self, music = None, fade_out = 0, **kwargs): if music is not None: music.stop(fade_out = fade_out) else: if fade_out > 0: pygame.fadeout(fade_out * 1000) else: pygame.mixer.stop() def stop_all_actions(self, **kwargs): self.key.mapping.stop_all_running() def volume(self, music = None, value = 100, **kwargs): if music is not None: music.set_volume(value) else: pass def wait(self, duration = 0, music = None, **kwargs): # FIXME: Make it stoppable # http://stackoverflow.com/questions/29082268/python-time-sleep-vs-event-wait if music is None: time.sleep(duration) else: # TODO music.wait_end() def command_print(self, command = "", **kwargs): return "running command {}".format(command) def pause_print(self, music = None, **kwargs): if music is not None: return "pausing « {} »".format(music.name) else: return "pausing all musics" def unpause_print(self, music = None, **kwargs): if music is not None: return "unpausing « {} »".format(music.name) else: return "unpausing all musics" def play_print(self, music = None, fade_in = 0, start_at = 0, restart_if_running = False, volume = 100, **kwargs): message = "starting " if music is not None: message += "« {} »".format(music.name) else: message += "music" if start_at != 0: message += " at {}s".format(start_at) if fade_in != 0: message += " with {}s fade_in".format(fade_in) message += " at volume {}%".format(volume) if restart_if_running: message += " (restarting if already running)" return message def stop_print(self, music = None, fade_out = 0, **kwargs): if music is not None: if fade_out == 0: return "stopping music « {} »".format(music.name) else: return "stopping music « {} » with {}s fadeout".format(music.name, fade_out) else: if fade_out == 0: return "stopping all musics" else: return "stopping all musics with {}s fadeout".format(fade_out) def stop_all_actions_print(self, **kwargs): return "stopping all actions" def volume_print(self, music = None, value = 100, **kwargs): if music is not None: return "setting volume of « {} » to {}%".format(music.name, value) else: return "setting volume to {}%".format(value) def wait_print(self, duration, **kwargs): return "waiting {}s".format(duration)