From af3d32a493bc0068d67132aaa3bf06ef95f910e5 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Thu, 30 May 2024 18:52:28 -0400 Subject: [PATCH] updated to return promise on first click --- packages/superdough/superdough.mjs | 17 ++++++++++------- website/src/repl/Repl.jsx | 13 ++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 777735fe..c882659a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -64,15 +64,18 @@ export async function initAudio(options = {}) { } } } - +let audioReady = false; export async function initAudioOnFirstClick(options) { - return new Promise((resolve) => { - document.addEventListener('click', async function listener() { - await initAudio(options); - resolve(); - document.removeEventListener('click', listener); + if (!audioReady) { + audioReady = new Promise((resolve) => { + document.addEventListener('click', async function listener() { + await initAudio(options); + resolve(); + document.removeEventListener('click', listener); + }); }); - }); + } + return audioReady; } let delays = {}; diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 2dedbd1c..e8e1e8de 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -15,6 +15,7 @@ import { resetGlobalEffects, resetLoadedSounds, isAudioInitialized, + initAudioOnFirstClick, } from '@strudel/webaudio'; import { defaultAudioDeviceName } from '../settings.mjs'; import { getAudioDevices, setAudioDevice } from './util.mjs'; @@ -43,8 +44,10 @@ import { getMetadata } from '../metadata_parser'; const { latestCode } = settingsMap.get(); -let modulesLoading, presets, drawContext, clearCanvas, isIframe; +let modulesLoading, presets, drawContext, clearCanvas, isIframe, audioReady; + if (typeof window !== 'undefined') { + audioReady = initAudioOnFirstClick(); modulesLoading = loadModules(); presets = prebake(); drawContext = getDrawContext(); @@ -83,16 +86,12 @@ export function Repl({ embedded = false }) { onUpdateState: (state) => { setReplState({ ...state }); }, - onToggle: async (playing) => { + onToggle: (playing) => { if (!playing) { clearHydra(); } }, - beforeEval: async () => { - if (!isAudioInitialized()) { - await initAudio(); - } - }, + beforeEval: () => audioReady, afterEval: (all) => { const { code } = all; setLatestCode(code);