From aeace14869947769a2688008e05cf7f51e9cf1a4 Mon Sep 17 00:00:00 2001 From: RblSb Date: Wed, 13 May 2020 09:01:40 +0300 Subject: Sync leader on video start/refresh --- res/client.js | 19 +++++++++++++++++-- src/client/Main.hx | 6 +++++- src/client/Player.hx | 10 ++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/res/client.js b/res/client.js index d348a2d..cecba6b 100644 --- a/res/client.js +++ b/res/client.js @@ -1000,6 +1000,7 @@ var client_Main = function(host,port) { this.globalIp = ""; this.pageTitle = window.document.title; this.clients = []; + this.forceSyncNextTick = false; this.isSyncActive = true; var _gthis = this; this.player = new client_Player(this); @@ -1280,7 +1281,7 @@ client_Main.prototype = { var data = JSON.parse(e.data); var t = data.type; var t1 = t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null); - haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 324, className : "client.Main", methodName : "onMessage", customParams : [data[t1]]}); + haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 325, className : "client.Main", methodName : "onMessage", customParams : [data[t1]]}); switch(data.type) { case "AddVideo": this.player.addVideoItem(data.addVideo.item,data.addVideo.atEnd); @@ -1314,13 +1315,16 @@ client_Main.prototype = { var synchThreshold = this.settings.synchThreshold; var newTime = data.getTime.time; var time = this.player.getTime(); - if((this.personal.group & 1 << ClientGroup.Leader._hx_index) != 0) { + if((this.personal.group & 1 << ClientGroup.Leader._hx_index) != 0 && !this.forceSyncNextTick) { if(Math.abs(time - newTime) < synchThreshold) { return; } this.player.setTime(time,false); return; } + if(this.player.isVideoLoaded()) { + this.forceSyncNextTick = false; + } if(this.player.getDuration() < this.player.getTime()) { return; } @@ -1438,6 +1442,9 @@ client_Main.prototype = { case "VideoLoaded": this.player.setTime(0); this.player.play(); + if((this.personal.group & 1 << ClientGroup.Leader._hx_index) != 0 && !this.player.isVideoLoaded()) { + this.forceSyncNextTick = true; + } break; } } @@ -2054,8 +2061,13 @@ client_Player.prototype = { if(this.items.length == 0) { return; } + var time = this.getTime(); this.removeVideo(); this.setVideo(this.itemPos); + if((this.main.personal.group & 2) != 0) { + this.setTime(time); + this.main.forceSyncNextTick = true; + } } ,duration: function(time) { var h = time / 60 / 60 | 0; @@ -2099,6 +2111,9 @@ client_Player.prototype = { } return this.items[this.itemPos].duration; } + ,isVideoLoaded: function() { + return this.player.isVideoLoaded(); + } ,play: function() { if(!this.main.isSyncActive) { return; diff --git a/src/client/Main.hx b/src/client/Main.hx index deeb2ec..0844636 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -25,6 +25,7 @@ class Main { static inline var SETTINGS_VERSION = 2; public final settings:ClientSettings; public var isSyncActive = true; + public var forceSyncNextTick = false; final clients:Array = []; var pageTitle = document.title; final host:String; @@ -371,6 +372,8 @@ class Main { case VideoLoaded: player.setTime(0); player.play(); + // try to sync leader after with GetTime events + if (isLeader() && !player.isVideoLoaded()) forceSyncNextTick = true; case RemoveVideo: player.removeItem(data.removeVideo.url); @@ -401,13 +404,14 @@ class Main { final synchThreshold = settings.synchThreshold; final newTime = data.getTime.time; final time = player.getTime(); - if (isLeader()) { + if (isLeader() && !forceSyncNextTick) { // if video is loading on leader // move other clients back in time if (Math.abs(time - newTime) < synchThreshold) return; player.setTime(time, false); return; } + if (player.isVideoLoaded()) forceSyncNextTick = false; if (player.getDuration() < player.getTime()) return; if (!data.getTime.paused) player.play(); else player.pause(); diff --git a/src/client/Player.hx b/src/client/Player.hx index ad10814..cdbccfd 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -280,8 +280,14 @@ class Player { public function refresh():Void { if (items.length == 0) return; + final time = getTime(); removeVideo(); setVideo(itemPos); + // restore server time for leader with next GetTime + if (main.isLeader()) { + setTime(time); + main.forceSyncNextTick = true; + } } function duration(time:Float):String { @@ -323,6 +329,10 @@ class Player { return items[itemPos].duration; } + public function isVideoLoaded():Bool { + return player.isVideoLoaded(); + } + public function play():Void { if (!main.isSyncActive) return; if (player == null) return; -- cgit v1.2.3