view mamba/sound.py @ 597:16c690a7dc27

Fix bare except clauses.
author Simon Cross <hodgestar@gmail.com>
date Sat, 14 Jan 2023 19:00:34 +0100
parents fca61cd8fc33
children
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('music/%s' % track_name))
                mixer.music.play(-1)  # Loop sound
                mixer.music.set_volume(volume)
            except Exception:
                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:
            track_name = data.filepath('sounds/%s' % track_name)
            if not os.path.exists(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(track_name)
                if volume is not None:
                    self._sounds[key].set_volume(volume)
            except Exception:
                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()