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 as e:
print("sound disabled: %s" % str(e), file=sys.stderr)
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