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/client | |
| parent | 62c9be74228549ff888b684a62f77fb056571470 (diff) | |
Sync playback rate
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/IPlayer.hx | 2 | ||||
| -rw-r--r-- | src/client/Main.hx | 11 | ||||
| -rw-r--r-- | src/client/Player.hx | 26 | ||||
| -rw-r--r-- | src/client/players/Iframe.hx | 6 | ||||
| -rw-r--r-- | src/client/players/Raw.hx | 9 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 13 |
6 files changed, 66 insertions, 1 deletions
diff --git a/src/client/IPlayer.hx b/src/client/IPlayer.hx index 4f29512..e414af5 100644 --- a/src/client/IPlayer.hx +++ b/src/client/IPlayer.hx @@ -11,4 +11,6 @@ interface IPlayer { function pause():Void; function getTime():Float; function setTime(time:Float):Void; + function getPlaybackRate():Float; + function setPlaybackRate(rate:Float):Void; } diff --git a/src/client/Main.hx b/src/client/Main.hx index f65640a..780f005 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -366,6 +366,13 @@ class Main { player.play(); case GetTime: + if (data.getTime.paused == null) data.getTime.paused = false; + if (data.getTime.rate == null) data.getTime.rate = 1; + + if (player.getPlaybackRate() != data.getTime.rate) { + player.setPlaybackRate(data.getTime.rate); + } + final newTime = data.getTime.time; final time = player.getTime(); if (isLeader()) { @@ -386,6 +393,10 @@ class Main { if (Math.abs(time - newTime) < synchThreshold) return; player.setTime(newTime); + case SetRate: + if (isLeader()) return; + player.setPlaybackRate(data.setRate.rate); + case Rewind: player.setTime(data.rewind.time); diff --git a/src/client/Player.hx b/src/client/Player.hx index 8e55b25..53a1168 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -21,6 +21,7 @@ class Player { var itemPos = 0; var isLoaded = false; var skipSetTime = false; + var skipSetRate = false; public function new(main:Main):Void { this.main = main; @@ -158,6 +159,19 @@ class Player { }); } + public function onRateChange():Void { + if (skipSetRate) { + skipSetRate = false; + return; + } + if (!main.isLeader()) return; + main.send({ + type: SetRate, setRate: { + rate: getPlaybackRate() + } + }); + } + public function addVideoItem(item:VideoItem, atEnd:Bool):Void { final url = item.url.htmlEscape(true); final itemEl = nodeFromString( @@ -322,4 +336,16 @@ class Player { player.setTime(time); } + public function getPlaybackRate():Float { + if (player == null) return 1; + return player.getPlaybackRate(); + } + + public function setPlaybackRate(rate:Float, isLocal = true):Void { + if (!main.isSyncActive) return; + if (player == null) return; + skipSetRate = isLocal; + player.setPlaybackRate(rate); + } + } diff --git a/src/client/players/Iframe.hx b/src/client/players/Iframe.hx index f0a04c5..d79196b 100644 --- a/src/client/players/Iframe.hx +++ b/src/client/players/Iframe.hx @@ -59,4 +59,10 @@ class Iframe implements IPlayer { public function setTime(time:Float):Void {} + public function getPlaybackRate():Float { + return 1; + } + + public function setPlaybackRate(rate:Float):Void {} + } diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx index c7fa980..cd01a42 100644 --- a/src/client/players/Raw.hx +++ b/src/client/players/Raw.hx @@ -67,6 +67,7 @@ class Raw implements IPlayer { player.onPlay(); } video.onpause = player.onPause; + video.onratechange = player.onRateChange; playerEl.appendChild(video); } @@ -102,4 +103,12 @@ class Raw implements IPlayer { video.currentTime = time; } + public function getPlaybackRate():Float { + return video.playbackRate; + } + + public function setPlaybackRate(rate:Float):Void { + video.playbackRate = rate; + } + } diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx index f582ba7..eff407e 100644 --- a/src/client/players/Youtube.hx +++ b/src/client/players/Youtube.hx @@ -208,7 +208,10 @@ class Youtube implements IPlayer { player.onSetTime(); case CUED: } - } + }, + onPlaybackRateChange: e -> { + player.onRateChange(); + }, } }); } @@ -239,4 +242,12 @@ class Youtube implements IPlayer { youtube.seekTo(time, true); } + public function getPlaybackRate():Float { + return youtube.getPlaybackRate(); + } + + public function setPlaybackRate(rate:Float):Void { + youtube.setPlaybackRate(rate); + } + } |
