Mercurial > touhou
comparison pytouhou/ui/music.pyx @ 455:6864a38b2413
Make pytouhou.lib.sdl cimportable, and convert pytouhou.ui.window.* to extension types.
| author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
|---|---|
| date | Mon, 02 Sep 2013 22:16:38 +0200 |
| parents | pytouhou/ui/music.py@b1248bab2d0f |
| children | ca22df9e70bc |
comparison
equal
deleted
inserted
replaced
| 454:a502887557ac | 455:6864a38b2413 |
|---|---|
| 1 # -*- encoding: utf-8 -*- | |
| 2 ## | |
| 3 ## Copyright (C) 2012 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> | |
| 4 ## | |
| 5 ## This program is free software; you can redistribute it and/or modify | |
| 6 ## it under the terms of the GNU General Public License as published | |
| 7 ## by the Free Software Foundation; version 3 only. | |
| 8 ## | |
| 9 ## This program is distributed in the hope that it will be useful, | |
| 10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 12 ## GNU General Public License for more details. | |
| 13 ## | |
| 14 | |
| 15 | |
| 16 from os.path import join | |
| 17 from glob import glob | |
| 18 from pytouhou.lib cimport sdl | |
| 19 from pytouhou.utils.helpers import get_logger | |
| 20 | |
| 21 logger = get_logger(__name__) | |
| 22 | |
| 23 | |
| 24 class MusicPlayer(object): | |
| 25 def __init__(self, resource_loader, bgms): | |
| 26 self.bgms = [] | |
| 27 for bgm in bgms: | |
| 28 if not bgm: | |
| 29 self.bgms.append(None) | |
| 30 continue | |
| 31 posname = bgm[1].replace('bgm/', '').replace('.mid', '.pos') | |
| 32 try: | |
| 33 track = resource_loader.get_track(posname) | |
| 34 except KeyError: | |
| 35 self.bgms.append(None) | |
| 36 logger.warn(u'Music description “%s” not found.', posname) | |
| 37 continue | |
| 38 globname = join(resource_loader.game_dir, bgm[1]).replace('.mid', '.*') | |
| 39 filenames = glob(globname) | |
| 40 for filename in reversed(filenames): | |
| 41 try: | |
| 42 source = sdl.load_music(filename) | |
| 43 except sdl.SDLError as error: | |
| 44 logger.debug(u'Music file “%s” unreadable: %s', filename, error) | |
| 45 continue | |
| 46 else: | |
| 47 source.set_loop_points(track.start / 44100., track.end / 44100.) #TODO: retrieve the sample rate from the actual track. | |
| 48 self.bgms.append(source) | |
| 49 logger.debug(u'Music file “%s” opened.', filename) | |
| 50 break | |
| 51 else: | |
| 52 self.bgms.append(None) | |
| 53 logger.warn(u'No working music file for “%s”, disabling bgm.', globname) | |
| 54 | |
| 55 def play(self, index): | |
| 56 cdef sdl.Music bgm | |
| 57 bgm = self.bgms[index] | |
| 58 if bgm: | |
| 59 bgm.play(-1) | |
| 60 | |
| 61 | |
| 62 class SFXPlayer(object): | |
| 63 def __init__(self, loader, volume=.42): | |
| 64 self.loader = loader | |
| 65 self.channels = {} | |
| 66 self.sounds = {} | |
| 67 self.volume = volume | |
| 68 self.next_channel = 0 | |
| 69 | |
| 70 def get_channel(self, name): | |
| 71 if name not in self.channels: | |
| 72 self.channels[name] = self.next_channel | |
| 73 self.next_channel += 1 | |
| 74 return self.channels[name] | |
| 75 | |
| 76 def get_sound(self, name): | |
| 77 if name not in self.sounds: | |
| 78 wave_file = self.loader.get_file(name) | |
| 79 chunk = sdl.load_chunk(wave_file) | |
| 80 chunk.set_volume(self.volume) | |
| 81 self.sounds[name] = chunk | |
| 82 return self.sounds[name] | |
| 83 | |
| 84 def play(self, name, volume=None): | |
| 85 cdef sdl.Chunk sound | |
| 86 sound = self.get_sound(name) | |
| 87 channel = self.get_channel(name) | |
| 88 if volume: | |
| 89 sdl.mix_volume(channel, volume) | |
| 90 sound.play(channel, 0) | |
| 91 | |
| 92 | |
| 93 class NullPlayer(object): | |
| 94 def __init__(self, loader=None, bgms=None): | |
| 95 pass | |
| 96 | |
| 97 def play(self, name, volume=None): | |
| 98 pass |
