diff --git a/anki/sound.py b/anki/sound.py index 7ccf26274..836398fe6 100644 --- a/anki/sound.py +++ b/anki/sound.py @@ -8,30 +8,10 @@ Sound support """ __docformat__ = 'restructuredtext' -import re, sys +import re, sys, threading, time, subprocess, os -try: - import pygame - pygame.mixer.pre_init(44100,-16,2, 1024 * 3) - pygame.mixer.init() - soundsAvailable = True -except: - soundsAvailable = False - print "Warning, pygame not available. No sounds will play." - -def playPyGame(path): - "Play a sound. Expects a unicode pathname." - if not soundsAvailable: - return - path = path.encode(sys.getfilesystemencoding()) - try: - if pygame.mixer.music.get_busy(): - pygame.mixer.music.queue(path) - else: - pygame.mixer.music.load(path) - pygame.mixer.music.play() - except pygame.error: - return +# Shared utils +########################################################################## def playFromText(text): for match in re.findall("\[sound:(.*?)\]", text): @@ -43,6 +23,71 @@ def stripSounds(text): def hasSound(text): return re.search("\[sound:.*?\]", text) is not None +# External audio +########################################################################## + +queue = [] +manager = None + +if sys.platform.startswith("win32"): + externalPlayer = ["c:\\program files\\windows media player\\wmplayer.exe"] +else: + externalPlayer = ["mplayer", "-really-quiet"] + +# don't show box on windows +if sys.platform == "win32": + si = subprocess.STARTUPINFO() + si.dwFlags |= subprocess.STARTF_USESHOWWINDOW +else: + si = None + +class QueueMonitor(threading.Thread): + + def run(self): + while 1: + time.sleep(0.1) + if queue: + path = queue.pop(0) + p = subprocess.Popen(externalPlayer + [path], + startupinfo=si) + p.wait() + else: + return + +def playExternal(path): + global manager + path = os.path.abspath(path).encode(sys.getfilesystemencoding()) + queue.append(path) + if not manager or not manager.isAlive(): + manager = QueueMonitor() + manager.start() + +# Pygame +########################################################################## + +# try: +# import pygame +# pygame.mixer.pre_init(44100,-16,2, 1024 * 3) +# pygame.mixer.init() +# soundsAvailable = True +# except: +# soundsAvailable = False +# print "Warning, pygame not available. No sounds will play." + +# def playPyGame(path): +# "Play a sound. Expects a unicode pathname." +# if not soundsAvailable: +# return +# path = path.encode(sys.getfilesystemencoding()) +# try: +# if pygame.mixer.music.get_busy(): +# pygame.mixer.music.queue(path) +# else: +# pygame.mixer.music.load(path) +# pygame.mixer.music.play() +# except pygame.error: +# return + # Mac audio support ########################################################################## @@ -89,7 +134,10 @@ try: except ImportError: pass +# Default audio player +########################################################################## + if sys.platform.startswith("darwin"): play = playOSX else: - play = playPyGame + play = playExternal