From 1bd5c988b122534f357c79453aeffbb63380cbd1 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 25 Jun 2009 04:35:58 +0900 Subject: [PATCH] create mplayer threads lazily on play, make sure not to deadlock --- anki/sound.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/anki/sound.py b/anki/sound.py index c167585bf..cc9b357aa 100644 --- a/anki/sound.py +++ b/anki/sound.py @@ -115,6 +115,7 @@ else: mplayerQueue = [] mplayerManager = None +mplayerReader = None mplayerCond = threading.Condition() class MplayerReader(threading.Thread): @@ -166,9 +167,11 @@ class MplayerMonitor(threading.Thread): mplayerCmd, startupinfo=si, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except OSError: + mplayerCond.release() raise Exception("Audio player not found") def queueMplayer(path): + ensureMplayerThreads() path = path.encode(sys.getfilesystemencoding()) mplayerCond.acquire() mplayerQueue.append(path) @@ -180,7 +183,20 @@ def clearMplayerQueue(): mplayerQueue.append(None) mplayerCond.release() +def ensureMplayerThreads(): + global mplayerManager, mplayerReader + if not mplayerManager: + mplayerManager = MplayerMonitor() + mplayerManager.daemon = True + mplayerManager.start() + mplayerReader = MplayerReader() + mplayerReader.daemon = True + mplayerReader.start() + atexit.register(stopMplayer) + def stopMplayer(restart=False): + if not mplayerManager: + return mplayerCond.acquire() if mplayerManager.mplayer: while 1: @@ -206,14 +222,6 @@ def stopMplayer(restart=False): def stopMplayerOnce(): stopMplayer(restart=True) -mplayerManager = MplayerMonitor() -mplayerManager.daemon = True -mplayerManager.start() -mplayerReader = MplayerReader() -mplayerReader.daemon = True -mplayerReader.start() -atexit.register(stopMplayer) - addHook("deckClosed", stopMplayerOnce) # PyAudio recording