summaryrefslogtreecommitdiff
path: root/src/sliceitoff/sfx/sfx.py
blob: fd494b805efeb0b53cf8a5df1039aad4f57a9a6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
""" sfx.sfx - pygame.mixer initialization and sound effects handling """
import os
from pathlib import Path
import pygame

DEBUG = os.getenv("DEBUG")

class Sfx:
    """ Sound Effects and Music? """
    def __init__(self):
        self.initialized = False
        self.sound = {}
        self.bgm = None
        try:
            pygame.mixer.pre_init(channels=2, buffer=512, frequency=48000)
        except pygame.error:
            pass

    def init(self, base_path):
        """ To be called after pygame is initialized. Actual mixer init and
            sample loading happens here """
        try:
            pygame.mixer.init()
            self.initialized = True
            for mp3_file in Path(base_path).glob('*.mp3'):
                self.sound[str(mp3_file.stem)] = pygame.mixer.Sound(mp3_file)
                if DEBUG:
                    print("Loading sound:", mp3_file, str(mp3_file.stem))
        except pygame.error:
            pass

    def play(self, sample):
        """ Just plays named sample loaded from assets directory """
        if self.initialized:
            self.sound[sample].play()

    def music(self, music):
        """ Plays sample as music. There is only one music at the time """
        if not self.initialized:
            return
        if self.bgm == music:
            return
        if self.bgm:
            self.sound[self.bgm].fadeout(500)
        self.bgm = music
        if self.bgm:
            self.sound[self.bgm].play()

# Initialize only one time
try:
    # pylint: disable = used-before-assignment
    # This is intented behaviour
    sfx
except NameError:
    sfx = Sfx()