Add one more argument to state message, pausing with lagged connection should now work better (at all)

This commit is contained in:
Tomasz Fluxid Kowalczyk 2012-01-29 15:16:26 +01:00
parent 5b529bf36f
commit c9bb239506
3 changed files with 33 additions and 20 deletions

View File

@ -28,15 +28,15 @@ class SyncClientProtocol(CommandProtocol):
self.drop_with_error('Malformed state attributes') self.drop_with_error('Malformed state attributes')
return return
paused, position, name = arg counter, paused, position, name = arg
self.manager.update_global_state(paused, position, name) self.manager.update_global_state(counter, paused, position, name)
def handle_connected_ping(self, arg): def handle_connected_ping(self, arg):
self.send_message('pong', arg) self.send_message('pong', arg)
def send_state(self, paused, position): def send_state(self, counter, paused, position):
self.send_message('state', ('paused' if paused else 'playing'), int(position*100)) self.send_message('state', counter, ('paused' if paused else 'playing'), int(position*100))
states = dict( states = dict(
@ -75,6 +75,8 @@ class Manager(object):
self.player_paused = True self.player_paused = True
self.player_position = 0.0 self.player_position = 0.0
self.counter = 0
def get_current_global_position(self): def get_current_global_position(self):
return self.global_position + (time.time() - self.last_global_update) return self.global_position + (time.time() - self.last_global_update)
@ -115,8 +117,10 @@ class Manager(object):
def send_status(self): def send_status(self):
if not self.running: if not self.running:
return return
self.counter += 1
if self.protocol: if self.protocol:
self.protocol.send_state(self.player_paused, self.player_position) print 'sent', self.counter
self.protocol.send_state(self.counter, self.player_paused, self.player_position)
self.schedule_send_status() self.schedule_send_status()
@ -140,11 +144,12 @@ class Manager(object):
if old != value and self.global_paused != value: if old != value and self.global_paused != value:
self.send_status() self.send_status()
def update_global_state(self, paused, position, name): def update_global_state(self, counter, paused, position, name):
self.global_paused = paused self.global_paused = paused
self.global_position = position self.global_position = position
self.last_global_update = time.time() self.last_global_update = time.time()
if self.player: print 'received', counter
if self.player and not (self.counter and counter < self.counter):
changed = False changed = False
if abs(self.player_position - position) > 4: if abs(self.player_position - position) > 4:
self.player.send_set_position(position) self.player.send_set_position(position)

View File

@ -35,9 +35,9 @@ class SyncServerProtocol(CommandProtocol):
self.drop_with_error('Malformed state attributes') self.drop_with_error('Malformed state attributes')
return return
paused, position, _ = arg counter, paused, position, _ = arg
self.factory.update_state(self, paused, position) self.factory.update_state(self, counter, paused, position)
def handle_connected_seek(self, arg): def handle_connected_seek(self, arg):
try: try:
@ -59,8 +59,8 @@ class SyncServerProtocol(CommandProtocol):
))) )))
def send_state(self, paused, position, who_last_changed): def send_state(self, counter, paused, position, who_last_changed):
self.send_message('state', ('paused' if paused else 'playing'), int(position*100), who_last_changed) self.send_message('state', counter, ('paused' if paused else 'playing'), int(position*100), who_last_changed)
def send_seek(self, position, who_seeked): def send_seek(self, position, who_seeked):
self.send_message('seek', int(position*100), who_seeked) self.send_message('seek', int(position*100), who_seeked)
@ -96,6 +96,8 @@ class WatcherInfo(object):
self.last_ping_time = None self.last_ping_time = None
self.last_ping_value = None self.last_ping_value = None
self.counter = 0
def update_position(self, position): def update_position(self, position):
if self.ping is not None: if self.ping is not None:
position += self.ping position += self.ping
@ -132,12 +134,13 @@ class SyncFactory(Factory):
self.pause_change_by = None self.pause_change_by = None
# send info someone quit # send info someone quit
def update_state(self, watcher_proto, paused, position): def update_state(self, watcher_proto, counter, paused, position):
watcher = self.watchers.get(watcher_proto) watcher = self.watchers.get(watcher_proto)
if not watcher: if not watcher:
return return
watcher.update_position(position) watcher.update_position(position)
watcher.counter = counter
pause_changed = paused != self.paused pause_changed = paused != self.paused
curtime = time.time() curtime = time.time()
@ -176,9 +179,9 @@ class SyncFactory(Factory):
position += watcher.ping position += watcher.ping
if self.pause_change_by: if self.pause_change_by:
watcher.watcher_proto.send_state(self.paused, position, self.pause_change_by.name) watcher.watcher_proto.send_state(watcher.counter, self.paused, position, self.pause_change_by.name)
else: else:
watcher.watcher_proto.send_state(self.paused, position, None) watcher.watcher_proto.send_state(watcher.counter, self.paused, position, None)
watcher.last_update_sent = curtime watcher.last_update_sent = curtime

View File

@ -8,16 +8,21 @@ def split_args(args, number):
return args.split(None, number-1) return args.split(None, number-1)
def parse_state(args): def parse_state(args):
args = split_args(args, 3) args = split_args(args, 4)
l = len(args) l = len(args)
if l == 2: if l == 3:
state, position = args counter, state, position = args
who_changed_state = None who_changed_state = None
elif l == 3: elif l == 4:
state, position, who_changed_state = args counter, state, position, who_changed_state = args
else: else:
return return
try:
counter = int(counter)
except ValueError:
return
if not state in ('paused', 'playing'): if not state in ('paused', 'playing'):
return return
@ -30,7 +35,7 @@ def parse_state(args):
position /= 100.0 position /= 100.0
return paused, position, who_changed_state return counter, paused, position, who_changed_state
def find_exec_path(name): def find_exec_path(name):
if os.access(name, os.X_OK): if os.access(name, os.X_OK):