annotate nagslang/sound.py @ 665:a538d791ff9c v0.1.x

pygame.mixer.Sound is too clever by half and should be shot repeatedly
author Neil Muller <drnlmuller@gmail.com>
date Sun, 08 Sep 2013 12:35:33 +0200
parents e65d59081bdd
children 1ffd49c34f4a 45d2a6aef3a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Sound utilities."""
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 from pygame import mixer
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5 from nagslang.options import options
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6 from nagslang.resources import resources
598
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
7 from nagslang.constants import (
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
8 FREQ, BITSIZE, CHANNELS, BUFFER, DEFAULT_SOUND_VOLUME,
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
9 DEFAULT_MUSIC_VOLUME)
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12 class DummySound(object):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13 def init(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
15
598
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
16 def play_sound(self, name, volume=DEFAULT_SOUND_VOLUME):
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
17 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18
598
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
19 def play_music(self, name, volume=DEFAULT_MUSIC_VOLUME):
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
20 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
21
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
22 def pause_music(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
25 def resume_music(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28 def stop(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
29 pass
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
32 class PygameSound(object):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
33 def __init__(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
34 self._sounds = {}
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
36 def init(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
37 mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER)
665
a538d791ff9c pygame.mixer.Sound is too clever by half and should be shot repeatedly
Neil Muller <drnlmuller@gmail.com>
parents: 598
diff changeset
38 silence = self.load_sound("silence.ogg")
a538d791ff9c pygame.mixer.Sound is too clever by half and should be shot repeatedly
Neil Muller <drnlmuller@gmail.com>
parents: 598
diff changeset
39 if silence.get_length() < 1:
a538d791ff9c pygame.mixer.Sound is too clever by half and should be shot repeatedly
Neil Muller <drnlmuller@gmail.com>
parents: 598
diff changeset
40 raise RuntimeError("Sound load error - silence.ogg too short")
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41 self.play_sound("silence.ogg")
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
42
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
43 def load_sound(self, name):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
44 track_name = resources.get_resource_path("sounds", name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45 sound = self._sounds.get(track_name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
46 if sound is None:
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
47 sound = self._sounds[track_name] = mixer.Sound(track_name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
48 return sound
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
49
598
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
50 def play_sound(self, name, volume=DEFAULT_SOUND_VOLUME):
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
51 sound = self.load_sound(name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
52 if sound is not None:
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
53 sound.set_volume(volume)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 sound.play()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
55
598
e65d59081bdd Quieter sound.
Simon Cross <hodgestar@gmail.com>
parents: 591
diff changeset
56 def play_music(self, name, volume=DEFAULT_MUSIC_VOLUME):
292
7b121ed73b95 --no-music flag.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
57 if not options.music:
7b121ed73b95 --no-music flag.
Jeremy Thurgood <firxen@gmail.com>
parents: 269
diff changeset
58 return
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
59 track_name = resources.get_resource_path("music", name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
60 mixer.music.load(track_name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
61 mixer.music.set_volume(volume)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
62 mixer.music.play(-1) # loop sound
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
64 def pause_music(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65 mixer.music.pause()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
66
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
67 def unpause_music(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
68 mixer.music.unpause()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
69
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
70 def stop(self):
591
8dcf5176ffd8 Door sound.
Jeremy Thurgood <firxen@gmail.com>
parents: 292
diff changeset
71 mixer.fadeout(1000)
269
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
72 mixer.music.stop()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
73
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
74
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
75 class SoundProxy(object):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
76 def __init__(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
77 self._sound = DummySound()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
78
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
79 def init(self):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
80 """Attempt to initialize the sound system."""
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
81 if options.sound:
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
82 try:
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
83 pyg_sound = PygameSound()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
84 pyg_sound.init()
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
85 self._sound = pyg_sound
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
86 except Exception, err:
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
87 print "Failed to enable sound: %r" % (err,)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
88
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
89 def __getattr__(self, name):
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
90 return getattr(self._sound, name)
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
92
9fcdb106424a Add first draft of sound support.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
93 sound = SoundProxy()