Synchronize client with player better

This prevents seeking loops between clients.
This commit is contained in:
Tomasz Fluxid Kowalczyk 2012-02-05 14:56:14 +01:00
parent 35b1288b79
commit 2fefd7dd28

View File

@ -164,6 +164,8 @@ class Manager(object):
self.player_filename = None self.player_filename = None
self.seek_sent_wait = False self.seek_sent_wait = False
self.status_ask_sent = 0
self.status_ask_received = 0
self.make_player = make_player self.make_player = make_player
self.running = False self.running = False
@ -233,6 +235,7 @@ class Manager(object):
if not self.running: if not self.running:
return return
if self.player: if self.player:
self.status_ask_sent += 1
self.player.ask_for_status() self.player.ask_for_status()
self.schedule_ask_player() self.schedule_ask_player()
@ -263,6 +266,10 @@ class Manager(object):
def update_player_status(self, paused, position): def update_player_status(self, paused, position):
self.status_ask_received += 1
if self.status_ask_received < self.status_ask_sent:
return
old_paused = self.player_paused old_paused = self.player_paused
self.player_paused = paused self.player_paused = paused
self.player_position = position self.player_position = position
@ -291,6 +298,7 @@ class Manager(object):
if not paused and self.player_paused_at is not None and position >= self.player_paused_at: 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) #print 'Pausing %0.2fs after pause point' % (position - self.player_paused_at)
self.player.set_paused(True) self.player.set_paused(True)
self.ask_player()
def update_filename(self, filename): def update_filename(self, filename):
self.player_filename = filename self.player_filename = filename
@ -307,18 +315,22 @@ class Manager(object):
if not self.player: if not self.player:
return return
changed = False
if not updated_before: if not updated_before:
self.player.set_position(position) self.player.set_position(position)
self.player.set_paused(paused) self.player.set_paused(paused)
changed = True
elif not (self.counter and counter < self.counter): elif not (self.counter and counter < self.counter):
diff = self.get_player_position() - position diff = self.get_player_position() - position
if self.last_player_update is not None: if self.last_player_update is not None:
diff += curtime - self.last_player_update diff += curtime - self.last_player_update
if abs(diff) > 4: if abs(diff) > 4:
self.player.set_position(position) self.player.set_position(position)
changed = True
if self.player_paused and not paused: if self.player_paused and not paused:
self.player_paused_at = None self.player_paused_at = None
self.player.set_paused(False) self.player.set_paused(False)
changed = True
if self.global_noted_pause_change != paused: if self.global_noted_pause_change != paused:
print '%s unpaused' % name print '%s unpaused' % name
elif paused and not self.player_paused: elif paused and not self.player_paused:
@ -327,16 +339,20 @@ class Manager(object):
print '%s paused' % name print '%s paused' % name
if diff < 0: if diff < 0:
self.player.set_paused(True) self.player.set_paused(True)
changed = True
#else: #else:
# print 'Not pausing now' # print 'Not pausing now'
self.global_noted_pause_change = paused self.global_noted_pause_change = paused
self.seek_sent_wait = False self.seek_sent_wait = False
if changed:
self.ask_player()
def seek(self, position, who): def seek(self, position, who):
self.global_position = position self.global_position = position
if self.player: if self.player:
self.player.set_position(position) self.player.set_position(position)
self.ask_player()
position = int(position*1000) position = int(position*1000)
seconds, mseconds = divmod(position, 1000) seconds, mseconds = divmod(position, 1000)