Delay sending pause to mplayer to give it time to initialize, handle mplayer exit in a nicer way. This commit breaks synchronizng mplayer, it will be fixed later.
This commit is contained in:
parent
0aaccf6f97
commit
70c18ba17f
@ -16,9 +16,8 @@ if __name__ == '__main__':
|
||||
port = int(port)
|
||||
else:
|
||||
port = 8999
|
||||
|
||||
args.append('-slave')
|
||||
args.append('-quiet')
|
||||
|
||||
args.extend(('-slave', '-msglevel', 'all=1'))
|
||||
|
||||
manager = client.Manager(host, port, name)
|
||||
manager.start()
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
import re
|
||||
import sys
|
||||
from collections import deque
|
||||
|
||||
from twisted.internet import reactor
|
||||
|
||||
@ -14,24 +15,34 @@ RE_ANSWER = re.compile('^ANS_([a-zA-Z_]+)=(.+)$')
|
||||
class MplayerProtocol(LineProcessProtocol):
|
||||
def __init__(self, manager):
|
||||
self.manager = manager
|
||||
self.ignore_end = False
|
||||
self.error_lines = deque(maxlen=50)
|
||||
self.filename = None # To be moved to Manager
|
||||
|
||||
def connectionMade(self):
|
||||
self.manager.player = self
|
||||
self.send_set_paused(True)
|
||||
self.send_set_position(0)
|
||||
|
||||
def processExited(self, reason):
|
||||
self.manager.player = None
|
||||
reactor.callLater(0.1, self.prepare_player)
|
||||
|
||||
def processEnded(self, reason):
|
||||
self.manager.player = None
|
||||
if not self.ignore_end:
|
||||
if reason.value.signal is not None:
|
||||
print 'Mplayer interrupted by signal %d.' % reason.value.signal
|
||||
elif reason.value.exitCode is not None:
|
||||
print 'Mplayer quit with exit code %d.' % reason.value.exitCode
|
||||
else:
|
||||
print 'Mplayer quit unexpectedly.'
|
||||
if self.error_lines:
|
||||
print 'Up to 50 last lines from its error output below:'
|
||||
for line in self.error_lines:
|
||||
print line
|
||||
reactor.stop()
|
||||
|
||||
def errLineReceived(self, line):
|
||||
sys.stderr.write(line+'\n')
|
||||
if line:
|
||||
self.error_lines.append(line)
|
||||
|
||||
def outLineReceived(self, line):
|
||||
if not line.startswith('ANS_'):
|
||||
sys.stdout.write(line+'\n')
|
||||
return
|
||||
m = RE_ANSWER.match(line)
|
||||
if not m:
|
||||
@ -43,6 +54,13 @@ class MplayerProtocol(LineProcessProtocol):
|
||||
handler(value)
|
||||
|
||||
|
||||
def prepare_player(self):
|
||||
self.send_set_paused(True)
|
||||
self.send_set_position(0)
|
||||
self.send_get_filename()
|
||||
self.manager.player = self
|
||||
|
||||
|
||||
def set_property(self, name, value):
|
||||
self.writeLines('%s %s %s' % ('set_property', name, value))
|
||||
|
||||
@ -50,6 +68,13 @@ class MplayerProtocol(LineProcessProtocol):
|
||||
self.writeLines('%s %s' % ('get_property', name))
|
||||
|
||||
|
||||
def send_get_filename(self):
|
||||
self.get_property('filename')
|
||||
|
||||
def answer_filename(self, value):
|
||||
self.filename = value
|
||||
|
||||
|
||||
def send_set_paused(self, value):
|
||||
# docs say i can't set "pause" property, but it works...
|
||||
self.set_property('pause', 'yes' if value else 'no')
|
||||
@ -85,18 +110,8 @@ class MplayerProtocol(LineProcessProtocol):
|
||||
|
||||
|
||||
def drop(self):
|
||||
self.ignore_end = True
|
||||
self.transport.loseConnection()
|
||||
reactor.callLater(1, self.graceful_kill)
|
||||
|
||||
def gracefull_kill(self):
|
||||
if self.transport.pid:
|
||||
self.transport.signalProcess('TERM')
|
||||
reactor.callLater(2, self.try_kill)
|
||||
|
||||
def kill(self):
|
||||
if self.transport.pid:
|
||||
self.transport.signalProcess('KILL')
|
||||
|
||||
|
||||
def run_mplayer(manager, mplayer_path, args):
|
||||
exec_path = find_exec_path(mplayer_path)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user