diff --git a/pgfw/Audio.py b/pgfw/Audio.py index 7cb1dd0..9905ec1 100644 --- a/pgfw/Audio.py +++ b/pgfw/Audio.py @@ -11,16 +11,16 @@ from .extension import * class Audio(Animation): UP, DOWN = .1, -.1 - BASE_VOLUME = 1.0 CONFIG_SEPARATOR = "," def __init__(self, game): Animation.__init__(self, game) # self.original_volumes = {} self.current_bgm = None - self.volume = self.BASE_VOLUME + self.volume = 1.0 + self.pre_muted_volume = None if self.check_command_line("-mute"): - self.volume = 0 + self.get_configuration().set("audio", "volume", 0) self.register(self.play_sfx) self.audio_panel = AudioPanel(self) self.subscribe(self.respond) @@ -28,19 +28,34 @@ class Audio(Animation): self.load_sfx() self.bgm = {} self.load_bgm() + self.set_volume(self.get_configuration("audio", "volume")) - def set_volume(self, volume=None, increment=None, mute=False): + def set_volume(self, volume=None, increment=None, mute=False, unmute=False): if mute: + self.pre_muted_volume = self.volume self.volume = 0 + elif unmute and self.pre_muted_volume is not None: + self.volume = self.pre_muted_volume + self.pre_muted_volume = None elif increment: self.volume = clamp(self.volume + increment, 0, 1.0) else: self.volume = volume + self.get_configuration().set("audio", "volume", self.volume) + if pygame.mixer.music.get_busy(): + pygame.mixer.music.set_volume(self.current_bgm.volume * self.volume) + for ii in range(pygame.mixer.get_num_channels()): + channel = pygame.mixer.Channel(ii) + if channel.get_busy(): + channel.set_volume(channel.get_sound().get_volume() * self.volume) def respond(self, event): compare = self.get_game().delegate.compare if compare(event, "volume-mute"): - self.set_volume(mute=True) + if self.volume > 0: + self.set_volume(mute=True) + else: + self.set_volume(unmute=True) elif compare(event, "volume-up"): self.set_volume(increment=self.UP) elif compare(event, "volume-down"): @@ -163,7 +178,7 @@ class Audio(Animation): pygame.mixer.music.play(-1, start) except pygame.error: pygame.mixer.music.play(-1) - pygame.mixer.music.set_volume(bgm.get_volume()) + pygame.mixer.music.set_volume(bgm.get_volume() * self.get_configuration("audio", "volume")) if store_as_current: self.current_bgm = bgm @@ -229,7 +244,7 @@ class SoundEffect(GameChild, pygame.mixer.Sound): def play(self, loops=None, maxtime=None, fade_ms=None, position=None, x=None): self.set_volume( - self.local_volume * self.get_configuration("audio", "sfx-volume")) + self.local_volume * self.get_configuration("audio", "volume")) if loops is None: loops = self.loops if maxtime is None: diff --git a/pgfw/Configuration.py b/pgfw/Configuration.py index 610e69c..5381280 100644 --- a/pgfw/Configuration.py +++ b/pgfw/Configuration.py @@ -150,6 +150,8 @@ class Configuration(RawConfigParser): set_option(section, "bgm-repository-path", "~/storage/audio/bgm", False) set_option(section, "bgm-project-path", "bgm", False) set_option(section, "sfx-volume", "1.0", False) + set_option(section, "bgm-volume", "1.0", False) + set_option(section, "volume", "1.0", False) set_option(section, "panel-font", None, False) section = "interpolator-gui" add_section(section) @@ -450,7 +452,7 @@ class TypeDeclarations(dict): "bgm-repository-path", "bgm-project-path" ], - "float": "sfx-volume" + "float": ["sfx-volume", "bgm-volume", "volume"] }, "event": {"int": "command-id-offset"}, diff --git a/pgfw/extension.py b/pgfw/extension.py index 370cc08..8e13027 100644 --- a/pgfw/extension.py +++ b/pgfw/extension.py @@ -125,9 +125,11 @@ def constrain_dimensions_2d(vector, container): dh = vector[1] - container[1] if dw > 0 or dh > 0: if dw > dh: - size = container[0], int(round(container[0] / vector[0] * vector[1])) + size = Vector(container[0], int(round(container[0] / vector[0] * vector[1]))) else: - size = int(round(container[1] / vector[1] * vector[0])), container[1] + size = Vector(int(round(container[1] / vector[1] * vector[0])), container[1]) + else: + size = Vector(vector[0], vector[1]) return size # from http://www.realtimerendering.com/resources/GraphicsGems/gemsii/xlines.c