changeset 269:9fcdb106424a

Add first draft of sound support.
author Simon Cross <hodgestar@gmail.com>
date Thu, 05 Sep 2013 00:54:26 +0200
parents dda7689a3e87
children cb6d03012053
files nagslang/__main__.py nagslang/constants.py nagslang/screens/area.py nagslang/sound.py
diffstat 4 files changed, 96 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/__main__.py	Thu Sep 05 00:53:57 2013 +0200
+++ b/nagslang/__main__.py	Thu Sep 05 00:54:26 2013 +0200
@@ -6,6 +6,7 @@
 from nagslang.options import parse_args
 from nagslang.constants import SCREEN
 from nagslang.engine import Engine
+from nagslang.sound import sound
 
 
 def main():
@@ -16,6 +17,7 @@
     pygame.display.set_mode(SCREEN, pgl.SWSURFACE | pgl.RESIZABLE)
     #pygame.display.set_icon(load_image(...))
     pygame.display.set_caption('Nagslang')
+    sound.init()
 
     screen = pygame.display.get_surface()
     engine = Engine(screen)
--- a/nagslang/constants.py	Thu Sep 05 00:53:57 2013 +0200
+++ b/nagslang/constants.py	Thu Sep 05 00:54:26 2013 +0200
@@ -8,6 +8,12 @@
     sound=True,
 )
 
+# Sound constants
+FREQ = 44100   # same as audio CD
+BITSIZE = -16  # unsigned 16 bit
+CHANNELS = 2   # 1 == mono, 2 == stereo
+BUFFER = 1024  # audio buffer size in no. of samples
+
 COLLISION_TYPE_OTHER = 0
 COLLISION_TYPE_PLAYER = 1
 COLLISION_TYPE_WALL = 2
--- a/nagslang/screens/area.py	Thu Sep 05 00:53:57 2013 +0200
+++ b/nagslang/screens/area.py	Thu Sep 05 00:54:26 2013 +0200
@@ -10,6 +10,7 @@
 from nagslang.protagonist import Protagonist
 from nagslang.screens.base import Screen
 from nagslang.game_object import Bullet
+from nagslang.sound import sound
 
 
 class ControlKeys(object):
@@ -81,6 +82,7 @@
         else:
             self.add_protagonist()
         self.add_game_objects()
+        sound.play_music("POL-cyber-factory-short.ogg")
 
     def _collision_pre_solve_handler(self, space, arbiter):
         gobj = arbiter.shapes[1].physicser.game_object
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nagslang/sound.py	Thu Sep 05 00:54:26 2013 +0200
@@ -0,0 +1,86 @@
+"""Sound utilities."""
+
+from pygame import mixer
+
+from nagslang.options import options
+from nagslang.resources import resources
+from nagslang.constants import FREQ, BITSIZE, CHANNELS, BUFFER
+
+
+class DummySound(object):
+    def init(self):
+        pass
+
+    def play_sound(self, name, volume=None):
+        pass
+
+    def play_music(self, name, volume=None):
+        pass
+
+    def pause_music(self):
+        pass
+
+    def resume_music(self):
+        pass
+
+    def stop(self):
+        pass
+
+
+class PygameSound(object):
+    def __init__(self):
+        self._sounds = {}
+
+    def init(self):
+        mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER)
+        self.play_sound("silence.ogg")
+
+    def load_sound(self, name):
+        track_name = resources.get_resource_path("sounds", name)
+        sound = self._sounds.get(track_name)
+        if sound is None:
+            sound = self._sounds[track_name] = mixer.Sound(track_name)
+        return sound
+
+    def play_sound(self, name, volume=1.0):
+        sound = self.load_sound(name)
+        if sound is not None:
+            sound.set_volume(volume)
+            sound.play()
+
+    def play_music(self, name, volume=1.0):
+        track_name = resources.get_resource_path("music", name)
+        mixer.music.load(track_name)
+        mixer.music.set_volume(volume)
+        mixer.music.play(-1)  # loop sound
+
+    def pause_music(self):
+        mixer.music.pause()
+
+    def unpause_music(self):
+        mixer.music.unpause()
+
+    def stop(self):
+        mixer.stop()
+        mixer.music.stop()
+
+
+class SoundProxy(object):
+    def __init__(self):
+        self._sound = DummySound()
+
+    def init(self):
+        """Attempt to initialize the sound system."""
+        if options.sound:
+            try:
+                pyg_sound = PygameSound()
+                pyg_sound.init()
+                self._sound = pyg_sound
+            except Exception, err:
+                print "Failed to enable sound: %r" % (err,)
+
+    def __getattr__(self, name):
+        return getattr(self._sound, name)
+
+
+sound = SoundProxy()