mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
create mplayer threads lazily on play, make sure not to deadlock
This commit is contained in:
parent
b5b3f9fd8c
commit
1bd5c988b1
1 changed files with 16 additions and 8 deletions
|
@ -115,6 +115,7 @@ else:
|
||||||
|
|
||||||
mplayerQueue = []
|
mplayerQueue = []
|
||||||
mplayerManager = None
|
mplayerManager = None
|
||||||
|
mplayerReader = None
|
||||||
mplayerCond = threading.Condition()
|
mplayerCond = threading.Condition()
|
||||||
|
|
||||||
class MplayerReader(threading.Thread):
|
class MplayerReader(threading.Thread):
|
||||||
|
@ -166,9 +167,11 @@ class MplayerMonitor(threading.Thread):
|
||||||
mplayerCmd, startupinfo=si, stdin=subprocess.PIPE,
|
mplayerCmd, startupinfo=si, stdin=subprocess.PIPE,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
except OSError:
|
except OSError:
|
||||||
|
mplayerCond.release()
|
||||||
raise Exception("Audio player not found")
|
raise Exception("Audio player not found")
|
||||||
|
|
||||||
def queueMplayer(path):
|
def queueMplayer(path):
|
||||||
|
ensureMplayerThreads()
|
||||||
path = path.encode(sys.getfilesystemencoding())
|
path = path.encode(sys.getfilesystemencoding())
|
||||||
mplayerCond.acquire()
|
mplayerCond.acquire()
|
||||||
mplayerQueue.append(path)
|
mplayerQueue.append(path)
|
||||||
|
@ -180,7 +183,20 @@ def clearMplayerQueue():
|
||||||
mplayerQueue.append(None)
|
mplayerQueue.append(None)
|
||||||
mplayerCond.release()
|
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):
|
def stopMplayer(restart=False):
|
||||||
|
if not mplayerManager:
|
||||||
|
return
|
||||||
mplayerCond.acquire()
|
mplayerCond.acquire()
|
||||||
if mplayerManager.mplayer:
|
if mplayerManager.mplayer:
|
||||||
while 1:
|
while 1:
|
||||||
|
@ -206,14 +222,6 @@ def stopMplayer(restart=False):
|
||||||
def stopMplayerOnce():
|
def stopMplayerOnce():
|
||||||
stopMplayer(restart=True)
|
stopMplayer(restart=True)
|
||||||
|
|
||||||
mplayerManager = MplayerMonitor()
|
|
||||||
mplayerManager.daemon = True
|
|
||||||
mplayerManager.start()
|
|
||||||
mplayerReader = MplayerReader()
|
|
||||||
mplayerReader.daemon = True
|
|
||||||
mplayerReader.start()
|
|
||||||
atexit.register(stopMplayer)
|
|
||||||
|
|
||||||
addHook("deckClosed", stopMplayerOnce)
|
addHook("deckClosed", stopMplayerOnce)
|
||||||
|
|
||||||
# PyAudio recording
|
# PyAudio recording
|
||||||
|
|
Loading…
Reference in a new issue