summaryrefslogtreecommitdiff
path: root/display/snd_pygame.py
diff options
context:
space:
mode:
Diffstat (limited to 'display/snd_pygame.py')
-rw-r--r--display/snd_pygame.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/display/snd_pygame.py b/display/snd_pygame.py
new file mode 100644
index 0000000..e1a1455
--- /dev/null
+++ b/display/snd_pygame.py
@@ -0,0 +1,82 @@
+import sys
+from modes import musichtmloptiontext as htmloptionstext
+from pygame.locals import *
+import pygame.mixer
+
+if pygame.mixer is None:
+ raise ImportError
+
+
+#ENDMUSICEVENT = USEREVENT
+
+
+class Sound:
+ has_sound = has_music = 0 # until initialized
+
+ def __init__(self):
+ try:
+ pygame.mixer.init()
+ except pygame.error, e:
+ print >> sys.stderr, "sound disabled: %s" % str(e)
+ else:
+ self.has_sound = 1
+ try:
+ from pygame.mixer import music
+ except ImportError:
+ pass
+ else:
+ self.has_music = music is not None
+ self.cmusics = None
+
+ def close(self):
+ try:
+ pygame.mixer.stop()
+ except pygame.error:
+ pass
+ if self.has_music:
+ try:
+ pygame.mixer.music.stop()
+ except pygame.error:
+ pass
+
+ def sound(self, f):
+ return pygame.mixer.Sound(f.freezefilename())
+
+ def flop(self):
+ # the events are not processed if pygame is not also the display,
+ # so ENDMUSICEVENT will not arrive -- poll for end of music
+ if self.cmusics and not pygame.mixer.music.get_busy():
+ self.next_music()
+
+ def play(self, sound, lvolume, rvolume):
+ channel = pygame.mixer.find_channel(1)
+ channel.stop()
+ try:
+ channel.set_volume(lvolume, rvolume)
+ except TypeError:
+ channel.set_volume(0.5 * (lvolume+rvolume))
+ channel.play(sound)
+
+ def play_musics(self, musics, loop_from):
+ #dpy_pygame.EVENT_HANDLERS[ENDMUSICEVENT] = self.next_music
+ #pygame.mixer.music.set_endevent(ENDMUSICEVENT)
+ self.cmusics = musics, loop_from, 0
+ self.next_music()
+
+ def next_music(self, e=None):
+ if self.cmusics:
+ musics, loop_from, c = self.cmusics
+ if c >= len(musics): # end
+ c = loop_from
+ if c >= len(musics):
+ pygame.mixer.music.stop()
+ self.cmusics = None
+ return
+ pygame.mixer.music.load(musics[c].freezefilename())
+ pygame.mixer.music.play()
+ self.cmusics = musics, loop_from, c+1
+
+ def fadeout(self, millisec):
+ #print "fadeout:", millisec
+ pygame.mixer.music.fadeout(millisec)
+ self.cmusics = None