view skaapsteker/sound.py @ 632:0675f390653c

Initial port to Python 3 and Pygame 2.
author Simon Cross <hodgestar@gmail.com>
date Fri, 20 Jan 2023 20:01:06 +0100
parents 62569f486ede
children
line wrap: on
line source

"""Support for playing sounds and music"""

from pygame import mixer
import pygame
from . import data
from .constants import FREQ, BITSIZE, CHANNELS, BUFFER

_GLOBAL_SOUND = None


def load_sound(key, track_name, volume=None):
    if _GLOBAL_SOUND is not None:
        _GLOBAL_SOUND.load_sound(key, track_name, volume)

def play_sound(key):
    if _GLOBAL_SOUND is not None:
        _GLOBAL_SOUND.play_sound(key)


class SoundSystem(object):

    def __init__(self, want_sound):
        global _GLOBAL_SOUND
        if want_sound:
            # See if we can actually enabled sound
            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')
                self.sound_enabled = False
        else:
            self.sound_enabled = False

        self._sounds = {}
        _GLOBAL_SOUND = self


    def play_background_music(self, track_name, volume=1.0):
        if self.sound_enabled:
            try:
                mixer.music.load(data.filepath(track_name))
                mixer.music.play(-1)  # Loop forever
                mixer.music.set_volume(volume)
            except pygame.error:
                print('Unable to load track')

    def stop_music(self):
        if self.sound_enabled:
            mixer.music.stop()

    def load_sound(self, key, track_name, volume=None):
        if key in self._sounds:
            # First caller wins on duplicate keys
            return
        if not self.sound_enabled:
            self._sounds[key] = None
        else:
            self._sounds[key] = pygame.mixer.Sound(data.filepath(track_name))
            if volume is not None:
                self._sounds[key].set_volume(volume)

    def play_sound(self, key):
        sound = self._sounds.get(key, None)
        if sound:
            sound.play()

    def stop_all_sounds(self):
        if self.sound_enabled:
            mixer.stop()

    def pause(self):
        if self.sound_enabled:
            mixer.music.pause()

    def unpause(self):
        if self.sound_enabled:
            mixer.music.unpause()