From a03b2fdea6f5fb83463fcd1a8bd02864abc901e9 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Fri, 20 Nov 2020 10:02:12 +0100 Subject: [PATCH] web: Add mute overlay Original code by Toad06 as part of PR #1161 --- web/packages/core/src/ruffle-player.ts | 30 +++++++++++++++++++++++ web/packages/core/src/shadow-template.ts | 31 +++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/web/packages/core/src/ruffle-player.ts b/web/packages/core/src/ruffle-player.ts index e163ee1ce..42e027916 100644 --- a/web/packages/core/src/ruffle-player.ts +++ b/web/packages/core/src/ruffle-player.ts @@ -80,6 +80,7 @@ export class RufflePlayer extends HTMLElement { private dynamicStyles: HTMLStyleElement; private container: HTMLElement; private playButton: HTMLElement; + private unmuteOverlay: HTMLElement; private rightClickMenu: HTMLElement; private instance: Ruffle | null; private _trace_observer: ((message: string) => void) | null; @@ -116,6 +117,13 @@ export class RufflePlayer extends HTMLElement { this.playButtonClicked.bind(this) ); } + + this.unmuteOverlay = this.shadow.getElementById("unmute_overlay")!; + this.unmuteOverlay.addEventListener( + "click", + this.unmuteOverlayClicked.bind(this) + ); + this.rightClickMenu = this.shadow.getElementById("right_click_menu")!; this.addEventListener( @@ -477,6 +485,28 @@ export class RufflePlayer extends HTMLElement { } } + private audioState(): string { + if (this.instance) { + const audioContext = this.instance.audio_context(); + return (audioContext && audioContext.state) || "running"; + } + return "suspended"; + } + + private unmuteOverlayClicked(): void { + if (this.instance) { + if (this.audioState() !== "running") { + const audioContext = this.instance.audio_context(); + if (audioContext) { + audioContext.resume(); + } + } + if (this.unmuteOverlay) { + this.unmuteOverlay.style.display = "none"; + } + } + } + /** * Load a movie's data into this Ruffle Player instance. * diff --git a/web/packages/core/src/shadow-template.ts b/web/packages/core/src/shadow-template.ts index ff56b6a78..68937cabf 100644 --- a/web/packages/core/src/shadow-template.ts +++ b/web/packages/core/src/shadow-template.ts @@ -51,6 +51,34 @@ ruffleShadowTemplate.innerHTML = ` #play_button:hover .icon { filter: brightness(1.3); } + + #unmute_overlay { + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + display: none; + } + + #unmute_overlay .background { + position: absolute; + width: 100%; + height: 100%; + background-color: #000; + opacity: 0.8; + } + + #unmute_overlay .icon { + position: relative; + top: 50%; + left: 50%; + width: 90%; + height: 90%; + max-width: 500px; + max-height: 500px; + transform: translate(-50%, -50%); + opacity: 0.6; + } #panic { position: absolute; @@ -58,7 +86,7 @@ ruffleShadowTemplate.innerHTML = ` height: 100%; /* Inverted colours from play button! */ background: linear-gradient(180deg, rgba(253,58,64,1) 0%, rgba(253,161,56,1) 100%); - color: black; + color: #000; } #panic a { @@ -159,6 +187,7 @@ ruffleShadowTemplate.innerHTML = `
+
Click to unmute