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:
Tomasz Fluxid Kowalczyk 2012-01-30 22:33:46 +01:00
parent 0aaccf6f97
commit 70c18ba17f
2 changed files with 36 additions and 22 deletions

View File

@ -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()

View File

@ -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)