Mercurial > skaapsteker
annotate 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 |
rev | line source |
---|---|
262 | 1 """Support for playing sounds and music""" |
2 | |
3 from pygame import mixer | |
4 import pygame | |
5 from . import data | |
6 from .constants import FREQ, BITSIZE, CHANNELS, BUFFER | |
7 | |
529
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
8 _GLOBAL_SOUND = None |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
9 |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
10 |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
11 def load_sound(key, track_name, volume=None): |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
12 if _GLOBAL_SOUND is not None: |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
13 _GLOBAL_SOUND.load_sound(key, track_name, volume) |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
14 |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
15 def play_sound(key): |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
16 if _GLOBAL_SOUND is not None: |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
17 _GLOBAL_SOUND.play_sound(key) |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
18 |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
19 |
262 | 20 class SoundSystem(object): |
21 | |
22 def __init__(self, want_sound): | |
529
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
23 global _GLOBAL_SOUND |
262 | 24 if want_sound: |
25 # See if we can actually enabled sound | |
26 try: | |
553 | 27 mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER) |
28 test_sound = mixer.Sound(data.filepath('sounds/silence.ogg')) | |
29 test_sound.play() | |
30 self.sound_enabled = True | |
262 | 31 except pygame.error: |
632
0675f390653c
Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents:
553
diff
changeset
|
32 print('Unable to enable sound') |
553 | 33 self.sound_enabled = False |
262 | 34 else: |
35 self.sound_enabled = False | |
36 | |
37 self._sounds = {} | |
529
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
38 _GLOBAL_SOUND = self |
262 | 39 |
40 | |
453
9c9df17b98a7
Add support for choosing a volume. A music to temple.
Simon Cross <hodgestar@gmail.com>
parents:
263
diff
changeset
|
41 def play_background_music(self, track_name, volume=1.0): |
262 | 42 if self.sound_enabled: |
43 try: | |
44 mixer.music.load(data.filepath(track_name)) | |
45 mixer.music.play(-1) # Loop forever | |
453
9c9df17b98a7
Add support for choosing a volume. A music to temple.
Simon Cross <hodgestar@gmail.com>
parents:
263
diff
changeset
|
46 mixer.music.set_volume(volume) |
262 | 47 except pygame.error: |
632
0675f390653c
Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents:
553
diff
changeset
|
48 print('Unable to load track') |
262 | 49 |
50 def stop_music(self): | |
51 if self.sound_enabled: | |
52 mixer.music.stop() | |
53 | |
529
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
54 def load_sound(self, key, track_name, volume=None): |
262 | 55 if key in self._sounds: |
56 # First caller wins on duplicate keys | |
57 return | |
58 if not self.sound_enabled: | |
59 self._sounds[key] = None | |
60 else: | |
263 | 61 self._sounds[key] = pygame.mixer.Sound(data.filepath(track_name)) |
529
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
62 if volume is not None: |
0ffb493a6fa4
Add support for sounds for breaking objects.
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
63 self._sounds[key].set_volume(volume) |
262 | 64 |
65 def play_sound(self, key): | |
66 sound = self._sounds.get(key, None) | |
67 if sound: | |
68 sound.play() | |
69 | |
70 def stop_all_sounds(self): | |
71 if self.sound_enabled: | |
72 mixer.stop() | |
73 | |
505
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
74 def pause(self): |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
75 if self.sound_enabled: |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
76 mixer.music.pause() |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
77 |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
78 def unpause(self): |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
79 if self.sound_enabled: |
a89ab402b569
Pause music when pressing pause in level.
Simon Cross <hodgestar@gmail.com>
parents:
453
diff
changeset
|
80 mixer.music.unpause() |