# HG changeset patch # User Emmanuel Gil Peyrot # Date 1387402583 -3600 # Node ID 7c3c9046899672e390110dec2317ac244373c826 # Parent db28538cd399102cf0202cfc956fb58873893209 Inherit music players from a base class. diff --git a/pytouhou/game/game.pxd b/pytouhou/game/game.pxd --- a/pytouhou/game/game.pxd +++ b/pytouhou/game/game.pxd @@ -1,13 +1,15 @@ from pytouhou.game.effect cimport Effect from pytouhou.game.player cimport Player from pytouhou.game.text cimport Text, NativeText +from pytouhou.game.music cimport MusicPlayer from pytouhou.utils.random cimport Random cdef class Game: cdef public long width, height, nb_bullets_max, stage, rank, difficulty, difficulty_min, difficulty_max, frame cdef public list bullet_types, laser_types, item_types, players, enemies, effects, bullets, lasers, cancelled_bullets, players_bullets, players_lasers, items, labels, faces, hints, bonus_list - cdef public object interface, boss, msg_runner, sfx_player + cdef public object interface, boss, msg_runner cdef public dict texts + cdef public MusicPlayer sfx_player cdef public Random prng cdef public double continues cdef public Effect spellcard_effect diff --git a/pytouhou/game/music.pxd b/pytouhou/game/music.pxd new file mode 100644 --- /dev/null +++ b/pytouhou/game/music.pxd @@ -0,0 +1,3 @@ +cdef class MusicPlayer: + cpdef play(self, name) + cpdef set_volume(self, name, float volume) diff --git a/pytouhou/game/music.py b/pytouhou/game/music.py new file mode 100644 --- /dev/null +++ b/pytouhou/game/music.py @@ -0,0 +1,6 @@ +class MusicPlayer(object): + def play(self, name): + pass + + def set_volume(self, name, volume): + pass diff --git a/pytouhou/games/eosd.py b/pytouhou/games/eosd.py --- a/pytouhou/games/eosd.py +++ b/pytouhou/games/eosd.py @@ -282,7 +282,8 @@ class EoSDInterface(object): else: timeout_label.set_color('red') if (boss.timeout - boss.frame) % 60 == 0 and boss.timeout != 0: - self.game.sfx_player.play('timeout.wav', volume=1.) + self.game.sfx_player.set_volume('timeout.wav', 1.) + self.game.sfx_player.play('timeout.wav') timeout_label.set_text('%02d' % (timeout if timeout >= 0 else 0)) timeout_label.changed = True diff --git a/pytouhou/lib/sdl.pyx b/pytouhou/lib/sdl.pyx --- a/pytouhou/lib/sdl.pyx +++ b/pytouhou/lib/sdl.pyx @@ -66,7 +66,9 @@ class SDL(object): logger.error(u'Impossible to set up audio subsystem: %s', error) self.sound = False else: - mix_allocate_channels(MAX_CHANNELS) #TODO: make it dependent on the SFX number. + # TODO: make it dependent on the number of sound files in the + # archives. + mix_allocate_channels(MAX_SOUNDS) def __exit__(self, *args): if self.sound: diff --git a/pytouhou/ui/gamerunner.pyx b/pytouhou/ui/gamerunner.pyx --- a/pytouhou/ui/gamerunner.pyx +++ b/pytouhou/ui/gamerunner.pyx @@ -17,8 +17,9 @@ cimport cython from pytouhou.lib cimport sdl from .window cimport Window, Runner -from .music import MusicPlayer, SFXPlayer, NullPlayer +from .music import BGMPlayer, SFXPlayer from pytouhou.game.game cimport Game +from pytouhou.game.music cimport MusicPlayer cdef class GameRunner(Runner): @@ -65,9 +66,9 @@ cdef class GameRunner(Runner): self.save_keystates = save_keystates - null_player = NullPlayer() + null_player = MusicPlayer() if bgms is not None: - game.music = MusicPlayer(self.resource_loader, bgms) + game.music = BGMPlayer(self.resource_loader, bgms) game.music.play(0) else: game.music = null_player diff --git a/pytouhou/ui/music.pyx b/pytouhou/ui/music.pyx --- a/pytouhou/ui/music.pyx +++ b/pytouhou/ui/music.pyx @@ -18,11 +18,14 @@ from glob import glob from pytouhou.lib import sdl from pytouhou.lib cimport sdl from pytouhou.utils.helpers import get_logger +from pytouhou.game.music cimport MusicPlayer logger = get_logger(__name__) -class MusicPlayer(object): +cdef class BGMPlayer(MusicPlayer): + cdef list bgms + def __init__(self, resource_loader, bgms): self.bgms = [] for bgm in bgms: @@ -53,14 +56,19 @@ class MusicPlayer(object): self.bgms.append(None) logger.warn(u'No working music file for ā€œ%sā€, disabling bgm.', globname) - def play(self, index): + cpdef play(self, index): cdef sdl.Music bgm bgm = self.bgms[index] if bgm is not None: bgm.play(-1) -class SFXPlayer(object): +cdef class SFXPlayer(MusicPlayer): + cdef object loader + cdef dict channels, sounds + cdef float volume + cdef int next_channel + def __init__(self, loader, volume=.42): self.loader = loader self.channels = {} @@ -68,13 +76,13 @@ class SFXPlayer(object): self.volume = volume self.next_channel = 0 - def get_channel(self, name): + cdef int get_channel(self, name): if name not in self.channels: self.channels[name] = self.next_channel self.next_channel += 1 return self.channels[name] - def get_sound(self, name): + cdef sdl.Chunk get_sound(self, name): cdef sdl.Chunk chunk if name not in self.sounds: wave_file = self.loader.get_file(name) @@ -88,20 +96,13 @@ class SFXPlayer(object): self.sounds[name] = chunk return self.sounds[name] - def play(self, name, volume=None): - cdef sdl.Chunk sound + cpdef play(self, name): sound = self.get_sound(name) if sound is None: return channel = self.get_channel(name) - if volume: - sdl.mix_volume(channel, volume) sound.play(channel, 0) - -class NullPlayer(object): - def __init__(self, loader=None, bgms=None): - pass - - def play(self, name, volume=None): - pass + cpdef set_volume(self, name, float volume): + chunk = self.get_sound(name) + chunk.set_volume(volume) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -125,7 +125,7 @@ setup(name='PyTouhou', 'profile': debug}, compile_time_env={'MAX_TEXTURES': 128, 'MAX_ELEMENTS': 640 * 4 * 3, - 'MAX_CHANNELS': 26, + 'MAX_SOUNDS': 26, 'USE_OPENGL': use_opengl, 'USE_GLEW': is_windows}), scripts=['eosd'] + (['anmviewer'] if anmviewer else []),