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)
|
port = int(port)
|
||||||
else:
|
else:
|
||||||
port = 8999
|
port = 8999
|
||||||
|
|
||||||
args.append('-slave')
|
args.extend(('-slave', '-msglevel', 'all=1'))
|
||||||
args.append('-quiet')
|
|
||||||
|
|
||||||
manager = client.Manager(host, port, name)
|
manager = client.Manager(host, port, name)
|
||||||
manager.start()
|
manager.start()
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
from twisted.internet import reactor
|
from twisted.internet import reactor
|
||||||
|
|
||||||
@ -14,24 +15,34 @@ RE_ANSWER = re.compile('^ANS_([a-zA-Z_]+)=(.+)$')
|
|||||||
class MplayerProtocol(LineProcessProtocol):
|
class MplayerProtocol(LineProcessProtocol):
|
||||||
def __init__(self, manager):
|
def __init__(self, manager):
|
||||||
self.manager = 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):
|
def connectionMade(self):
|
||||||
self.manager.player = self
|
reactor.callLater(0.1, self.prepare_player)
|
||||||
self.send_set_paused(True)
|
|
||||||
self.send_set_position(0)
|
|
||||||
|
|
||||||
def processExited(self, reason):
|
|
||||||
self.manager.player = None
|
|
||||||
|
|
||||||
def processEnded(self, reason):
|
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()
|
reactor.stop()
|
||||||
|
|
||||||
def errLineReceived(self, line):
|
def errLineReceived(self, line):
|
||||||
sys.stderr.write(line+'\n')
|
if line:
|
||||||
|
self.error_lines.append(line)
|
||||||
|
|
||||||
def outLineReceived(self, line):
|
def outLineReceived(self, line):
|
||||||
if not line.startswith('ANS_'):
|
if not line.startswith('ANS_'):
|
||||||
sys.stdout.write(line+'\n')
|
|
||||||
return
|
return
|
||||||
m = RE_ANSWER.match(line)
|
m = RE_ANSWER.match(line)
|
||||||
if not m:
|
if not m:
|
||||||
@ -43,6 +54,13 @@ class MplayerProtocol(LineProcessProtocol):
|
|||||||
handler(value)
|
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):
|
def set_property(self, name, value):
|
||||||
self.writeLines('%s %s %s' % ('set_property', 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))
|
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):
|
def send_set_paused(self, value):
|
||||||
# docs say i can't set "pause" property, but it works...
|
# docs say i can't set "pause" property, but it works...
|
||||||
self.set_property('pause', 'yes' if value else 'no')
|
self.set_property('pause', 'yes' if value else 'no')
|
||||||
@ -85,18 +110,8 @@ class MplayerProtocol(LineProcessProtocol):
|
|||||||
|
|
||||||
|
|
||||||
def drop(self):
|
def drop(self):
|
||||||
|
self.ignore_end = True
|
||||||
self.transport.loseConnection()
|
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):
|
def run_mplayer(manager, mplayer_path, args):
|
||||||
exec_path = find_exec_path(mplayer_path)
|
exec_path = find_exec_path(mplayer_path)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user