Mercurial > nagslang
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 |
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 | 7 from nagslang.constants import ( |
8 FREQ, BITSIZE, CHANNELS, BUFFER, DEFAULT_SOUND_VOLUME, | |
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 | 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 | 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 | 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 | 56 def play_music(self, name, volume=DEFAULT_MUSIC_VOLUME): |
292 | 57 if not options.music: |
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 | 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() |