Mercurial > mamba
view mamba/sound.py @ 283:11cf3a259eaa
Iterate over copies, to avoid some issues with children changing in the loop
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 15 Sep 2011 21:44:26 +0200 |
parents | cad653e4f59c |
children | cd544a311f11 |
line wrap: on
line source
"""Basic sound frame-work""" from pygame import mixer import pygame import os.path from mamba import data from mamba.constants import FREQ, BITSIZE, CHANNELS, BUFFER # Global constant for holding the initialised sound system _SOUND_SYSTEM = None # Utility functions, used elsewhere def load_sound(key, track_name, volume=None): if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.load_sound(key, track_name, volume) def play_sound(key): if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.play_sound(key) def play_music(track_name, volume=1.0): if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.play_background_music(track_name, volume) def stop_sound(): """Stop sounds and music""" if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.stop_sounds() _SOUND_SYSTEM.stop_music() def pause_music(): """Pause backgroun music""" if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.pause_music() def resume_music(): """Unpause music""" if _SOUND_SYSTEM is not None: _SOUND_SYSTEM.resume_music() class SoundSystem(object): def __init__(self, sound_on): global _SOUND_SYSTEM self.sound_enabled = False if _SOUND_SYSTEM is not None: # We've been initialised, so skip out return if sound_on: try: mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER) test_sound = mixer.Sound(data.filepath('sounds/silence.ogg')) test_sound.play() self.sound_enabled = True except pygame.error: print 'Unable to enable sound. Continuing without sound' self.sound_enabled = False self._sounds = {} _SOUND_SYSTEM = self def play_background_music(self, track_name, volume): """Play a looping track using pygame's music support""" if self.sound_enabled: try: mixer.music.load(data.filepath(track_name)) mixer.music.play(-1) # Loop sound mixer.music.set_volume(volume) except: print 'Unable to load track %s. Skipping' % track_name def stop_music(self): """Stop music""" if self.sound_enabled: mixer.music.stop() def load_sound(self, key, track_name, volume): """Load sounds so we can play them later""" if key in self._sounds: # Ignore multiple keys return if not self.sound_enabled: self._sounds[key] = None else: if not os.path.exists(data.filepath(track_name)): # Pygame doesn't error out for missing files, so # handle that ourselves print "Can't find sound %s. Skipping" % track_name self._sounds[key] = None return try: self._sounds[key] = pygame.mixer.Sound( data.filepath(track_name)) if volume is not None: self._sounds[key].set_volume(volume) except: print 'Unable to load sound %s. Skipping' % track_name self._sounds[key] = None def play_sound(self, key): """Play the sound""" sound = self._sounds.get(key, None) if sound: sound.play() def stop_sounds(self): """Stop any playing sounds""" if self.sound_enabled: mixer.stop() def pause_music(self): """Pause music""" if self.sound_enabled: mixer.music.pause() def resume_music(self): """Resume paused music""" if self.sound_enabled: mixer.music.unpause()