diff options
| author | RblSb <msrblsb@gmail.com> | 2020-04-03 04:48:36 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-04-03 04:48:36 +0300 |
| commit | 5f2a3b89eaa1199d9bc2ddd10622f9803cec983f (patch) | |
| tree | ee9064ee7b683cfe2ac7b504ba81674b490367b6 /src/server | |
| parent | 62c9be74228549ff888b684a62f77fb056571470 (diff) | |
Sync playback rate
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/Main.hx | 21 | ||||
| -rw-r--r-- | src/server/VideoTimer.hx | 36 |
2 files changed, 47 insertions, 10 deletions
diff --git a/src/server/Main.hx b/src/server/Main.hx index f056ac6..5142f48 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -438,11 +438,17 @@ class Main { }); return; } - send(client, { + final obj:WsEvent = { type: GetTime, getTime: { - time: videoTimer.getTime(), - paused: videoTimer.isPaused() - }}); + time: videoTimer.getTime() + } + }; + if (videoTimer.isPaused()) obj.getTime.paused = true; + if (videoTimer.getRate() != 1) { + if (!clients.hasLeader()) videoTimer.setRate(1); + obj.getTime.rate = videoTimer.getRate(); + } + send(client, obj); case SetTime: if (videoList.length == 0) return; @@ -450,6 +456,12 @@ class Main { videoTimer.setTime(data.setTime.time); broadcastExcept(client, data); + case SetRate: + if (videoList.length == 0) return; + if (!client.isLeader) return; + videoTimer.setRate(data.setRate.rate); + broadcastExcept(client, data); + case Rewind: if (!checkPermission(client, RewindPerm)) return; if (videoList.length == 0) return; @@ -474,6 +486,7 @@ class Main { if (videoList.length == 0) return; if (!clients.hasLeader()) { if (videoTimer.isPaused()) videoTimer.play(); + videoTimer.setRate(1); broadcast({ type: Play, play: { time: videoTimer.getTime() diff --git a/src/server/VideoTimer.hx b/src/server/VideoTimer.hx index 4bc29db..508b97b 100644 --- a/src/server/VideoTimer.hx +++ b/src/server/VideoTimer.hx @@ -1,19 +1,22 @@ package server; -import haxe.Timer; +import haxe.Timer.stamp; class VideoTimer { public var isStarted(default, null) = false; var startTime = 0.0; var pauseStartTime = 0.0; + var rateStartTime = 0.0; + var rate = 1.0; public function new() {} public function start():Void { isStarted = true; - startTime = Timer.stamp(); + startTime = stamp(); pauseStartTime = 0; + rateStartTime = stamp(); } public function stop():Void { @@ -23,22 +26,26 @@ class VideoTimer { } public function pause():Void { - pauseStartTime = Timer.stamp(); + startTime += rateTime() - rateTime() * this.rate; + pauseStartTime = stamp(); + rateStartTime = 0; } public function play():Void { if (!isStarted) start(); startTime += pauseTime(); + rateStartTime = stamp(); pauseStartTime = 0; } public function getTime():Float { if (startTime == 0) return 0; - return Timer.stamp() - startTime - pauseTime(); + final time = stamp() - startTime; + return time - rateTime() + rateTime() * rate - pauseTime(); } public function setTime(secs:Float):Void { - startTime = Timer.stamp() - secs; + startTime = stamp() - secs; if (isPaused()) pause(); } @@ -46,9 +53,26 @@ class VideoTimer { return !isStarted || pauseStartTime != 0; } + public function getRate():Float { + return rate; + } + + public function setRate(rate:Float):Void { + if (!isPaused()) { + startTime += rateTime() - rateTime() * this.rate; + rateStartTime = stamp(); + } + this.rate = rate; + } + function pauseTime():Float { if (pauseStartTime == 0) return 0; - return Timer.stamp() - pauseStartTime; + return stamp() - pauseStartTime; + } + + function rateTime():Float { + if (rateStartTime == 0) return 0; + return stamp() - rateStartTime - pauseTime(); } } |
