From ccfb065ad798d91a9650c205c322e0f854e4fd5b Mon Sep 17 00:00:00 2001 From: Tomasz Fluxid Kowalczyk Date: Thu, 2 Feb 2012 22:23:06 +0100 Subject: [PATCH] Move code around a bit and renamed some functions Merged asking for and updating status player into one operation, this will help simplifying MPC player control. --- syncplay/client.py | 51 +++++++++++++++++----------------- syncplay/players/mplayer.py | 55 +++++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index ce9c778..b1a64f8 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -142,8 +142,8 @@ class Manager(object): def init_player(self, player): self.player = player if self.last_global_update: - self.player.send_set_position(self.get_global_position()) - self.player.send_set_paused(self.global_paused) + self.player.set_position(self.get_global_position()) + self.player.set_paused(self.global_paused) self.schedule_ask_player() def init_protocol(self, protocol): @@ -162,8 +162,7 @@ class Manager(object): if not self.running: return if self.player: - self.player.send_get_position() - self.player.send_get_paused() + self.player.ask_for_status() self.schedule_ask_player() @@ -182,12 +181,19 @@ class Manager(object): self.schedule_send_status() - def update_player_position(self, value): - self.player_position = value + def update_player_status(self, paused, position): + old_paused = self.player_paused + self.player_paused = paused + self.player_position = position self.last_player_update = time.time() + if old_paused and not paused: + self.player_paused_at = None + if old_paused != paused and self.global_paused != paused: + self.send_status() + if not self.global_paused: - diff = self.get_global_position() - value + diff = self.get_global_position() - position if 0.6 <= abs(diff) <= 4: #print 'server is %0.2fs ahead of client' % diff if diff > 0: @@ -196,24 +202,15 @@ class Manager(object): speed = 0.75 #print 'fixing at speed %0.2f' % speed if not self.player_speed_fix: - self.player.send_set_speed(speed) + self.player.set_speed(speed) self.player_speed_fix = True elif self.player_speed_fix: - self.player.send_set_speed(1) + self.player.set_speed(1) self.player_speed_fix = False - if not self.player_paused and self.player_paused_at is not None and value >= self.player_paused_at: - self.player.send_set_paused(True) - self.schedule_ask_player() - - - def update_player_paused(self, value): - old = self.player_paused - self.player_paused = value - if not value: - self.player_paused_at = None - if old != value and self.global_paused != value: - self.send_status() + if not paused and self.player_paused_at is not None and position >= self.player_paused_at: + #print 'Pausing %0.2fs after pause point' % (position - self.player_paused_at) + self.player.set_paused(True) def update_global_state(self, counter, paused, position, name): curtime = time.time() @@ -226,19 +223,21 @@ class Manager(object): return if not updated_before: - self.player.send_set_position(position) - self.player.send_set_paused(paused) + self.player.set_position(position) + self.player.set_paused(paused) elif not (self.counter and counter < self.counter): diff = self.get_player_position() - position if self.last_player_update is not None: diff += curtime - self.last_player_update if abs(diff) > 4: - self.player.send_set_position(position) + self.player.set_position(position) if self.player_paused and not paused: self.player_paused_at = None - self.player.send_set_paused(False) + self.player.set_paused(False) elif paused and not self.player_paused: self.player_paused_at = position if diff < 0: - self.player.send_set_paused(True) + self.player.set_paused(True) + #else: + # print 'Not pausing now' diff --git a/syncplay/players/mplayer.py b/syncplay/players/mplayer.py index 4c17043..2e36900 100644 --- a/syncplay/players/mplayer.py +++ b/syncplay/players/mplayer.py @@ -13,11 +13,14 @@ RE_ANSWER = re.compile('^ANS_([a-zA-Z_]+)=(.+)$') class MplayerProtocol(LineProcessProtocol): + speed_supported = True + 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 + self.tmp_paused = None def connectionMade(self): reactor.callLater(0.1, self.prepare_player) @@ -49,64 +52,68 @@ class MplayerProtocol(LineProcessProtocol): return name, value = m.group(1).lower(), m.group(2) - handler = getattr(self, 'answer_' + name, None) + handler = getattr(self, 'mplayer_answer_' + name, None) if handler: handler(value) def prepare_player(self): - self.send_set_paused(True) - self.send_set_position(0) + self.set_paused(True) + self.set_position(0) self.send_get_filename() self.manager.init_player(self) + def ask_for_status(self): + self.send_get_paused() + self.send_get_position() - def set_property(self, name, value): + + def send_set_property(self, name, value): self.writeLines('%s %s %s' % ('set_property', name, value)) - def get_property(self, name): + def send_get_property(self, name): self.writeLines('%s %s' % ('get_property', name)) def send_get_filename(self): - self.get_property('filename') + self.send_get_property('filename') - def answer_filename(self, value): + def mplayer_answer_filename(self, value): self.filename = value - def send_set_paused(self, value): + def set_paused(self, value): # docs say i can't set "pause" property, but it works... - self.set_property('pause', 'yes' if value else 'no') + self.send_set_property('pause', 'yes' if value else 'no') def send_get_paused(self): - self.get_property('pause') + self.send_get_property('pause') - def answer_pause(self, value): + def mplayer_answer_pause(self, value): value = value == 'yes' - self.manager.update_player_paused(value) + self.tmp_paused = value - def send_set_position(self, value): - self.set_property('time_pos', '%0.2f'%value) + def set_position(self, value): + self.send_set_property('time_pos', '%0.2f'%value) def send_get_position(self): - self.get_property('time_pos') + self.send_get_property('time_pos') - def answer_time_pos(self, value): + def mplayer_answer_time_pos(self, value): value = float(value) - self.manager.update_player_position(value) + self.manager.update_player_status(self.tmp_paused, value) - def send_set_speed(self, value): - self.set_property('speed', '%0.2f'%value) + def set_speed(self, value): + self.send_set_property('speed', '%0.2f'%value) - def send_get_speed(self): - self.get_property('speed') + #def send_get_speed(self): + # self.send_get_property('speed') - def answer_speed(self, value): - value = float(value) - self.manager.update_player_speed(value) + #def mplayer_answer_speed(self, value): + # value = float(value) + # self.manager.update_player_speed(value) def drop(self):