@caperjs/core 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.mjs +2 -0
- package/build/plugins/viewport.mjs +52 -0
- package/lib/{CaptionsPlugin-DeGyPecB.js → CaptionsPlugin-WPAcfAkx.js} +13 -12
- package/lib/CaptionsPlugin-WPAcfAkx.js.map +1 -0
- package/lib/{DataAdapter-DeI2kIxC.js → DataAdapter-DS-twowe.js} +11 -11
- package/lib/{DataAdapter-DeI2kIxC.js.map → DataAdapter-DS-twowe.js.map} +1 -1
- package/lib/{DebugRenderer-wjV0tMwL.js → DebugRenderer-D1ryrRYx.js} +2 -2
- package/lib/{DebugRenderer-wjV0tMwL.js.map → DebugRenderer-D1ryrRYx.js.map} +1 -1
- package/lib/{DevToolsPlugin-D4iWQwkO.js → DevToolsPlugin-DH7zX7HU.js} +2 -2
- package/lib/{DevToolsPlugin-D4iWQwkO.js.map → DevToolsPlugin-DH7zX7HU.js.map} +1 -1
- package/lib/{GSAPPlugin-DQTyIwcC.js → GSAPPlugin-BBtRjUqe.js} +2 -2
- package/lib/{GSAPPlugin-DQTyIwcC.js.map → GSAPPlugin-BBtRjUqe.js.map} +1 -1
- package/lib/{LayoutPlugin-vR_h-BaG.js → LayoutPlugin-Co6vcoV4.js} +4 -4
- package/lib/{LayoutPlugin-vR_h-BaG.js.map → LayoutPlugin-Co6vcoV4.js.map} +1 -1
- package/lib/{SpinePlugin-DJ-PpxFj.js → SpinePlugin-uN641Hmk.js} +2 -2
- package/lib/{SpinePlugin-DJ-PpxFj.js.map → SpinePlugin-uN641Hmk.js.map} +1 -1
- package/lib/{StatsPlugin-BYNnKYOm.js → StatsPlugin-vZQRm6wh.js} +4 -4
- package/lib/{StatsPlugin-BYNnKYOm.js.map → StatsPlugin-vZQRm6wh.js.map} +1 -1
- package/lib/{VoiceOverPlugin-BLSbq3DU.js → VoiceOverPlugin-KlZdGj1G.js} +32 -32
- package/lib/{VoiceOverPlugin-BLSbq3DU.js.map → VoiceOverPlugin-KlZdGj1G.js.map} +1 -1
- package/lib/caper.mjs +2107 -353
- package/lib/caper.mjs.map +1 -1
- package/lib/core/Application.d.ts +7 -1
- package/lib/core/Application.d.ts.map +1 -1
- package/lib/core/interfaces/IApplicationOptions.d.ts +1 -1
- package/lib/core/interfaces/IApplicationOptions.d.ts.map +1 -1
- package/lib/core/interfaces/ICoreFunctions.d.ts +1 -0
- package/lib/core/interfaces/ICoreFunctions.d.ts.map +1 -1
- package/lib/display/AnimatedSprite.d.ts +1 -1
- package/lib/display/AnimatedSprite.d.ts.map +1 -1
- package/lib/display/Container.d.ts.map +1 -1
- package/lib/display/SpineAnimation.d.ts +1 -1
- package/lib/display/SpineAnimation.d.ts.map +1 -1
- package/lib/importOrder.containerFirst.test.d.ts +2 -0
- package/lib/importOrder.containerFirst.test.d.ts.map +1 -0
- package/lib/importOrder.displayFirst.test.d.ts +2 -0
- package/lib/importOrder.displayFirst.test.d.ts.map +1 -0
- package/lib/importOrder.mixinsFirst.test.d.ts +2 -0
- package/lib/importOrder.mixinsFirst.test.d.ts.map +1 -0
- package/lib/importOrder.sceneFirst.test.d.ts +2 -0
- package/lib/importOrder.sceneFirst.test.d.ts.map +1 -0
- package/lib/importOrder.toastFirst.test.d.ts +2 -0
- package/lib/importOrder.toastFirst.test.d.ts.map +1 -0
- package/lib/importOrder.uiFirst.test.d.ts +2 -0
- package/lib/importOrder.uiFirst.test.d.ts.map +1 -0
- package/lib/mixins/factory/Factory.d.ts +1 -1
- package/lib/mixins/factory/Factory.d.ts.map +1 -1
- package/lib/mixins/factory/Factory.test.d.ts +1 -0
- package/lib/mixins/factory/Factory.test.d.ts.map +1 -0
- package/lib/mixins/factory/const.d.ts +9 -2
- package/lib/mixins/factory/const.d.ts.map +1 -1
- package/lib/mixins/factory/defaults.d.ts +5 -0
- package/lib/mixins/factory/defaults.d.ts.map +1 -0
- package/lib/mixins/factory/methods.d.ts +1 -1
- package/lib/mixins/factory/methods.d.ts.map +1 -1
- package/lib/mixins/factory/props.d.ts +4 -2
- package/lib/mixins/factory/props.d.ts.map +1 -1
- package/lib/plugins/PopupManagerPlugin.d.ts +1 -1
- package/lib/plugins/PopupManagerPlugin.d.ts.map +1 -1
- package/lib/plugins/ResizerPlugin.d.ts +29 -0
- package/lib/plugins/ResizerPlugin.d.ts.map +1 -1
- package/lib/plugins/ResizerPlugin.test.d.ts +2 -0
- package/lib/plugins/ResizerPlugin.test.d.ts.map +1 -0
- package/lib/plugins/WebEventsPlugin.d.ts +5 -0
- package/lib/plugins/WebEventsPlugin.d.ts.map +1 -1
- package/lib/plugins/WebEventsPlugin.test.d.ts +2 -0
- package/lib/plugins/WebEventsPlugin.test.d.ts.map +1 -0
- package/lib/plugins/captions/CaptionsRenderer.d.ts +1 -1
- package/lib/plugins/captions/CaptionsRenderer.d.ts.map +1 -1
- package/lib/plugins/i18nPlugin.d.ts +29 -3
- package/lib/plugins/i18nPlugin.d.ts.map +1 -1
- package/lib/plugins/i18nPlugin.test.d.ts +2 -0
- package/lib/plugins/i18nPlugin.test.d.ts.map +1 -0
- package/lib/plugins/input/touch/VirtualControls.d.ts.map +1 -1
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts +0 -1
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts.map +1 -1
- package/lib/{registries-aN0y0Xha.js → registries-BLrxALZ0.js} +1124 -2801
- package/lib/registries-BLrxALZ0.js.map +1 -0
- package/lib/ui/Button.d.ts +1 -1
- package/lib/ui/Button.d.ts.map +1 -1
- package/lib/ui/FlexContainer.d.ts +1 -1
- package/lib/ui/FlexContainer.d.ts.map +1 -1
- package/lib/ui/Input.d.ts +2 -2
- package/lib/ui/Input.d.ts.map +1 -1
- package/lib/ui/Joystick.d.ts +1 -1
- package/lib/ui/Joystick.d.ts.map +1 -1
- package/lib/ui/Toast.d.ts +1 -1
- package/lib/ui/Toast.d.ts.map +1 -1
- package/lib/ui/UICanvas.d.ts +11 -1
- package/lib/ui/UICanvas.d.ts.map +1 -1
- package/lib/ui/UICanvas.test.d.ts +2 -0
- package/lib/ui/UICanvas.test.d.ts.map +1 -0
- package/lib/utils/types.d.ts +1 -2
- package/lib/utils/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/Application.ts +15 -2
- package/src/core/interfaces/IApplicationOptions.ts +1 -1
- package/src/core/interfaces/ICoreFunctions.ts +1 -0
- package/src/display/AnimatedSprite.ts +2 -1
- package/src/display/Container.ts +3 -1
- package/src/display/SpineAnimation.ts +3 -2
- package/src/importOrder.containerFirst.test.ts +32 -0
- package/src/importOrder.displayFirst.test.ts +19 -0
- package/src/importOrder.mixinsFirst.test.ts +18 -0
- package/src/importOrder.sceneFirst.test.ts +21 -0
- package/src/importOrder.toastFirst.test.ts +20 -0
- package/src/importOrder.uiFirst.test.ts +24 -0
- package/src/mixins/factory/Factory.test.ts +22 -0
- package/src/mixins/factory/Factory.ts +9 -2
- package/src/mixins/factory/const.ts +18 -11
- package/src/mixins/factory/defaults.ts +28 -0
- package/src/mixins/factory/methods.ts +1 -1
- package/src/mixins/factory/props.ts +5 -3
- package/src/plugins/LookupPlugin.ts +1 -1
- package/src/plugins/PopupManagerPlugin.ts +1 -1
- package/src/plugins/ResizerPlugin.test.ts +84 -0
- package/src/plugins/ResizerPlugin.ts +59 -1
- package/src/plugins/WebEventsPlugin.test.ts +75 -0
- package/src/plugins/WebEventsPlugin.ts +15 -0
- package/src/plugins/captions/CaptionsRenderer.ts +1 -1
- package/src/plugins/i18nPlugin.test.ts +124 -0
- package/src/plugins/i18nPlugin.ts +57 -18
- package/src/plugins/input/keyboard/KeyboardContols.ts +1 -1
- package/src/plugins/input/touch/VirtualControls.ts +2 -2
- package/src/plugins/spine/pixi-spine/require-shim.ts +3 -1
- package/src/ui/Button.ts +5 -1
- package/src/ui/FlexContainer.ts +3 -2
- package/src/ui/Input.ts +5 -2
- package/src/ui/Joystick.ts +1 -1
- package/src/ui/Toast.ts +2 -1
- package/src/ui/Toaster.ts +1 -1
- package/src/ui/UICanvas.test.ts +35 -0
- package/src/ui/UICanvas.ts +46 -8
- package/src/utils/types.ts +1 -1
- package/src/version.ts +1 -1
- package/lib/CaptionsPlugin-DeGyPecB.js.map +0 -1
- package/lib/registries-aN0y0Xha.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { H as e, Ht as t, Wt as n, r } from "./registries-BLrxALZ0.js";
|
|
2
2
|
import { Ticker as i, UPDATE_PRIORITY as a } from "pixi.js";
|
|
3
3
|
//#endregion
|
|
4
4
|
//#region src/plugins/StatsPlugin.ts
|
|
5
|
-
var o = /* @__PURE__ */
|
|
5
|
+
var o = /* @__PURE__ */ n((/* @__PURE__ */ t(((e, t) => {
|
|
6
6
|
(function(n, r) {
|
|
7
7
|
typeof e == "object" && t !== void 0 ? t.exports = r() : typeof define == "function" && define.amd ? define(r) : n.Stats = r();
|
|
8
8
|
})(e, function() {
|
|
@@ -61,10 +61,10 @@ var o = /* @__PURE__ */ t((/* @__PURE__ */ r(((e, t) => {
|
|
|
61
61
|
super(...e), this.id = "StatsPlugin";
|
|
62
62
|
}
|
|
63
63
|
async initialize() {
|
|
64
|
-
this.stats = new o.default(), this.stats.dom.id = "stats",
|
|
64
|
+
this.stats = new o.default(), this.stats.dom.id = "stats", r.containerElement?.appendChild(this.stats.dom), this.stats.dom.style.position = "absolute", this.stats.dom.style.top = "auto", this.stats.dom.style.bottom = "0", this.stats.dom.style.right = "0", this.stats.dom.style.left = "auto", i.shared.add(this.stats.update, this.stats, a.UTILITY);
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
67
|
//#endregion
|
|
68
68
|
export { s as StatsPlugin };
|
|
69
69
|
|
|
70
|
-
//# sourceMappingURL=StatsPlugin-
|
|
70
|
+
//# sourceMappingURL=StatsPlugin-vZQRm6wh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatsPlugin-
|
|
1
|
+
{"version":3,"file":"StatsPlugin-vZQRm6wh.js","names":[],"sources":["../../../node_modules/.pnpm/stats.js@0.17.0/node_modules/stats.js/build/stats.min.js","../src/plugins/StatsPlugin.ts"],"sourcesContent":["// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","import { Ticker, UPDATE_PRIORITY } from 'pixi.js';\nimport Stats from 'stats.js';\nimport { Application } from '../core/Application';\nimport { Plugin } from './Plugin';\n\nexport class StatsPlugin extends Plugin {\n public readonly id = 'StatsPlugin';\n public stats: Stats;\n\n public async initialize() {\n this.stats = new Stats();\n this.stats.dom.id = 'stats';\n\n Application.containerElement?.appendChild(this.stats.dom);\n\n this.stats.dom.style.position = 'absolute';\n this.stats.dom.style.top = 'auto';\n this.stats.dom.style.bottom = '0';\n this.stats.dom.style.right = '0';\n this.stats.dom.style.left = 'auto';\n\n Ticker.shared.add(this.stats.update, this.stats, UPDATE_PRIORITY.UTILITY);\n }\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Dt as e, H as t, K as n } from "./registries-BLrxALZ0.js";
|
|
2
2
|
//#region src/plugins/audio/VoiceOverPlugin.ts
|
|
3
|
-
var r = class extends
|
|
3
|
+
var r = class extends t {
|
|
4
4
|
constructor(...e) {
|
|
5
5
|
super(...e), this.id = "voiceover", this.fadeOutDuration = .15, this.debug = !1, this.onVoiceOverStart = new n(), this.onVoiceOverPaused = new n(), this.onVoiceOverComplete = new n(), this.onVoiceOverResumed = new n(), this.onVoiceOverStopped = new n(), this._queue = [], this._pausedQueue = [], this._paused = !1;
|
|
6
6
|
}
|
|
@@ -16,21 +16,21 @@ var r = class extends e {
|
|
|
16
16
|
async initialize() {
|
|
17
17
|
this.app.actions("pause").connect(this.onPause), this.app.actions("unpause").connect(this.onResume), this.app.scenes.onSceneChangeStart.connect(this.stopVO);
|
|
18
18
|
}
|
|
19
|
-
async playVO(
|
|
20
|
-
Array.isArray(
|
|
19
|
+
async playVO(t, n, r) {
|
|
20
|
+
Array.isArray(t) || (t = [t]);
|
|
21
21
|
let i = 0, a = "override", o = "";
|
|
22
22
|
if (typeof n == "function") r = n;
|
|
23
23
|
else if (typeof n == "object") {
|
|
24
|
-
let
|
|
25
|
-
i =
|
|
24
|
+
let e = n;
|
|
25
|
+
i = e.priority ?? 0, r = e.callback, a = e.mode ?? "override", e.localized && (o = this.app.i18n.locale, t = t.map((e) => `${e}_${o}`));
|
|
26
26
|
}
|
|
27
|
-
if (typeof n == "string" && (a = n), this._paused = !1,
|
|
28
|
-
else if (this._queue.length === 0 || a === "override" && i >= this._queue[0].priority || a === "new" && i > this._queue[0].priority) return await this.stopVO(), this.addToQueue(
|
|
29
|
-
else a === "append" ? this.addToQueue(
|
|
27
|
+
if (typeof n == "string" && (a = n), this._paused = !1, t.length === 1 && this._queue.length === 1 && this._queue[0].key === t[0]) e.warn(`🔇 Skipped VO ${t[0]} because it is already playing`), r && r(!1);
|
|
28
|
+
else if (this._queue.length === 0 || a === "override" && i >= this._queue[0].priority || a === "new" && i > this._queue[0].priority) return await this.stopVO(), this.addToQueue(t, r, i), this.playNext();
|
|
29
|
+
else a === "append" ? this.addToQueue(t, r, i) : r ? (e.warn(`🎟🔇 Firing callback without playing VO(s) ${t.join(", ")}`), r(!1)) : e.warn(`🔇 Skipped VO(s) ${t.join(", ")} because it is lower priority than what was already playing`);
|
|
30
30
|
}
|
|
31
31
|
async stopVO() {
|
|
32
|
-
let
|
|
33
|
-
this._queue.splice(0, this._queue.length), this._pausedQueue.splice(0, this._pausedQueue.length), n?.timeout?.kill(),
|
|
32
|
+
let t = this.activeVO, n = this._queue[0];
|
|
33
|
+
this._queue.splice(0, this._queue.length), this._pausedQueue.splice(0, this._pausedQueue.length), n?.timeout?.kill(), t ? t.media ? t.isPlaying ? (e.log(`🤫 Fading out VO ${t.id} (duration:${this.fadeOutDuration})`), await t.fadeTo(0, this.fadeOutDuration), t.stop()) : t.stop() : (e.warn(`🛑 Stopping VO %c%s%c while it is still loading ${t.id}`), t.remove()) : (e.warn("🛑 No active VO to stop"), this.activeTimeout?.kill()), this.clearSignalConnections(), this._paused = !1, this.onVoiceOverStopped.emit(t);
|
|
34
34
|
}
|
|
35
35
|
pauseVO() {
|
|
36
36
|
if (!this._paused && this._queue.length > 0) {
|
|
@@ -55,32 +55,32 @@ var r = class extends e {
|
|
|
55
55
|
"onVoiceOverStopped"
|
|
56
56
|
];
|
|
57
57
|
}
|
|
58
|
-
addToQueue(
|
|
59
|
-
for (let i = 0; i <
|
|
60
|
-
let a =
|
|
61
|
-
typeof a == "number" ?
|
|
58
|
+
addToQueue(t, n, r) {
|
|
59
|
+
for (let i = 0; i < t.length; i++) {
|
|
60
|
+
let a = t[i];
|
|
61
|
+
typeof a == "number" ? e.log(`➕ Queueing delay ${a}`) : e.log(`➕ Queueing VO ${a}`), this._queue.push({
|
|
62
62
|
key: typeof a == "string" ? a : "",
|
|
63
63
|
delay: typeof a == "number" ? a : void 0,
|
|
64
|
-
callback: i ===
|
|
64
|
+
callback: i === t.length - 1 ? n : void 0,
|
|
65
65
|
priority: r
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
let i =
|
|
69
|
-
|
|
68
|
+
let i = t.filter((e) => typeof e == "string");
|
|
69
|
+
e.log(`📂 Loading VO(s) ${i.join(", ")}`), this.app.audio.load(i, "voiceover");
|
|
70
70
|
}
|
|
71
71
|
async playNext() {
|
|
72
72
|
if (this._queue.length > 0) {
|
|
73
|
-
let
|
|
74
|
-
if (
|
|
75
|
-
if (this.activeTimeout?.kill(), this._queue.length === 1) return
|
|
76
|
-
|
|
73
|
+
let t = this._queue[0];
|
|
74
|
+
if (t.delay !== void 0) {
|
|
75
|
+
if (this.activeTimeout?.kill(), this._queue.length === 1) return e.log("⌛ Skipping delay because there are no more items in queue"), this._queue.shift(), t.callback && t.callback(!0), this.playNext();
|
|
76
|
+
e.log("⏳ Waiting %s seconds before next VO", t.delay), t.timeout = gsap.delayedCall(t.delay, () => (this._queue.shift(), t.callback && t.callback(!0), this.playNext()));
|
|
77
77
|
} else {
|
|
78
|
-
let n = this.app.audio.getAudioInstance(
|
|
79
|
-
n ? n.isPlaying && (
|
|
80
|
-
let r = await this.app.audio.play(
|
|
81
|
-
return this.activeVO && this.onVoiceOverStart.emit(this.activeVO), this._queue[0] ===
|
|
78
|
+
let n = this.app.audio.getAudioInstance(t.key, "voiceover");
|
|
79
|
+
n ? n.isPlaying && (e.warn("🛑 Stopping VO %c%s%c (no fade out)", n.id), n.stop(), this.onVoiceOverComplete.emit(n)) : e.log("📂 Loading VO %c%s%c", t.key);
|
|
80
|
+
let r = await this.app.audio.play(t.key, "voiceover", { singleInstance: !0 });
|
|
81
|
+
return this.activeVO && this.onVoiceOverStart.emit(this.activeVO), this._queue[0] === t ? (e.log(`▶️▶️ Playing VO ${t.key}`), e.log("ℹ️ Queue length:", this._queue.length), this.activeVO ? this.addSignalConnection(this.activeVO.onEnd.connectOnce(this._handleActiveVOEnded), this.activeVO.onPaused.connectOnce(this._handleActiveVOPaused), this.activeVO.onResumed.connectOnce(this._handleActiveVOResumed), this.activeVO.onStart.connectOnce(this._handleActiveVOStarted)) : (e.error("⚠️ Vo %c%s%c completed early (did not play?)", t.key), this._handleActiveVOEndedWithoutPlaying(r)), r) : void 0;
|
|
82
82
|
}
|
|
83
|
-
} else
|
|
83
|
+
} else e.log("✅ Nothing left in queue");
|
|
84
84
|
}
|
|
85
85
|
_handleActiveVOStarted(e) {
|
|
86
86
|
this.onVoiceOverStart.emit(this.activeVO || e);
|
|
@@ -97,18 +97,18 @@ var r = class extends e {
|
|
|
97
97
|
_handleActiveVOEnded(e) {
|
|
98
98
|
this.onVoiceOverComplete.emit(this.activeVO || e), this.activeTimeout?.kill(), this._currentItemCallback(), this._queue.shift(), this.playNext();
|
|
99
99
|
}
|
|
100
|
-
_currentItemCallback(
|
|
100
|
+
_currentItemCallback(t = !0) {
|
|
101
101
|
let n = this._queue[0];
|
|
102
|
-
n && (
|
|
102
|
+
n && (e.log(`🏁 Completed VO ${n.key}`), n.callback && (e.log("'🎟 Firing callback for", n.key), n.callback(t)));
|
|
103
103
|
}
|
|
104
104
|
onPause() {
|
|
105
|
-
this.activeVO !== void 0 && this.activeVO.isPlaying && (
|
|
105
|
+
this.activeVO !== void 0 && this.activeVO.isPlaying && (e.log("⏸ Pausing VO", this.activeVO.id), this.activeVO.pause(), this.onVoiceOverComplete.emit(this.activeVO)), this.activeTimeout?.pause();
|
|
106
106
|
}
|
|
107
107
|
onResume() {
|
|
108
|
-
this.activeVO !== void 0 && !this.activeVO.isPlaying && (
|
|
108
|
+
this.activeVO !== void 0 && !this.activeVO.isPlaying && (e.log("⏯ Resuming VO", this.activeVO.id), this.activeVO.resume(), this.onVoiceOverStart.emit(this.activeVO)), this.activeTimeout?.resume();
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
//#endregion
|
|
112
112
|
export { r as VoiceOverPlugin };
|
|
113
113
|
|
|
114
|
-
//# sourceMappingURL=VoiceOverPlugin-
|
|
114
|
+
//# sourceMappingURL=VoiceOverPlugin-KlZdGj1G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceOverPlugin-BLSbq3DU.js","names":[],"sources":["../src/plugins/audio/VoiceOverPlugin.ts"],"sourcesContent":["import { Signal } from '../../signals';\nimport { Logger } from '../../utils';\nimport type { IPlugin } from '../Plugin';\nimport { Plugin } from '../Plugin';\nimport { IAudioInstance } from './AudioInstance';\n\nexport type PlayMode = 'append' | 'override' | 'new';\nexport type VoCallback = (didPlay: boolean) => void;\nexport type VoKey = string | number;\n\nexport type Caption = {\n id: string;\n args?: { [key: string]: string };\n};\n\nexport interface IPlayVoiceOverOptions {\n mode?: PlayMode;\n priority?: number;\n callback?: VoCallback;\n localized?: boolean;\n}\n\ninterface IQueueItem extends IPlayVoiceOverOptions {\n key: string;\n delay?: number;\n timeout?: gsap.core.Tween;\n}\n\nexport interface IVoiceOverPlugin extends IPlugin {\n fadeOutDuration: number;\n debug: boolean;\n onVoiceOverStart: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverPaused: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverResumed: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverComplete: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverStopped: Signal<(instance?: IAudioInstance) => void>;\n paused: boolean;\n\n playVO(key: VoKey | VoKey[], mode?: PlayMode, callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], options?: IPlayVoiceOverOptions): Promise<IAudioInstance>;\n\n stopVO(): Promise<void>;\n\n pauseVO(): void;\n\n resumeVO(): void;\n}\n\nexport class VoiceOverPlugin extends Plugin implements IVoiceOverPlugin {\n public readonly id = 'voiceover';\n public fadeOutDuration = 0.15;\n public debug = false;\n public onVoiceOverStart: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverPaused: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverComplete: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverResumed: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverStopped: Signal<(instance?: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n private readonly _queue: IQueueItem[] = [];\n private readonly _pausedQueue: IQueueItem[] = [];\n private _paused: boolean = false;\n\n get paused() {\n return this._paused;\n }\n\n get activeTimeout(): gsap.core.Tween | undefined {\n return this._queue[0]?.timeout;\n }\n\n get activeVO(): IAudioInstance | undefined {\n if (this._queue.length > 0 && this._queue[0].key) {\n return this.app.audio.getAudioInstance(this._queue[0].key, 'voiceover') as IAudioInstance | undefined;\n }\n return undefined;\n }\n\n async initialize() {\n this.app.actions('pause').connect(this.onPause);\n this.app.actions('unpause').connect(this.onResume);\n this.app.scenes.onSceneChangeStart.connect(this.stopVO);\n }\n\n playVO(key: VoKey | VoKey[], mode?: PlayMode, callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], options?: IPlayVoiceOverOptions): Promise<IAudioInstance>;\n\n async playVO(\n key: VoKey | VoKey[],\n modeOrCallbackOrOptions?: PlayMode | VoCallback | IPlayVoiceOverOptions,\n callback?: VoCallback,\n ): Promise<IAudioInstance | void> {\n if (!Array.isArray(key)) {\n key = [key];\n }\n\n let priority = 0;\n let mode: string | undefined = 'override';\n let locale: string = '';\n\n if (typeof modeOrCallbackOrOptions === 'function') {\n callback = modeOrCallbackOrOptions;\n } else if (typeof modeOrCallbackOrOptions === 'object') {\n const modeAsOptions = modeOrCallbackOrOptions as IPlayVoiceOverOptions;\n priority = modeAsOptions.priority ?? 0;\n callback = modeAsOptions.callback;\n mode = modeAsOptions.mode ?? 'override';\n if (modeAsOptions.localized) {\n locale = this.app.i18n.locale;\n key = key.map((k) => `${k}_${locale}`);\n }\n }\n\n if (typeof modeOrCallbackOrOptions === 'string') {\n mode = modeOrCallbackOrOptions;\n }\n this._paused = false;\n if (key.length === 1 && this._queue.length === 1 && this._queue[0].key === key[0]) {\n Logger.warn(`🔇 Skipped VO ${key[0]} because it is already playing`);\n if (callback) {\n callback(false);\n }\n } else if (\n this._queue.length === 0 ||\n (mode === 'override' && priority >= this._queue[0].priority!) ||\n (mode === 'new' && priority > this._queue[0].priority!)\n ) {\n await this.stopVO();\n this.addToQueue(key, callback, priority);\n return this.playNext();\n } else if (mode === 'append') {\n this.addToQueue(key, callback, priority);\n } else if (callback) {\n Logger.warn(`🎟🔇 Firing callback without playing VO(s) ${key.join(', ')}`);\n callback(false);\n } else {\n Logger.warn(`🔇 Skipped VO(s) ${key.join(', ')} because it is lower priority than what was already playing`);\n }\n }\n\n public async stopVO(): Promise<void> {\n const activeVO: IAudioInstance | undefined = this.activeVO;\n const activeItem: IQueueItem | undefined = this._queue[0];\n this._queue.splice(0, this._queue.length);\n this._pausedQueue.splice(0, this._pausedQueue.length);\n activeItem?.timeout?.kill();\n if (activeVO) {\n if (!activeVO.media) {\n Logger.warn(`🛑 Stopping VO %c%s%c while it is still loading ${activeVO.id}`);\n activeVO.remove();\n } else if (activeVO.isPlaying) {\n Logger.log(`🤫 Fading out VO ${activeVO.id} (duration:${this.fadeOutDuration})`);\n await activeVO.fadeTo(0, this.fadeOutDuration);\n activeVO.stop();\n } else {\n activeVO.stop();\n }\n } else {\n Logger.warn('🛑 No active VO to stop');\n this.activeTimeout?.kill();\n }\n this.clearSignalConnections();\n this._paused = false;\n this.onVoiceOverStopped.emit(activeVO);\n }\n\n pauseVO() {\n if (this._paused) return;\n if (this._queue.length > 0) {\n this._paused = true;\n this._pausedQueue.push(...this._queue);\n const activeVO = this.activeVO;\n const activeTimeout = this.activeTimeout;\n activeVO?.pause();\n activeTimeout?.pause();\n this._queue.splice(0, this._queue.length);\n }\n }\n\n resumeVO() {\n if (!this._paused) return;\n this._paused = false;\n if (this._pausedQueue.length > 0) {\n this._queue.push(...this._pausedQueue);\n this._pausedQueue.splice(0, this._pausedQueue.length);\n const activeVO = this.activeVO;\n const activeTimeout = this.activeTimeout;\n activeVO?.resume();\n activeTimeout?.resume();\n if (activeVO) {\n this.onVoiceOverStart.emit(activeVO);\n }\n }\n }\n\n protected getCoreSignals(): string[] {\n return ['onVoiceOverStart', 'onVoiceOverPaused', 'onVoiceOverComplete', 'onVoiceOverResumed', 'onVoiceOverStopped'];\n }\n\n private addToQueue(keys: VoKey[], cb?: VoCallback, priority?: number) {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (typeof key === 'number') {\n Logger.log(`➕ Queueing delay ${key}`);\n } else {\n Logger.log(`➕ Queueing VO ${key}`);\n }\n\n this._queue.push({\n key: typeof key === 'string' ? key : '',\n delay: typeof key === 'number' ? key : undefined,\n callback: i === keys.length - 1 ? cb : undefined,\n priority,\n });\n }\n const toLoad = keys.filter((it) => typeof it === 'string') as string[];\n Logger.log(`📂 Loading VO(s) ${toLoad.join(', ')}`);\n this.app.audio.load(toLoad, 'voiceover');\n }\n\n private async playNext(): Promise<IAudioInstance | void> {\n if (this._queue.length > 0) {\n const item = this._queue[0];\n if (item.delay !== undefined) {\n this.activeTimeout?.kill();\n if (this._queue.length === 1) {\n // skip delay if last item in queue\n Logger.log('⌛ Skipping delay because there are no more items in queue');\n this._queue.shift();\n if (item.callback) {\n item.callback(true);\n }\n return this.playNext();\n } else {\n Logger.log('⏳ Waiting %s seconds before next VO', item.delay);\n item.timeout = gsap.delayedCall(item.delay, () => {\n this._queue.shift();\n if (item.callback) {\n item.callback(true);\n }\n return this.playNext();\n });\n }\n } else {\n const existing = this.app.audio.getAudioInstance(item.key, 'voiceover');\n if (existing) {\n if (existing.isPlaying) {\n Logger.warn('🛑 Stopping VO %c%s%c (no fade out)', existing.id);\n existing.stop();\n this.onVoiceOverComplete.emit(existing);\n }\n } else {\n Logger.log('📂 Loading VO %c%s%c', item.key);\n }\n const instance = await this.app.audio.play(item.key, 'voiceover', { singleInstance: true });\n if (this.activeVO) {\n this.onVoiceOverStart.emit(this.activeVO);\n }\n if (this._queue[0] !== item) {\n return;\n }\n Logger.log(`▶️▶️ Playing VO ${item.key}`);\n Logger.log('ℹ️ Queue length:', this._queue.length);\n\n if (this.activeVO) {\n this.addSignalConnection(\n this.activeVO.onEnd.connectOnce(this._handleActiveVOEnded),\n this.activeVO.onPaused.connectOnce(this._handleActiveVOPaused),\n this.activeVO.onResumed.connectOnce(this._handleActiveVOResumed),\n this.activeVO.onStart.connectOnce(this._handleActiveVOStarted),\n );\n } else {\n Logger.error('⚠️ Vo %c%s%c completed early (did not play?)', item.key);\n this._handleActiveVOEndedWithoutPlaying(instance);\n }\n return instance;\n }\n } else {\n Logger.log('✅ Nothing left in queue');\n }\n }\n\n private _handleActiveVOStarted(instance: IAudioInstance) {\n this.onVoiceOverStart.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOPaused(instance: IAudioInstance) {\n this.onVoiceOverPaused.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOResumed(instance: IAudioInstance) {\n this.onVoiceOverResumed.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOEndedWithoutPlaying(instance: IAudioInstance) {\n this.onVoiceOverComplete.emit(this.activeVO || instance);\n this.activeTimeout?.kill();\n this._currentItemCallback(false);\n this._queue.shift();\n this.playNext();\n }\n\n private _handleActiveVOEnded(instance: IAudioInstance) {\n this.onVoiceOverComplete.emit(this.activeVO || instance);\n this.activeTimeout?.kill();\n this._currentItemCallback();\n this._queue.shift();\n this.playNext();\n }\n\n private _currentItemCallback(didPlay: boolean = true) {\n const item = this._queue[0];\n if (!item) {\n return;\n }\n Logger.log(`🏁 Completed VO ${item.key}`);\n if (item.callback) {\n Logger.log(`'🎟 Firing callback for`, item.key);\n item.callback(didPlay);\n }\n }\n\n private onPause() {\n if (this.activeVO !== undefined && this.activeVO.isPlaying) {\n Logger.log('⏸ Pausing VO', this.activeVO.id);\n this.activeVO.pause();\n this.onVoiceOverComplete.emit(this.activeVO);\n }\n this.activeTimeout?.pause();\n }\n\n private onResume() {\n if (this.activeVO !== undefined && !this.activeVO.isPlaying) {\n Logger.log('⏯ Resuming VO', this.activeVO.id);\n this.activeVO.resume();\n this.onVoiceOverStart.emit(this.activeVO);\n }\n this.activeTimeout?.resume();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VoiceOverPlugin-KlZdGj1G.js","names":[],"sources":["../src/plugins/audio/VoiceOverPlugin.ts"],"sourcesContent":["import { Signal } from '../../signals';\nimport { Logger } from '../../utils';\nimport type { IPlugin } from '../Plugin';\nimport { Plugin } from '../Plugin';\nimport { IAudioInstance } from './AudioInstance';\n\nexport type PlayMode = 'append' | 'override' | 'new';\nexport type VoCallback = (didPlay: boolean) => void;\nexport type VoKey = string | number;\n\nexport type Caption = {\n id: string;\n args?: { [key: string]: string };\n};\n\nexport interface IPlayVoiceOverOptions {\n mode?: PlayMode;\n priority?: number;\n callback?: VoCallback;\n localized?: boolean;\n}\n\ninterface IQueueItem extends IPlayVoiceOverOptions {\n key: string;\n delay?: number;\n timeout?: gsap.core.Tween;\n}\n\nexport interface IVoiceOverPlugin extends IPlugin {\n fadeOutDuration: number;\n debug: boolean;\n onVoiceOverStart: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverPaused: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverResumed: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverComplete: Signal<(instance: IAudioInstance) => void>;\n onVoiceOverStopped: Signal<(instance?: IAudioInstance) => void>;\n paused: boolean;\n\n playVO(key: VoKey | VoKey[], mode?: PlayMode, callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], options?: IPlayVoiceOverOptions): Promise<IAudioInstance>;\n\n stopVO(): Promise<void>;\n\n pauseVO(): void;\n\n resumeVO(): void;\n}\n\nexport class VoiceOverPlugin extends Plugin implements IVoiceOverPlugin {\n public readonly id = 'voiceover';\n public fadeOutDuration = 0.15;\n public debug = false;\n public onVoiceOverStart: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverPaused: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverComplete: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverResumed: Signal<(instance: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n public onVoiceOverStopped: Signal<(instance?: IAudioInstance) => void> = new Signal<\n (instance: IAudioInstance) => void\n >();\n private readonly _queue: IQueueItem[] = [];\n private readonly _pausedQueue: IQueueItem[] = [];\n private _paused: boolean = false;\n\n get paused() {\n return this._paused;\n }\n\n get activeTimeout(): gsap.core.Tween | undefined {\n return this._queue[0]?.timeout;\n }\n\n get activeVO(): IAudioInstance | undefined {\n if (this._queue.length > 0 && this._queue[0].key) {\n return this.app.audio.getAudioInstance(this._queue[0].key, 'voiceover') as IAudioInstance | undefined;\n }\n return undefined;\n }\n\n async initialize() {\n this.app.actions('pause').connect(this.onPause);\n this.app.actions('unpause').connect(this.onResume);\n this.app.scenes.onSceneChangeStart.connect(this.stopVO);\n }\n\n playVO(key: VoKey | VoKey[], mode?: PlayMode, callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], callback?: VoCallback): Promise<IAudioInstance>;\n\n playVO(key: VoKey | VoKey[], options?: IPlayVoiceOverOptions): Promise<IAudioInstance>;\n\n async playVO(\n key: VoKey | VoKey[],\n modeOrCallbackOrOptions?: PlayMode | VoCallback | IPlayVoiceOverOptions,\n callback?: VoCallback,\n ): Promise<IAudioInstance | void> {\n if (!Array.isArray(key)) {\n key = [key];\n }\n\n let priority = 0;\n let mode: string | undefined = 'override';\n let locale: string = '';\n\n if (typeof modeOrCallbackOrOptions === 'function') {\n callback = modeOrCallbackOrOptions;\n } else if (typeof modeOrCallbackOrOptions === 'object') {\n const modeAsOptions = modeOrCallbackOrOptions as IPlayVoiceOverOptions;\n priority = modeAsOptions.priority ?? 0;\n callback = modeAsOptions.callback;\n mode = modeAsOptions.mode ?? 'override';\n if (modeAsOptions.localized) {\n locale = this.app.i18n.locale;\n key = key.map((k) => `${k}_${locale}`);\n }\n }\n\n if (typeof modeOrCallbackOrOptions === 'string') {\n mode = modeOrCallbackOrOptions;\n }\n this._paused = false;\n if (key.length === 1 && this._queue.length === 1 && this._queue[0].key === key[0]) {\n Logger.warn(`🔇 Skipped VO ${key[0]} because it is already playing`);\n if (callback) {\n callback(false);\n }\n } else if (\n this._queue.length === 0 ||\n (mode === 'override' && priority >= this._queue[0].priority!) ||\n (mode === 'new' && priority > this._queue[0].priority!)\n ) {\n await this.stopVO();\n this.addToQueue(key, callback, priority);\n return this.playNext();\n } else if (mode === 'append') {\n this.addToQueue(key, callback, priority);\n } else if (callback) {\n Logger.warn(`🎟🔇 Firing callback without playing VO(s) ${key.join(', ')}`);\n callback(false);\n } else {\n Logger.warn(`🔇 Skipped VO(s) ${key.join(', ')} because it is lower priority than what was already playing`);\n }\n }\n\n public async stopVO(): Promise<void> {\n const activeVO: IAudioInstance | undefined = this.activeVO;\n const activeItem: IQueueItem | undefined = this._queue[0];\n this._queue.splice(0, this._queue.length);\n this._pausedQueue.splice(0, this._pausedQueue.length);\n activeItem?.timeout?.kill();\n if (activeVO) {\n if (!activeVO.media) {\n Logger.warn(`🛑 Stopping VO %c%s%c while it is still loading ${activeVO.id}`);\n activeVO.remove();\n } else if (activeVO.isPlaying) {\n Logger.log(`🤫 Fading out VO ${activeVO.id} (duration:${this.fadeOutDuration})`);\n await activeVO.fadeTo(0, this.fadeOutDuration);\n activeVO.stop();\n } else {\n activeVO.stop();\n }\n } else {\n Logger.warn('🛑 No active VO to stop');\n this.activeTimeout?.kill();\n }\n this.clearSignalConnections();\n this._paused = false;\n this.onVoiceOverStopped.emit(activeVO);\n }\n\n pauseVO() {\n if (this._paused) return;\n if (this._queue.length > 0) {\n this._paused = true;\n this._pausedQueue.push(...this._queue);\n const activeVO = this.activeVO;\n const activeTimeout = this.activeTimeout;\n activeVO?.pause();\n activeTimeout?.pause();\n this._queue.splice(0, this._queue.length);\n }\n }\n\n resumeVO() {\n if (!this._paused) return;\n this._paused = false;\n if (this._pausedQueue.length > 0) {\n this._queue.push(...this._pausedQueue);\n this._pausedQueue.splice(0, this._pausedQueue.length);\n const activeVO = this.activeVO;\n const activeTimeout = this.activeTimeout;\n activeVO?.resume();\n activeTimeout?.resume();\n if (activeVO) {\n this.onVoiceOverStart.emit(activeVO);\n }\n }\n }\n\n protected getCoreSignals(): string[] {\n return ['onVoiceOverStart', 'onVoiceOverPaused', 'onVoiceOverComplete', 'onVoiceOverResumed', 'onVoiceOverStopped'];\n }\n\n private addToQueue(keys: VoKey[], cb?: VoCallback, priority?: number) {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (typeof key === 'number') {\n Logger.log(`➕ Queueing delay ${key}`);\n } else {\n Logger.log(`➕ Queueing VO ${key}`);\n }\n\n this._queue.push({\n key: typeof key === 'string' ? key : '',\n delay: typeof key === 'number' ? key : undefined,\n callback: i === keys.length - 1 ? cb : undefined,\n priority,\n });\n }\n const toLoad = keys.filter((it) => typeof it === 'string') as string[];\n Logger.log(`📂 Loading VO(s) ${toLoad.join(', ')}`);\n this.app.audio.load(toLoad, 'voiceover');\n }\n\n private async playNext(): Promise<IAudioInstance | void> {\n if (this._queue.length > 0) {\n const item = this._queue[0];\n if (item.delay !== undefined) {\n this.activeTimeout?.kill();\n if (this._queue.length === 1) {\n // skip delay if last item in queue\n Logger.log('⌛ Skipping delay because there are no more items in queue');\n this._queue.shift();\n if (item.callback) {\n item.callback(true);\n }\n return this.playNext();\n } else {\n Logger.log('⏳ Waiting %s seconds before next VO', item.delay);\n item.timeout = gsap.delayedCall(item.delay, () => {\n this._queue.shift();\n if (item.callback) {\n item.callback(true);\n }\n return this.playNext();\n });\n }\n } else {\n const existing = this.app.audio.getAudioInstance(item.key, 'voiceover');\n if (existing) {\n if (existing.isPlaying) {\n Logger.warn('🛑 Stopping VO %c%s%c (no fade out)', existing.id);\n existing.stop();\n this.onVoiceOverComplete.emit(existing);\n }\n } else {\n Logger.log('📂 Loading VO %c%s%c', item.key);\n }\n const instance = await this.app.audio.play(item.key, 'voiceover', { singleInstance: true });\n if (this.activeVO) {\n this.onVoiceOverStart.emit(this.activeVO);\n }\n if (this._queue[0] !== item) {\n return;\n }\n Logger.log(`▶️▶️ Playing VO ${item.key}`);\n Logger.log('ℹ️ Queue length:', this._queue.length);\n\n if (this.activeVO) {\n this.addSignalConnection(\n this.activeVO.onEnd.connectOnce(this._handleActiveVOEnded),\n this.activeVO.onPaused.connectOnce(this._handleActiveVOPaused),\n this.activeVO.onResumed.connectOnce(this._handleActiveVOResumed),\n this.activeVO.onStart.connectOnce(this._handleActiveVOStarted),\n );\n } else {\n Logger.error('⚠️ Vo %c%s%c completed early (did not play?)', item.key);\n this._handleActiveVOEndedWithoutPlaying(instance);\n }\n return instance;\n }\n } else {\n Logger.log('✅ Nothing left in queue');\n }\n }\n\n private _handleActiveVOStarted(instance: IAudioInstance) {\n this.onVoiceOverStart.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOPaused(instance: IAudioInstance) {\n this.onVoiceOverPaused.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOResumed(instance: IAudioInstance) {\n this.onVoiceOverResumed.emit(this.activeVO || instance);\n }\n\n private _handleActiveVOEndedWithoutPlaying(instance: IAudioInstance) {\n this.onVoiceOverComplete.emit(this.activeVO || instance);\n this.activeTimeout?.kill();\n this._currentItemCallback(false);\n this._queue.shift();\n this.playNext();\n }\n\n private _handleActiveVOEnded(instance: IAudioInstance) {\n this.onVoiceOverComplete.emit(this.activeVO || instance);\n this.activeTimeout?.kill();\n this._currentItemCallback();\n this._queue.shift();\n this.playNext();\n }\n\n private _currentItemCallback(didPlay: boolean = true) {\n const item = this._queue[0];\n if (!item) {\n return;\n }\n Logger.log(`🏁 Completed VO ${item.key}`);\n if (item.callback) {\n Logger.log(`'🎟 Firing callback for`, item.key);\n item.callback(didPlay);\n }\n }\n\n private onPause() {\n if (this.activeVO !== undefined && this.activeVO.isPlaying) {\n Logger.log('⏸ Pausing VO', this.activeVO.id);\n this.activeVO.pause();\n this.onVoiceOverComplete.emit(this.activeVO);\n }\n this.activeTimeout?.pause();\n }\n\n private onResume() {\n if (this.activeVO !== undefined && !this.activeVO.isPlaying) {\n Logger.log('⏯ Resuming VO', this.activeVO.id);\n this.activeVO.resume();\n this.onVoiceOverStart.emit(this.activeVO);\n }\n this.activeTimeout?.resume();\n }\n}\n"],"mappings":"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"}
|