Mercurial > boomslang
diff pyntnclick/sound.py @ 854:79b5c1be9a5e default tip
Remove pyntnclick, it's its own library, now
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 21 Jun 2014 22:06:09 +0200 |
parents | f95830b58336 |
children |
line wrap: on
line diff
--- a/pyntnclick/sound.py Sat Jun 21 22:04:35 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -# sound management for pyntnclick - -from random import randrange - - -import pygame - -try: - from pygame.mixer import Sound as pygame_Sound - from pygame.mixer import music - pygame_import_error = None -except ImportError, e: - # Save error, so we don't crash and can do the right thing later - pygame_import_error = e - pygame_Sound = None - music = None - -from pyntnclick.resources import ResourceNotFound -from pyntnclick.engine import MUSIC_ENDED - - -class PlayList(object): - """Hold a playlist of music filenames""" - - def __init__(self, pieces, random, repeat): - self._pieces = pieces - self._random = random - self._repeat = repeat - - def get_next(self): - # Get the next piece - if self._pieces: - if self._random: - if not self._repeat or len(self._pieces) < 3: - i = randrange(0, len(self._pieces)) - else: - # Ignore the last entry, since we possibly just played it - i = randrange(0, len(self._pieces) - 1) - else: - i = 0 - result = self._pieces.pop(i) - if self._repeat: - self._pieces.append(result) - return result - return None - - -class DummySound(object): - """A dummy sound object. - - This is a placeholder object with the same API as - pygame.mixer.Sound which does nothing. Used when - sounds are disabled so scense don't need to worry - about the details. - - Inpsired by the same idea in Albow (by Greg Ewing)""" - - def play(self, *args): - pass - - def stop(self): - pass - - def get_length(self): - return 0.0 - - def get_num_channel(self): - return 0 - - def get_volume(self): - return 0.0 - - def fadeout(self, *args): - pass - - -class Sound(object): - """Global sound management and similiar useful things""" - - def __init__(self, resource_finder): - self.sound_enabled = False - self.sound_cache = {} - self._resource_finder = resource_finder - self._current_playlist = None - - def enable_sound(self, constants): - """Attempt to initialise the sound system""" - if pygame_Sound is None: - self.disable_sound(pygame_import_error) - return - try: - pygame.mixer.init(constants.snd_freq, - constants.snd_bitsize, - constants.snd_channels, - constants.snd_buffer) - self.sound_enabled = True - music.set_endevent(MUSIC_ENDED) - except pygame.error, exc: - self.disable_sound(exc) - - def disable_sound(self, exc=None): - """Disable the sound system""" - self.sound_enabled = False - if exc is not None: - print 'Failed to initialise sound system' - print 'Error: %s' % exc - print 'Sound disabled' - - def get_sound(self, *names): - if not self.sound_enabled: - return DummySound() - sound = None - try: - path = self._resource_finder.get_resource_path("sounds", *names) - sound = self.sound_cache.get(path, None) - except ResourceNotFound: - print "Sound file not found: %s" % names - # Cache failed lookup - sound = DummySound() - self.sound_cache[path] = sound - if sound is None: - try: - sound = pygame_Sound(path) - except pygame.error: - print "Sound file not found: %s" % names - sound = DummySound() - self.sound_cache[path] = sound - return sound - - def get_playlist(self, pieces, random=False, repeat=False): - return PlayList(pieces, random, repeat) - - def get_music(self, name): - if self.sound_enabled: - music_file = self._resource_finder.get_resource_path("sounds", - name) - return music_file - return None - - def music_ended(self): - if self._current_playlist: - # Try start the next tune - self.start_next_music() - - def change_playlist(self, new_playlist): - if self.sound_enabled: - music.stop() - self._current_playlist = new_playlist - self.start_next_music() - - def start_next_music(self): - if self._current_playlist: - tune = self._current_playlist.get_next() - if tune: - music.load(tune) - music.play() - - def get_current_playlist(self): - return self._current_playlist