reimplemented volume controls

This commit is contained in:
Frank DeMarco 2020-05-27 04:31:27 -04:00
parent 823149738b
commit b9bdbc5787
3 changed files with 29 additions and 10 deletions

View File

@ -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:

View File

@ -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"},

View File

@ -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